18.05.2015 Views

Laboratorio 2 Calcolo simbolico, limiti e derivate. Metodo di Newton.

Laboratorio 2 Calcolo simbolico, limiti e derivate. Metodo di Newton.

Laboratorio 2 Calcolo simbolico, limiti e derivate. Metodo di Newton.

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Anno Accademico 2007-2008<br />

Corso <strong>di</strong> Analisi 1<br />

per Ingegneria Elettronica<br />

<strong>Laboratorio</strong> 2<br />

<strong>Calcolo</strong> <strong>simbolico</strong>, <strong>limiti</strong> e <strong>derivate</strong>. <strong>Metodo</strong> <strong>di</strong><br />

<strong>Newton</strong>.<br />

1 Introduzione al Toolbox <strong>simbolico</strong><br />

Con le routines del Symbolic Math Toolboxes è possibile utilizzare Matlab con una sintassi<br />

molto simile alla simbologia dell’analisi.<br />

É possibile definire variabili simboliche con il comando sym:<br />

>>x=sym(’x’)<br />

o anche specificando il tipo <strong>di</strong> variabile:<br />

>>x=sym(’x’,’real’)<br />

Si possono usare, con lo stesso effetto, i coman<strong>di</strong><br />

>>syms x<br />

>>syms x real<br />

Ora possiamo definire funzioni con queste variabili simboliche:<br />

>>f=xˆ2-2*x+1<br />

Digitando whos osserviamo che abbiamo creato due sym object. Per ottenere una visualizzazione<br />

più leggibile delle funzioni inserite si può utilizzare il comando pretty:<br />

>>pretty(f)<br />

x 2 -2x+ 1<br />

Il comando subs serve per la sostituzione simbolica, cioè per assegnare un valore ad una<br />

variabile simbolica. Supponiamo <strong>di</strong> voler valutare la funzione f definita precedentemente per<br />

x = 1: possiamo utilizzare il comando subs in due mo<strong>di</strong><br />

• >>subs(f,1)<br />

• >>subs(f,’x’,1)<br />

1


2 Grafici <strong>di</strong> funzioni, <strong>limiti</strong>, <strong>derivate</strong><br />

Definiamo la variabile simbolica x e la seguente funzione:<br />

con i seguenti coman<strong>di</strong>:<br />

f(x) =<br />

2x2<br />

x 2 − 1<br />

>>x=sym(’x’;)<br />

>>f=2*xˆ2/(xˆ2-1)<br />

È possibile <strong>di</strong>segnare il grafico <strong>di</strong> questa funzione senza doverla valutare in un numero <strong>di</strong>screto<br />

<strong>di</strong> punti, usando il comando ezplot<br />

>>ezplot(f)<br />

che <strong>di</strong>segna la funzione sull’intervallo standard [−2π, 2π]; altrimenti si può specificare l’intervallo:<br />

>>ezplot(f,[-5,5])<br />

Dopo avere definito la variabile simbolica e una funzione possiamo calcolare i <strong>limiti</strong> con il<br />

comando limit. Definiamo f(x) = tan(x), e calcoliamo il limite per x → π/2:<br />

>>limit(f,x,pi/2)<br />

Con Matlab possiamo calcolare il limite sinistro e destro:<br />

>>limit(f,x,pi/2,’left’)<br />

ans=<br />

inf<br />

>>limit(f,x,pi/2,’right’)<br />

ans=<br />

-inf<br />

e anche il limite per x → ∞, <strong>di</strong>gitando limit(f,x,inf).<br />

Inoltre con il comando <strong>di</strong>ff possiamo calcolare le <strong>derivate</strong> <strong>di</strong> funzioni, ad esempio possiamo<br />

calcolare la derivata della tangente, definita nell’esercizio precedente:<br />

>>fx=<strong>di</strong>ff(f,x)<br />

fx=<br />

1+tan(x)ˆ2<br />

3 Il metodo <strong>di</strong> <strong>Newton</strong><br />

Il metodo <strong>di</strong> <strong>Newton</strong> è un metodo iterativo per la ricerca degli zeri <strong>di</strong> una funzione che<br />

costruisce una successione <strong>di</strong> valori x (n) approssimando localmente la funzione con la sua<br />

retta tangente: a partire da un valore iniziale x (0) si costruisce la retta tangente in quel<br />

