Eseguiamo l'algoritmo sulla stessa funzione del metodo di bisezione e guardiamo il risultato:
» [x,it,tolf]=newton(0,'fxcosx','dfxcosx',1e-15,2000) x = 0.73908513321516 it = 5 tolf = 1.673612029183215e-015 »
impiega circa un decimo delle iterazioni di bisezione. Si deve comunque tenere presente che ad ogni iterazione si devono valutare due funzioni, e da non trascurare è il costo del calcolo analitico della derivata della funzione.
Proviamo adesso ad applicare l'algoritmo a due funzioni a radici multiple, per mostrare quanto lentamente converge verso la soluzione; la prima funzione che vedremo è che ammette come soluzione :
» [x,it,tolf]=newton(0,'fx5','dfx5',1e-15,2000) x = 4.99999999999999 it = 155 tolf = 7.470729841072302e-072 »
impiega ben iterazioni per raggiungere un'approssimazione neanche troppo precisa della soluzione: vedremo come si riuscirà ad ottenere risultati molto migliori (perfino il metodo di bisezione ottiene risultati migliori, impiegando soltanto iterazioni).
La seconda funzione che andremo a vedere è leggermente più complessa ed è e otteniamo come risultato
» [x,it,tolf]=newton(0,'fxm','dfxm',1e-15,2000) x = 1.00000000000000 it = 117 tolf = 2.772655121618958e-058 »
certamente un risultato non esaltante per un metodo così oneroso come Newton.
Quello che abbiamo intenzione di mostrare adesso è come la scelta del punto iniziale possa influenzare la convergenza del metodo verso una soluzione oppure verso un'altra; la funzione che prenderemo in esame è la semplice e cambiando punto di partenza otteniamo due delle sue infinite soluzioni:
» [x,it,tolf]=newton(1,'sin','cos',1e-15,2000) x = 0 it = 5 tolf = 1.000000000000000e-015 » [x,it,tolf]=newton(2,'sin','cos',1e-15,2000) x = 3.14159265358979 it = 6 tolf = 1.000000000000000e-015 »
in un caso abbiamo scelto ed il metodo converge verso la soluzione , nel secondo caso, invece, si è scelto e la successione di approssimazioni converge verso la soluzione
Come la scelta del punto iniziale può portare a convergere verso
una soluzione piuttosto che verso un'altra (nel caso ce ne siano
più d'una), questa può anche portare a non convergere il metodo di
Newton come vedremo adesso. Consideriamo la funzione che è continua e derivabile su tutto . Cerchiamo il
punto iniziale tale che
» type fnonew function y=fnonew(x); y=atan(abs(x))-2*abs(x).*dfatanx(x); » x0=bisezione(0.1,3,'fnonew',1e-15) x0 = 1.39174520027073 » fnonew(x0) ans = 1.110223024625157e-016 »
è il punto che stavamo cercando; ci si presentano due scelte: porre oppure entrambe interessanti, vediamo perché:
» [x,it]=newton(x0,'fatanx','dfatanx',1e-10,2000) x = 1.39174520027073 x = -1.39174520027073 x = 1.39174520027073 ...... it = 2000 » » newton(3,'fatanx','dfatanx',1e-10,2000) x1 = -9.49045772398254 x1 = 1.239995111788842e+002 ............. x1 = 1.554292211858608e+146 x1 = -3.794767904961391e+292 x1 = Inf
Nel primo caso vediamo come la funzione continui ad alternarsi tra ed senza mai convergere verso la soluzione; nel secondo caso, invece, si vede come scegliendo un valore maggiore di quell' la successione delle approssimazioni diverga verso infinito. Scegliendo un valore appena inferiore ad e precisamente , dove con indichiamo la precisione di macchina, il metodo di Newton converge, come si vede
» [x,it,tolf]=newton(x0-eps,'fatanx','dfatanx',1e-15,2000) x = -2.073113138404900e-019 it = 41 tolf = 1.000000000000000e-015 »
Vogliamo dare anche un esempio di come a volte le approssimazioni
possano creare non pochi problemi. Prendiamo nuovamente in esame
la funzione e cerchiamo come punto iniziale
In due passi siamo tornati al punto di partenza. Calcoliamo il punto iniziale ancora tramite il metodo di bisezione:
» f f = Inline function: f(x) = tan(x)-2*x » x0=bisezione(1,pi/2-eps,f,1e-15s) x0 = 1.16556118520721 » f(x0) ans = -4.440892098500626e-016 »
proviamo dunque ad applicare il metodo di Newton innescato con questo punto:
» [x,it,tolf]=newton(x0,'sin','cos',1e-15,2000) x1 = -1.16556118520721 x1 = 1.16556118520721 x1 = -1.16556118520719 x1 = 1.16556118520712 ............... x = 0 it = 26 tolf = 1.000000000000000e-019 »
Al contrario di quanto ci si aspettava l'algoritmo converge! E questo è proprio dovuto alle approssimazioni fatte; se si guarda le prime due iterazioni, l'algoritmo si composta come previsto, ma già dalla terza inizia a perdere precisione sull'ultima cifra significativa, ed è questo fatto che porta alla convergenza il metodo.
Morpheus 2004-01-04