Esercitazioni di MATLAB: Lezione del 7 Aprile 2008¶
Metodo delle secanti
Una possibile implementazione del metodo delle secanti:
File secanti.m
:open:
1%
2% Metodo delle secanti
3%
4% Cerco lo zero della funzione fun(x) a partire
5% da due approssimazioni distinte dello zero x0 ed x1.
6% epsi e' la tolleranza sotto la quale le iterate vengono
7% interrotte.
8%
9% In uscita viene resttuito il vettore con tutte
10% le iterate calcolate.
11%
12function X = secanti(fun,x0,x1,epsi)
13 X = [x0;x1] ;
14 f0 = feval(fun,x0) ;
15 f1 = feval(fun,x1) ;
16 for i=1:100
17 % formula di avanzamento
18 df = (f1-f0)/(X(end)-X(end-1)) ;
19 xnew = X(end) - f1/df ;
20
21 % aggiorna i vettori
22 X = [X ; xnew ] ;
23 f0 = f1 ;
24 f1 = feval(fun,xnew) ;
25
26 % controlla se interrompere il ciclo
27 if abs(f1) < epsi ; break ; end ;
28 end
29end
Uno script per plottare bene le iterate:
File piter.m
:open:
1%
2% Funzione per la stampa delle iterate per il metodo delle
3% secanti
4%
5% fun = funzione alla quale e' stato applicato
6% il metodo delle secanti
7% X = vettore con la storia delle iterate
8%
9% xe = soluzione esatta
10%
11function piter(fun,X,xe)
12
13 % calcolo ingombro iterate per coordinata X
14 xmin = min(X) ;
15 xmax = max(X) ;
16 len = xmax-xmin ;
17 xmin = xmin - len/10 ;
18 xmax = xmax + len/10 ;
19
20 % vettori per il plot della funzione
21 XX = [xmin:len/1000:xmax] ;
22 YY = feval(fun,XX) ;
23
24 % calcolo ingombro iterate per coordinata Y
25 ymin = min(YY) ;
26 ymax = max(YY) ;
27
28 plot(XX,YY,'LineWidth',2);
29 hold on;
30
31 % assi centrati sullo zero
32 plot([xe;xe],[ymin;ymax],'k-','LineWidth',1);
33 plot([xmin;xmax],[0;0],'k-','LineWidth',1);
34
35 for i=1:length(X)
36 x = X(i) ;
37 % linea verticale
38 plot([x;x],[0;feval(fun,x)],'r--','LineWidth',2);
39 if i>2
40 x2 = X(i-2) ;
41 % secante
42 plot([x;x2],[0;feval(fun,x2)],'c-');
43 end
44 end
45 axis on ;
46 hold off;
47end
Uno script per testare tutto:
File test.m
:open:
1%
2% Funzione per testare il medoto delle secanti
3%
4%
5function test
6
7 % parametri per il problema
8 x0 = 3 ;
9 x1 = 1 ;
10 epsi = 1E-15 ;
11
12 % chiama il solutore
13 X = secanti(@fun,x0,x1,epsi) ;
14
15 % soluzione esatta
16 xe = 0;
17
18 % differenza con la soluzione esatta
19 ERR = X-xe
20
21 % stima ordine di convergenza
22 ORDER = log(ERR(3:end)./ERR(2:end-1)) ./ log(ERR(2:end-1)./ERR(1:end-2)) ;
23
24 % stampa stima degli ordini
25 disp(ORDER) ;
26
27 % plottaggio delle iterate a video
28 piter(@fun,X,xe) ;
29
30end
31
32function res = fun(x)
33 res = x.*exp(x)./(1+x.^2) ;
34 %res = (x-3).^3+(x-3)*0.1 ;
35end
Tutti i file MATLAB in un unico archivio