punto, e si calcola il punto x (1) in cui tale retta interseca l’asse y = 0, quin<strong>di</strong> si costruisce la<br />

retta tangente in x (1) e si itera.<br />

L’espressione della retta tangente in un punto x (n) a f è la seguente:<br />

2


Figura 1: Alcune iterazioni del metodo <strong>di</strong> <strong>Newton</strong><br />

y(x) = f(x (n) ) + f ′ (x (n) )(x − x (n) ) (1)<br />

Cerchiamo il valore <strong>di</strong> x per cui la retta tangente interseca l’asse y = 0, quin<strong>di</strong> poniamo<br />

y = 0 e otteniamo la successiva approssimazione della soluzione, x (n+1) :<br />

x (n+1) = x (n) − f(x(n) )<br />

f ′ (x (n) )<br />

(2)<br />

purchè f ′ (x (n) ) ≠ 0.<br />

La 2 è l’espressione <strong>di</strong> un’iterazione generica del metodo <strong>di</strong> <strong>Newton</strong>.<br />

È necessario stabilire un criterio d’arresto che decida quando la soluzione è stata approssimata<br />

con la precisione desiderata. Esistono <strong>di</strong>verse scelte:<br />

• criterio basato sul residuo<br />

• confronto fra due iterazioni successive<br />

Il criterio basato sul residuo arresta il metodo quando il modulo del residuo f(x (n) ) è<br />

inferiore ad una tolleranza fissata:<br />

|f(x (n) )| ≤ toll<br />

Si può anche arrestare il metodo quando la <strong>di</strong>stanza fra x (n+1) ed x (n) è inferiore ad una<br />

tolleranza fissata:<br />

|x (n+1)−x(n) | ≤ toll<br />

Approfon<strong>di</strong>mento: vali<strong>di</strong>tà del criterio d’arresto<br />

Osservando la figura 2 si nota che entrambi i criteri <strong>di</strong> arresto possono fallire. Nella situazione<br />

a) in cui f ′ (x e ) > 1 invece due iterazioni<br />

successive possono essere vicine con f(x (n) ) ancora molto <strong>di</strong>verso da 0.<br />

3


Figura 2: Confronto fra i criteri d’arresto<br />

Figura 3: Algoritmo<br />

Scriviamo una funzione che implementi il metodo <strong>di</strong> <strong>Newton</strong> sfruttando le funzioni del<br />

Toolbox <strong>simbolico</strong> <strong>di</strong> Matlab. Deve ricevere in ingresso f, x 0 , la tolleranza per l’arresto, e un<br />

numero massimo <strong>di</strong> iterazioni per cui arrestare il metodo anche se la soluzione non è stata<br />

trovata. Vogliamo che restituisca la soluzione ed il numero <strong>di</strong> iterazioni effettuate.<br />

4


function [sol,nit]=newton(f,x0,toll,maxit);<br />

%———-newton————<br />

fx=<strong>di</strong>ff(f); % calcolo la derivata<br />

nit=maxit; % nit: numero <strong>di</strong> iterazioni effettuate; lo cambio quando esco dal ciclo<br />

sol=x0; % inizializzo la soluzione<br />

k=0; %contatore<br />

while (k¡maxit) % itero fino a raggiungere maxit<br />

ff=subs(f,sol); %valuto il residuo<br />

if (abs(ff)≤toll) %se minore <strong>di</strong> toll<br />

nit=k; %salvo il numero <strong>di</strong> iterazioni<br />

break; %ed esco<br />

end<br />

ffx=subs(fx,sol); %valuto la derivata nel punto<br />

sol=sol-ff/ffx; %aggiorno la soluzione<br />

k=k+1; %aggiorno il contatore<br />

end<br />

<strong>di</strong>sp(’Sol <strong>Newton</strong>’)<br />

sol<br />

<strong>di</strong>sp(’Iterazioni <strong>Newton</strong>’)<br />

nit<br />

Utilizziamo la funzione scritta per calcolare lo zero <strong>di</strong> f = x − cos(x). Disegnando il<br />

grafico, ad esempio con ezplot ve<strong>di</strong>amo che la soluzione esatta si trova fra 0 e π; scegliamo<br />

il punto x 0 <strong>di</strong> conseguenza.<br />

