Anno Accademico 2007-2008 Corso di Analisi 1 per Ingegneria Elettronica Laboratorio 2 Calcolo simbolico, limiti e derivate. Metodo di Newton. 1 Introduzione al Toolbox simbolico Con le routines del Symbolic Math Toolboxes è possibile utilizzare Matlab con una sintassi molto simile alla simbologia dell’analisi. É possibile definire variabili simboliche con il comando sym: >>x=sym(’x’) o anche specificando il tipo di variabile: >>x=sym(’x’,’real’) Si possono usare, con lo stesso effetto, i comandi >>syms x >>syms x real Ora possiamo definire funzioni con queste variabili simboliche: >>f=xˆ2-2*x+1 Digitando whos osserviamo che abbiamo creato due sym object. Per ottenere una visualizzazione più leggibile delle funzioni inserite si può utilizzare il comando pretty: >>pretty(f) x2 -2x+ 1 Il comando subs serve per la sostituzione simbolica, cioè per assegnare un valore ad una variabile simbolica. Supponiamo di voler valutare la funzione f definita precedentemente per x = 1: possiamo utilizzare il comando subs in due modi • >>subs(f,1) • >>subs(f,’x’,1) 1 2 Grafici di funzioni, limiti, derivate Definiamo la variabile simbolica x e la seguente funzione: f (x) = 2x2 −1 x2 con i seguenti comandi: >>x=sym(’x’;) >>f=2*xˆ2/(xˆ2-1) È possibile disegnare il grafico di questa funzione senza doverla valutare in un numero discreto di punti, usando il comando ezplot >>ezplot(f) che disegna la funzione sull’intervallo standard [−2π, 2π]; altrimenti si può specificare l’intervallo: >>ezplot(f,[-5,5]) Dopo avere definito la variabile simbolica e una funzione possiamo calcolare i limiti con il comando limit. Definiamo f (x) = tan(x), e calcoliamo il limite per x → π/2: >>limit(f,x,pi/2) Con Matlab possiamo calcolare il limite sinistro e destro: >>limit(f,x,pi/2,’left’) ans= inf >>limit(f,x,pi/2,’right’) ans= -inf e anche il limite per x → ∞, digitando limit(f,x,inf). Inoltre con il comando diff possiamo calcolare le derivate di funzioni, ad esempio possiamo calcolare la derivata della tangente, definita nell’esercizio precedente: >>fx=diff(f,x) fx= 1+tan(x)ˆ2 3 Il metodo di Newton Il metodo di Newton è un metodo iterativo per la ricerca degli zeri di una funzione che costruisce una successione di valori x(n) approssimando localmente la funzione con la sua retta tangente: a partire da un valore iniziale x(0) si costruisce la retta tangente in quel punto, e si calcola il punto x(1) in cui tale retta interseca l’asse y = 0, quindi si costruisce la retta tangente in x(1) e si itera. L’espressione della retta tangente in un punto x(n) a f è la seguente: 2 Figura 1: Alcune iterazioni del metodo di Newton y(x) = f (x(n) ) + f 0 (x(n) )(x − x(n) ) (1) Cerchiamo il valore di x per cui la retta tangente interseca l’asse y = 0, quindi poniamo y = 0 e otteniamo la successiva approssimazione della soluzione, x(n+1) : x(n+1) = x(n) − f (x(n) ) f 0 (x(n) ) (2) purchè f 0 (x(n) ) 6= 0. La 2 è l’espressione di un’iterazione generica del metodo di Newton. È necessario stabilire un criterio d’arresto che decida quando la soluzione è stata approssimata con la precisione desiderata. Esistono diverse scelte: • criterio basato sul residuo • confronto fra due iterazioni successive Il criterio basato sul residuo arresta il metodo quando il modulo del residuo f (x(n) ) è inferiore ad una tolleranza fissata: |f (x(n) )| ≤ toll Si può anche arrestare il metodo quando la distanza fra x(n+1) ed x(n) è inferiore ad una tolleranza fissata: |x(n+1)−x (n) | ≤ toll Approfondimento: validità del criterio d’arresto Osservando la figura 2 si nota che entrambi i criteri di arresto possono fallire. Nella situazione a) in cui f 0 (xe ) << 1 il test sul residuo non è adeguato, infatti f (x(n) ) può essere molto basso con x(n) lontano dalla soluzione. Nella situazione b) in cui f 0 (xe ) >> 1 invece due iterazioni successive possono essere vicine con f (x(n) ) ancora molto diverso da 0. 3 Figura 2: Confronto fra i criteri d’arresto Figura 3: Algoritmo Scriviamo una funzione che implementi il metodo di Newton sfruttando le funzioni del Toolbox simbolico di Matlab. Deve ricevere in ingresso f , x0 , la tolleranza per l’arresto, e un numero massimo di iterazioni per cui arrestare il metodo anche se la soluzione non è stata trovata. Vogliamo che restituisca la soluzione ed il numero di iterazioni effettuate. 4 function [sol,nit]=newton(f,x0,toll,maxit); %———-newton———— fx=diff(f); % calcolo la derivata nit=maxit; % nit: numero di iterazioni effettuate; lo cambio quando esco dal ciclo sol=x0; % inizializzo la soluzione k=0; %contatore while (k¡maxit) % itero fino a raggiungere maxit ff=subs(f,sol); %valuto il residuo if (abs(ff)≤toll) %se minore di toll nit=k; %salvo il numero di iterazioni break; %ed esco end ffx=subs(fx,sol); %valuto la derivata nel punto sol=sol-ff/ffx; %aggiorno la soluzione k=k+1; %aggiorno il contatore end disp(’Sol Newton’) sol disp(’Iterazioni Newton’) nit Utilizziamo la funzione scritta per calcolare lo zero di f = x − cos(x). Disegnando il grafico, ad esempio con ezplot vediamo che la soluzione esatta si trova fra 0 e π; scegliamo il punto x0 di conseguenza. >>syms x; >>f=x-cos(x); >>[sol,nit]=newton(f,0,10ˆ-8,200); Otteniamo la soluzione sol=0.7391 con solo 4 iterazioni. Verifichiamo la soluzione sostituendola nella funzione e osservando che otteniamo (circa) zero: >>subs(f,sol). Se diminuiamo la tolleranza fino a 10−16 otteniamo la soluzione con 5 iterazioni. Consideriamo ora un’altra funzione: g(x) = ex − 2x2 . Questa funzione ha tre zeri, uno negativo vicino a -0.5, e due positivi. Osserviamo che partendo da valori diversi di x0 il metodo converge a soluzioni diverse: con x0 = 0.3 troviamo -0.53983527690282 con x0 = 0.4 troviamo 2.61786661306681 5 con x0 = 0.7 troviamo 1.48796206549818 con x0 = 2.2 troviamo 2.61786661306681, ma con x0 = 2.1 troviamo di nuovo -0.53983527690282! Questo comportamento dipende dal fatto che abbiamo cambi di segno della derivata prima e seconda nell’intervallo che contiene le tre soluzioni. Esercizi 1 Introduzione al Toolbox simbolico Dichiarare le variabili simboliche necessarie e definire le seguenti funzioni: √ a) f (x) = x2 − 1 b) g(x) = x−1 x+2 1 c) s(t) = 1 + vt + at2 2 Visualizzare le funzioni con il comando pretty. Valutarle nei seguenti punti: a) x = 2 b) x = −2 c) t = 2, a = −9.81, v = 1 (Suggerimento: usare la sintassi subs(f,[t a v],[... ...])) ... Osservare che è possibile valutare le funzioni anche su un vettore di punti ad esempio con il comando >>ff=subs(f,[0:0.1:2]) 2 Grafici di funzioni, limiti, derivate 2.1 Definire la funzione 2x − 1 x+2 Disegnarne il grafico, quindi calcolarne il limite destro e sinistro per x → −2 ed il limite per x → ∞. Utilizzando la funzione retta tangente calcolare e disegnare la retta tangente nel punto x0 = 0. f (x) = 6 2.2 Definire il rapporto incrementale cos(x + h) − cos(x) h dopo avere dichiarato le variabile simboliche x e h. Utilizzarlo per calcolare la derivata di cos(x) attraverso il comando limit. Verificare il risultato ottenuto utilizzando diff. 2.3 Differenziare la funzione f (y) = x2 sin(y) rispetto a y. 3 Il metodo di Newton 3.1 Costruire un grafico del modulo del residuo corrispondente ad ogni iterazione per la ricerca dello zero della funzione x − cos(x) a partire da x0 = 0, con una tolleranza di 10−8 . 3.2 Modificare la funzione newton utilizzando come criterio di arresto invece del test sul residuo la distanza fra due iterazioni successive. Rappresentare in un grafico l’andamento di questa quantità per ogni iterazione per la funzione dell’esercizio precedente. 3.3 Sia data la funzione f = ex − 2x2 ; calcolare i due zeri della sua derivata prima ed utilizzarli come valori iniziali x0 nella ricerca degli zeri di f . Cosa succede? Perché? 7