< M A T L A B > Copyright 1984-2005 The MathWorks, Inc. Version 7.1.0.183 (R14) Service Pack 3 August 02, 2005 To get started, select MATLAB Help or Demos from the Help menu. >> format long; >>% calcoliamo la soluzione esatta della equazione: >> alfa=fzero(@(x) x*exp(x)-1,1) alfa = 0.56714329040978 >>% esercizio: implementare il metodo della bisezione >>% primo sistema di soluzione numerica: punto fisso di exp(-x). >>% NOTA BENE: Gli indici vanno da 1 a 11 invece che da 0 a 10. >> z(1)=1 z = 1 >> for k=2:11 z(k)=exp(-z(k-1)); y(k)=abs(z(k)-alfa)/abs(z(k-1)-alfa); % miglioramento percentuale nel passo end >>% abbiamo cme migliore approssimazione in 10 passi il valore: >> z(11) ans = 0.56842872502906 >>% secondo sistema di soluzione numerica: metodo di Newton. >> x(1)=1 x = 1 >> for k=2:11 a=x(k-1)*exp(x(k-1))-1; % funzione b=(1+x(k-1))*exp(x(k-1)); % derivata x(k)=x(k-1)-a/b; w(k)=abs(x(k)-alfa)/abs(x(k-1)-alfa); % miglioramento percentuale nel passo end Warning: Divide by zero. >>% quando si trova la soluzione, lo scarto con alfa diviene 0 esatto ! >>% abbiamo per la migliore approssimazione in 10 passi il valore: >> x(11) ans = 0.56714329040978 >>% in effetti viene raggiunto anche prima dei 10 passi ! >>% vediamo i valori calcolati: >> z z = Columns 1 through 6 1.00000000000000 0.36787944117144 0.69220062755535 0.50047350056364 0.60624353508560 0.54539578597503 Columns 7 through 11 0.57961233550338 0.56011546136109 0.57114311508018 0.56487934739105 0.56842872502906 >> y y = Columns 1 through 6 0 0.46034598707499 0.62759671472561 0.53311378098948 0.58647619508093 0.55619867893588 Columns 7 through 11 0.57335521558358 0.56362207337792 0.56914086023989 0.56601056428605 0.56778576520682 x = Columns 1 through 6 1.00000000000000 0.68393972058572 0.57745447715445 0.56722973773012 0.56714329653030 0.56714329040978 Columns 7 through 11 0.56714329040978 0.56714329040978 0.56714329040978 0.56714329040978 0.56714329040978 >> w w = Columns 1 through 6 0 0.26982700646250 0.08828340668575 0.00838383810456 0.00007080048245 0 Columns 7 through 11 Inf 1.00000000000000 1.00000000000000 1.00000000000000 1.00000000000000 >>% facciamo i plot dei miglioramenti relativi >> plot(y) >> plot(w) >> % dal quinto passo del metodo di Newton non ci sono piu' miglioramenti possibili perche' abbiamo la soluzione esatta >> % con la precisione di macchina ! >> % resta una curiosita": quanti passi occorrono con il primo metodo ? < M A T L A B > Copyright 1984-2005 The MathWorks, Inc. Version 7.1.0.183 (R14) Service Pack 3 August 02, 2005 To get started, select MATLAB Help or Demos from the Help menu. >> format long; >> alfa=fzero(@(x) x*exp(x)-1,1) alfa = 0.56714329040978 >> z(1)=1 z = 1 >> for k=2:500 z(k)=exp(-z(k-1)); y(k)=abs(z(k)-alfa)/abs(z(k-1)-alfa); if( abs(z(k)-alfa) < 2*eps) return; end end >>% vediamo quando si e' fermato: >> k k = 63 >>% vediamo i valori >> z(50:k) ans = Columns 1 through 6 0.56714329040947 0.56714329040996 0.56714329040968 0.56714329040984 0.56714329040975 0.56714329040980 Columns 7 through 12 0.56714329040977 0.56714329040979 0.56714329040978 0.56714329040979 0.56714329040978 0.56714329040978 Columns 13 through 14 0.56714329040978 0.56714329040978 >>% quindi ci sono voluti 62 passi dell'iterazione. >> plot(y) >> % per curiosita', se si applica il metodo di Newton alla equazione scritta in forma x-exp(-x)=0, cosa accade ? < M A T L A B > Copyright 1984-2005 The MathWorks, Inc. Version 7.1.0.183 (R14) Service Pack 3 August 02, 2005 To get started, select MATLAB Help or Demos from the Help menu. >> format long >> alfa=fzero(@(x) x*exp(x)-1,1) alfa = 0.56714329040978 >> x(1)=1 x = 1 >> for k=2:10 a=x(k-1)-exp(-x(k-1)); b=1+exp(-x(k-1)); x(k)=x(k-1)-a/b; end >> x x = Columns 1 through 6 1.00000000000000 0.53788284273999 0.56698699140541 0.56714328598912 0.56714329040978 0.56714329040978 Columns 7 through 10 0.56714329040978 0.56714329040978 0.56714329040978 0.56714329040978 >> % anche qui la convergenza risulta velocissima, bastano 4 passi del metodo di Newton.