>>syms x;<br />

>>f=x-cos(x);<br />

>>[sol,nit]=newton(f,0,10ˆ-8,200);<br />

Otteniamo la soluzione sol=0.7391 con solo 4 iterazioni. Verifichiamo la soluzione sostituendola<br />

nella funzione e osservando che otteniamo (circa) zero:<br />

>>subs(f,sol).<br />

Se <strong>di</strong>minuiamo la tolleranza fino a 10 −16 otteniamo la soluzione con 5 iterazioni.<br />

Consideriamo ora un’altra funzione: g(x) = e x − 2x 2 . Questa funzione ha tre zeri, uno<br />

negativo vicino a -0.5, e due positivi. Osserviamo che partendo da valori <strong>di</strong>versi <strong>di</strong> x 0 il<br />

metodo converge a soluzioni <strong>di</strong>verse:<br />

con x 0 = 0.3 troviamo -0.53983527690282<br />

con x 0 = 0.4 troviamo 2.61786661306681<br />

5


con x 0 = 0.7 troviamo 1.48796206549818<br />

con x 0 = 2.2 troviamo 2.61786661306681, ma con x 0 = 2.1 troviamo <strong>di</strong> nuovo -0.53983527690282!<br />

Questo comportamento <strong>di</strong>pende dal fatto che abbiamo cambi <strong>di</strong> segno della derivata prima e<br />

seconda nell’intervallo che contiene le tre soluzioni.<br />

Esercizi<br />

1 Introduzione al Toolbox <strong>simbolico</strong><br />

Dichiarare le variabili simboliche necessarie e definire le seguenti funzioni:<br />

a) f(x) = √ x 2 − 1<br />

b) g(x) = x − 1<br />

x + 2<br />

c) s(t) = 1 + vt + 1 2 at2<br />

Visualizzare le funzioni con il comando pretty.<br />

Valutarle nei seguenti punti:<br />

a) x = 2<br />

b) x = −2<br />

c) t = 2, a = −9.81, v = 1 (Suggerimento: usare la sintassi subs(f,[t a v],[... ...<br />

...]))<br />

Osservare che è possibile valutare le funzioni anche su un vettore <strong>di</strong> punti ad esempio con il<br />

comando<br />

>>ff=subs(f,[0:0.1:2])<br />

2 Grafici <strong>di</strong> funzioni, <strong>limiti</strong>, <strong>derivate</strong><br />

2.1<br />

Definire la funzione<br />

f(x) = 2x − 1<br />

x + 2<br />

Disegnarne il grafico, quin<strong>di</strong> calcolarne il limite destro e sinistro per x → −2 ed il limite per<br />

x → ∞. Utilizzando la funzione retta tangente calcolare e <strong>di</strong>segnare la retta tangente nel<br />

punto x 0 = 0.<br />

6


2.2<br />

Definire il rapporto incrementale<br />

cos(x + h) − cos(x)<br />

h<br />

dopo avere <strong>di</strong>chiarato le variabile simboliche x e h. Utilizzarlo per calcolare la derivata <strong>di</strong><br />

cos(x) attraverso il comando limit.<br />

Verificare il risultato ottenuto utilizzando <strong>di</strong>ff.<br />

2.3<br />

Differenziare la funzione f(y) = x 2 sin(y) rispetto a y.<br />

3 Il metodo <strong>di</strong> <strong>Newton</strong><br />

3.1<br />

Costruire un grafico del modulo del residuo corrispondente ad ogni iterazione per la ricerca<br />

dello zero della funzione x − cos(x) a partire da x 0 = 0, con una tolleranza <strong>di</strong> 10 −8 .<br />

3.2<br />

Mo<strong>di</strong>ficare la funzione newton utilizzando come criterio <strong>di</strong> arresto invece del test sul residuo<br />

la <strong>di</strong>stanza fra due iterazioni successive. Rappresentare in un grafico l’andamento <strong>di</strong> questa<br />

quantità per ogni iterazione per la funzione dell’esercizio precedente.<br />

3.3<br />

Sia data la funzione f = e x − 2x 2 ; calcolare i due zeri della sua derivata prima ed utilizzarli<br />

come valori iniziali x 0 nella ricerca degli zeri <strong>di</strong> f. Cosa succede? Perché?<br />

7

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!