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.
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