11.07.2015 Views

Algoritmi iterativi per sistemi lineari ed equazioni non lineari

Algoritmi iterativi per sistemi lineari ed equazioni non lineari

Algoritmi iterativi per sistemi lineari ed equazioni non lineari

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Si dimostra che con questa scelta di β k la direzione p (k+1) è A-coniugata a tutte quelle prec<strong>ed</strong>enti.O<strong>per</strong>ando questa scelta <strong>per</strong> le d (k) , la formula (1.15) diventa:x (k+1) = x (k) + α k p (k) (1.20)Queste condizioni ci imp<strong>ed</strong>iscono di far diminuire ulteriormente la φ (y) e dimostrano che questo metodoconverge alla soluzione esatta con un numero nito di iterazioni.A causa della propagazione degli errori, è preferibile accelerare il metodo precondizionando il residuocon una matrice P che sia una buona approssimazione della A, ma che sia facile da invertire. La sceltadi un buon precondizionatore è molto importante; nel nostro caso si è scelto come precondizionatoreP = R T R, dove la matrice R è calcolata dalla fattorizzazione di Cholesky incompleta 2 .1.2 Metodi <strong>iterativi</strong> <strong>per</strong> la risoluzione di <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong>Un'equazione <strong>non</strong> lineare può essere espressa come:f(x) = 0 (1.21)Risolvere un'equazione di questo tipo signica trovare le radici, ovvero gli zeri, della funzione f(x).L'algoritmo iterativo parte da un punto iniziale x 0 e genera una successione che, sotto opportunecondizioni, converge alla soluzione dell'equazione. Nel nostro lavoro si sono analizzati tre diversimetodi <strong>per</strong> risolvere <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong>.1.2.1 Metodo di bisezioneSupponendo che la f(x) abbia una sola radice in un intervallo [a, b] e che cambi segno all'interno diesso una sola volta, si valuta il punto interm<strong>ed</strong>io c = a+b2. Se la funzione cambia segno in [a, c], allorala soluzione è in questo intervallo. Viceversa, si trova in [c, b]. Per valutare se la funzione cambia segno,si proc<strong>ed</strong>e analizzando il prodotto f(a) ∗ f(c): se esso è negativo signica che la radice è in [a, c], seno è nell'altro intervallo.Dunque si aggiorna l'intervallo e si proc<strong>ed</strong>e iterativamente ricalcolandone il punto interm<strong>ed</strong>io erivalutando il segno. Al termine delle iterazioni il punto interm<strong>ed</strong>io potrà essere una approssimazion<strong>ed</strong>ella soluzione con una certa accuratezza.Nel caso in cui f(c) = 0, signica che la radice coincide con il punto c stesso. In questo casol'algoritmo riconosce di aver trovato la soluzione e si ferma.1.2.2 Metodo di NewtonSia la f(x) una funzione continua in [a, b] con un'unica soluzione al suo interno, ssato un punto inizialex 0 , si considera la retta tangente alla funzione in quel punto. L'intersezione tra la tangente e l'asse delleascisse viene considerata come la nuova approssimazione della soluzione. Si proc<strong>ed</strong>e così iterativamenteno a che lo scarto tra due approssimazioni successive scende al di sotto di una determinata soglia τ.Per valutare la tangente si ricorre al fascio proprio di rette con centro (x k , f(x k )):y − f(x k ) = m(x − x k ) (1.22)Per selezionare tra tutte le rette la tangente alla funzione in x k , bisogna imporre che m sia pari alvalore della derivata della funzione in quel punto. Calcolando la sua intersezione con l'asse delle ascissesi ottiene il metodo iterativo di Newton:2 Per un approfondimento su questo argomento si v<strong>ed</strong>a il paragrafo 5.4.1 di [1]5


x k+1 = x k − f(x k)f ′ (x k )(1.23)La formula (1.23) è ovviamente valida se la derivata in x k è <strong>non</strong> nulla <strong>per</strong> tutti gli x k della successione.1.2.3 Metodo delle secantiPoiché il calcolo della derivata nella formula (1.23) può risultare svantaggioso dal punto di vista computazionale,esistono metodi <strong>iterativi</strong> che, seppur partendo dalla teoria del metodo di Newton, approssimanoil coeciente angolare m in modo diverso rispetto all'uso della derivata. Per questo motivo sidicono metodi quasi-Newton, e sono caratterizzati dall'iterazione generica:x k+1 = x k − f(x k)m k(1.24)Uno di questi è il cosiddetto metodo delle secanti. Il coeciente angolare a ogni passo viene approssimatocon quello della retta secante la funzione nei due punti di ascissa x k e x k−1 :m k = f(x k) − f(x k−1 )x k − x k−1(1.25)Sostituendo il valore (1.25) nella (1.24) si ottiene il metodo delle secanti:x k+1 = x k−1f(x k ) − x k f(x k−1 )f(x k ) − f(x k−1 )(1.26)Poiché dipende da due valutazioni della funzione f(x) occorre inizializzare il metodo con due puntiiniziali, x 0 e x 1 , mentre Newton richi<strong>ed</strong>eva un unico punto iniziale.1.2.4 Sistemi di <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong>Un sistema di n <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong> in n incognite⎧può essere scritto nella forma:⎪⎨⎪⎩f 1 (x 1 , ..., x n ) = 0f 2 (x 1 , ..., x n ) = 0.f n (x 1 , ..., x n ) = 0(1.27)F (x) = 0 (1.28)Considerando F (x) come funzione vettoriale si può trattare il problema di <strong>sistemi</strong> di <strong>equazioni</strong> <strong>non</strong><strong>lineari</strong> estendendo i casi già sviluppati <strong>per</strong> le <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong> monodimensionali.Per ricavare, ad esempio, il metodo di Newton multidimensionale, si sviluppa la F (x) in serie diTaylor troncata al primo ordine:(F (x) ≃ F x (k)) ( + F ′ x (k)) ( x − x (k)) (1.29)dove il simbolo F ′ (x (k) ) denota la matrice Jacobiana:6


F ′ ( x (k)) =⎡⎢⎣∂f 1∂x 1(x (k)1 ,...,x(k).∂f n∂x 1(x (k)1 ,...,x(k)∂f 1n) . . .∂x(x (k)n. ... ..n) · · ·1 ,...,x(k) n)∂f n∂x n(x (k)1 ,...,x(k) n)⎤⎥⎦ (1.30)Per calcolare le approssimazioni successive è quindi suciente utilizzare il metodo iterativo:cioè calcolare lo zero della (1.29).( ) −1 (x (k+1) = x (k) − F ′ (x (k) ) F x (k)) (1.31)7


Capitolo 2Implementazione degli algoritmi2.1 <strong>Algoritmi</strong> <strong>per</strong> <strong>sistemi</strong> <strong>lineari</strong>2.1.1 <strong>Algoritmi</strong> di Jacobi e Gauss-SeidelSi sono implementate in MATLAB® dapprima le versioni matriciali dei due algoritmi, e poi le versionivettoriali, espresse dalle formule (1.11) e (1.12). Di seguito <strong>per</strong> completezza vengono riportati i listatidei programmi che sono stati sviluppati.Le versioni matriciali dei due metodi sono:1 % Algoritmo d i Jacobi in forma m a t r i c i a l e2 % [ x , k ] jacobi_m (A, b , x0 , tau ,Nmax)34 function [ x , k]=jacobi_m (A, b , x0 , tau ,Nmax)56 P=diag ( diag (A) ) ;7 N=P−A;8 k=1;9 x=(P\N)* x0+(P\b ) ;10 while ( ( ktau *norm( x ) ) )11 x0=x ;12 x=(P\N)* x0+(P\b ) ;13 k=k+1;14 end1 % Algoritmo d i Gauss S e i d e l in forma m a t r i c i a l e2 % [ x , k]=GaussSeidel_m (A, b , x0 , tau ,Nmax)34 function [ x , k]=GaussSeidel_m (A, b , x0 , tau ,Nmax)56 P=diag ( diag (A))+ t r i l (A)−diag ( diag ( t r i l (A) ) ) ;7 N=P−A;8 k=1;9 x=(P\N)* x0+(P\b ) ;108


11 while ( ( ktau *norm( x ) ) )12 x0=x ;13 x=(P\N)* x0+(P\b ) ;14 k=k+1;15 endLe versioni matriciali implementano direttamente le formule richiamate nel capitolo 1, e dunque<strong>non</strong> è stato necessario nessun particolare accorgimento in fase di scrittura degli algoritmi. Le versionivettoriali invece sono:1 % Algoritmo d i Jacobi in forma v e t t o r i a l e2 % [ x , k]= j a c o b i (A, b , x0 , tau ,Nmax)34 function [ x , k]= j a c o b i (A, b , x0 , tau ,Nmax)56 k=0;7 n=size (A) ;8 n=n ( 1 : 1 ) ;9 temp=x0 ;10 x=x0 ;1112 for i =1:n13 aux=0;14 for j =1:n15 i f j~=i16 aux=aux+(A( i , j ) ) * temp ( j ) ;17 end18 end19 x ( i )=(b ( i )−aux ) / (A( i , i ) ) ;20 end2122 k=k+1;2324 while ( ( ktau *norm( x ) ) )25 temp=x ;26 for i =1:n27 aux=0;28 for j =1:n29 i f j~=i30 aux=aux+(A( i , j ) ) * temp ( j ) ;31 end32 end33 x ( i )=(b ( i )−aux ) / (A( i , i ) ) ; % Calcolo d e l s u c c e s s i v o v e t t o r e x34 end35 k=k+1;36 end1 % Algoritmo d i Gauss−S e i d e l in forma d i c o o r d i n a t e .2 % [ x , k]= GaussSeidel (A, b , x0 , tau ,Nmax)39


4 function [ x , k]= GaussSeidel (A, b , x0 , tau ,Nmax)56 k=0;7 n=size (A) ;8 n=n ( 1 : 1 ) ;9 x=zeros (n , 1 ) ;10 for i =1:n11 aux=0;12 for j =1: i −113 aux=aux+(A( i , j )*x( j ) ) ;14 end15 temp=0;16 for j=i +1:n17 temp=temp+(A( i , j ) * x0 ( j ) ) ;18 end19 x ( i )=(b ( i )−aux−temp ) / (A( i , i ) ) ;20 end2122 k=k+1;2324 while ( ( ktau *norm( x ) ) )25 x0=x ;26 x=zeros (n , 1 ) ;27 for i =1:n28 aux=0;29 for j =1: i −130 aux=aux+(A( i , j )*x( j ) ) ;31 end32 temp=0;33 for j=i +1:n34 temp=temp+(A( i , j ) * x0 ( j ) ) ;35 end36 x ( i )=(b ( i )−aux−temp ) / (A( i , i ) ) ;37 end38 k=k+1;39 endCome si può notare dai codici riportati, sia <strong>per</strong> Jacobi che <strong>per</strong> Gauss-Seidel, si è resa necessariaun'iterazione al di fuori del ciclo while principale, questo <strong>per</strong> poter implementare, seguendo la sintassirichiesta dal while, il criterio di arresto (1.6).2.1.2 Algoritmo del gradiente coniugato precondizionatoIl codice del programma 1 contenente il metodo del gradiente coniugato precondizionato è riportato diseguito:1 % Algoritmo d e l Gradiente Coniugato Precondizionato2 % [ x , k]= gcp (A, b , x0 , tau ,Nmax)1 Il programma è stato scritto basandosi sull'Algoritmo 5.4 di [1].10


34 function [ x , k]=gcp (A, b , x0 , tau ,Nmax)56 sigma=1e −3;7 R=c h o l i n c (A, sigma ) ; % F a t t o r i z z a z i o n e d i Cholesky incompleta8 P=R' *R; % P r e c o n d i z i o n a t o r e9 x=x0 ;10 r=b−A*x ;11 z=P\ r ;12 p=z ;13 k=0;1415 while ( ( ktau *norm( b ) ) )16 s=A*p ;17 d e l t a=p ' * s ;18 alpha=(p ' * r )/ d e l t a ;19 x=x+alpha *p ;20 r=r−alpha * s ;21 z=P\ r ;22 beta=(s ' * z )/ d e l t a ;23 p=z−beta*p ;24 k=k+1;25 endIl calcolo s = Ap è stato introdotto, rispetto al metodo del gradiente coniugato visto in 1.1.2, al n<strong>ed</strong>i ridurre il costo computazionale riutilizzando il valore di s laddove sarebbe stato richiesto il prodottomatrice-vettore.2.2 <strong>Algoritmi</strong> <strong>per</strong> <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong>2.2.1 <strong>Algoritmi</strong> di bisezione, Newton e secantiSi sono implementati i metodi <strong>iterativi</strong> descritti in 1.2.L'algoritmo di bisezione è:1 % Algoritmo d i B i s e z i o n e2 % [ x , k]= b i s e z i o n e ( fun , a , b , tau ,Nmax)34 function [ x , k]= b i s e z i o n e ( fun , a , b , tau ,Nmax)5 f a=fun ( a ) ;6 fb=fun ( b ) ;7 i f ( f a * fb >=0)8 disp ( ' La f u n z i o n e <strong>non</strong> cambia segno in [ a , b ] ' )9 else10 k=0;11 c=(a+b ) / 2 ;12 f c=fun ( c ) ;13 while ( ( abs (b−a))> tau && ( f c ~=0) && ( k


15 i f ( f a * fc


1 % Algoritmo d i Newton <strong>per</strong> Sistema Non Lineare2 % [ x , k]= multi_newton ( e f f e , jacob , x0 , tau ,Nmax)34 function [ x , k]=multi_newton ( e f f e , jacob , x0 , tau ,Nmax)56 k=0;7 x=x0−inv ( jacob ( x0 ) ) * e f f e ( x0 ) ;8 temp=x0 ;9 while ( ( ktau ) )10 temp=x ;11 x=x−inv ( jacob ( x ) ) * e f f e ( x ) ;12 k=k+1;13 end13


Capitolo 3Test degli algoritmi3.1 Test <strong>per</strong> i <strong>sistemi</strong> <strong>lineari</strong>3.1.1 Test degli algoritmi di Jacobi e Gauss-SeidelI quattro programmi riportati in 2.1.1 sono stati messi a confronto fra di loro, e anche con la funzionegmres di MATLAB. Un approfondimento sulla teoria del metodo GMRES è presente in [1]. Si è sceltocome tolleranza τ il valore 10 −12 . Il numero massimo di iterazioni è stato inizialmente ssato a 50. Diseguito sono quindi riportati i codici utilizzati <strong>per</strong> i test.1 % Test d e g l i a l g o r i t m i d i Jacobi23 n=100;4 A=rand ( n ) ;5 A=A−diag ( diag (A) ) ;6 A=A' *A;7 s=abs (A)* ones (n , 1 ) ;8 k_dom=2; % Fattore d i pr<strong>ed</strong>ominanza9 A=A+k_dom*diag ( s ) ;10 e=ones (n , 1 ) ;11 b=A* e ;12 x0=zeros (n , 1 ) ;13 tau=1e −12;14 Nmax=50;15 t i c16 [ x _ v e t t o r i a l e , k _ v e t t o r i a l e ]= j a c o b i (A, b , x0 , tau ,Nmax ) ;17 k _ v e t t o r i a l e18 e r r o r e _ v e t t o r i a l e=norm( x _ v e t t o r i a l e −e )19 tempo_vettoriale=toc20 t i c21 [ x_matriciale , k_matriciale ]=jacobi_m (A, b , x0 , tau ,Nmax ) ;22 k_matriciale23 e r r o r e _ m a t r i c i a l e=norm( x_matriciale −e )24 tempo_matriciale=toc14


1 % Test d e g l i a l g o r i t m i d i Gauss S e i d e l23 n=100;4 A=rand ( n ) ;5 A=A−diag ( diag (A) ) ;6 A=A' *A;7 s=abs (A)* ones (n , 1 ) ;8 k_dom=2; % Fattore d i pr<strong>ed</strong>ominanza9 A=A+k_dom*diag ( s ) ;10 e=ones (n , 1 ) ;11 b=A* e ;12 x0=zeros (n , 1 ) ;13 tau=1e −12;14 Nmax=50;15 t i c16 [ x _ v e t t o r i a l e , k _ v e t t o r i a l e ]= GaussSeidel (A, b , x0 , tau ,Nmax ) ;17 k _ v e t t o r i a l e18 e r r o r e _ v e t t o r i a l e=norm( x _ v e t t o r i a l e −e )19 tempo_vettoriale=toc20 t i c21 [ x_matriciale , k_matriciale ]=GaussSeidel_m (A, b , x0 , tau ,Nmax ) ;22 k_matriciale23 e r r o r e _ m a t r i c i a l e=norm( x_matriciale −e )24 tempo_matriciale=toc1 % Test GMRES23 n=100;4 A=rand ( n ) ;5 A=A−diag ( diag (A) ) ;6 A=A' *A;7 s=abs (A)* ones (n , 1 ) ;8 k_dom=2; % Fattore d i pr<strong>ed</strong>ominanza9 A=A+k_dom*diag ( s ) ;10 e=ones (n , 1 ) ;11 b=A* e ;12 x0=zeros (n , 1 ) ;13 tau=1e −12;14 Nmax=50;15 t i c16 [ x , flag , r e l r e s , i t e r ]=gmres (A, b , [ ] , tau ,Nmax ) ;17 e r r o r e=norm( x−e )18 i t e r19 tempo=tocLa matrice A è stata creata in modo tale da essere simmetrica denita positiva e diagonalment<strong>ed</strong>ominante al variare di un fattore di pr<strong>ed</strong>ominanza k dom . Si sono eettuati test a dimensione ncrescente e <strong>per</strong> k dom decrescente.15


Figura 3.1: Andamento dell'errore in funzione di k dom <strong>per</strong> i metodi di Jacobi e Gauss-Seidel matricialiFigura 3.2: Andamento dell'errore in funzione di k dom <strong>per</strong> i metodi di Jacobi e Gauss-Seidel vettoriali16


I graci 3.1 e 3.2 riportano l'errore in funzione del fattore di pr<strong>ed</strong>ominanza <strong>per</strong> i metodi di Jacobie Gauss-Seidel in forma matriciale e vettoriale, rispettivamente. Si sono riportate le curve <strong>per</strong> determinativalori della dimensione n, in particolare 200 e 2000. Come si può v<strong>ed</strong>ere il metodo di Jacobi,sia matriciale che vettoriale, diverge al diminuire del fattore di pr<strong>ed</strong>ominanza, mentre il metodo diGauss-Seidel presenta un errore piccolo indierentemente dal valore di k dom . Tutti i valori ricavati daitest sono riportati nelle tabelle della sezione 3.3: si è valutato il numero delle iterazioni k, l'errore eil tempo di calcolo. Nella tabella 3.4 vi sono i risultati ottenuti con un valore di k dom pari a 2. Si ènotato che, come ci si aspettava, tutti i metodi considerati convergono. Il metodo di Jacobi si mostrapiù lento di quello di Gauss-Seidel e, chiaramente, <strong>per</strong> entrambi le versioni matriciali sono più lent<strong>ed</strong>i quelle vettoriali. Il metodo GMRES, essendo ottimizzato, si rivela essere migliore degli altri. Tuttequeste considerazioni sono applicabili anche ai test successivi.La tabella 3.5 contiene i risultati <strong>per</strong> k dom pari a 1.5. Abbiamo mantenuto inizialmente N max = 50,come nel caso prec<strong>ed</strong>ente, ma in questo modo <strong>non</strong> si è riusciti a osservare una convergenza <strong>per</strong> il metododi Jacobi. Poiché il valore di k dom è tale che la matrice sia ancora diagonalmente dominante, questocomportamento sarà da attribuire ad un N max troppo piccolo. Infatti aumentando N max a 100 siamoriusciti a ottenere convergenza anche <strong>per</strong> il metodo di Jacobi.Nella tabella 3.6 sono riportati i risultati <strong>per</strong> k dom pari a 1. Per lo stesso motivo riscontrato neltest prec<strong>ed</strong>ente, si è provato ad aumentare N max ai valori 200, 500, 1000, senza che il metodo diJacobi convergesse. Abbiamo proc<strong>ed</strong>uto <strong>per</strong> tentativi adattando N max in base alla dimensione n. Cisiamo comunque pressati come limite massimo 2500: <strong>per</strong> questo valore abbiamo ottenuto convergenzasino a n = 200, mentre <strong>per</strong> valori su<strong>per</strong>iori il metodo di Jacobi <strong>non</strong> convergeva più, comportamentoosservabile chiaramente anche dai graci. Il metodo di Gauss-Seidel, invece, si è rivelato insensibilealla diminuzione di k dom , come detto in prec<strong>ed</strong>enza.Inne, nella tabella 3.7 abbiamo inserito i valori ottenuti <strong>per</strong> k dom = 0.5. In questo caso lamatrice <strong>non</strong> è più diagonalmente dominante, quindi abbiamo riportato N max a 100 sulla base delcomportamento del metodo di Jacobi già osservato nel test prec<strong>ed</strong>ente. E infatti, come già detto, <strong>non</strong>è convergente, come si può notare dai valori dell'errore. Viceversa, il metodo di Gauss-Seidel è ancoraconvergente in quanto la matrice è ancora simmetrica e denita positiva.3.1.2 Test dell'algoritmo del gradiente coniugato precondizionatoL'algoritmo da noi implementato è stato confrontato con la funzione pcg presente in MATLAB. Ilcodice del programma di test è riportato di seguito.1 % Test d e g l i a l g o r i t m i d e l Gradiente Coniugato Precondizionato23 n=100;4 dens =0.05; %Densità e l e m e n t i <strong>non</strong> n u l l i matrice sparsa5 rcond =0.01; %Reciproco condizionamento6 A=sprandsym(n , dens , rcond , 1 ) ;7 e=ones (n , 1 ) ;8 b=A* e ;9 x0=zeros (n , 1 ) ;10 tau=1e −12;11 Nmax=50;12 t i c13 [ x_nostro , k_nostro ]=gcp (A, b , x0 , tau ,Nmax ) ;14 errore_nostro=norm( x_nostro−e )15 k_nostro17


n Metodo Errore k Tempo100gcp 1.9849 ∗ 10 −13 5 0.0093pcg 2.0139 ∗ 10 −13 5 0.0096200gcp 1.5324 ∗ 10 −11 6 0.0054pcg 1.5326 ∗ 10 −11 6 0.0023500gcp 4.1615 ∗ 10 −12 8 0.1107pcg 4.1652 ∗ 10 −12 8 0.05051000gcp 1.1648 ∗ 10 −10 8 0.7348pcg 1.1648 ∗ 10 −10 8 0.05612000gcp 6.0961 ∗ 10 −11 9 5.2901pcg 6.0966 ∗ 10 −11 9 0.1062Tabella 3.1: Risultati test gradiente coniugato precondizionato16 tempo_nostro=toc17 sigma=1e −3;18 R=c h o l i n c (A, sigma ) ;19 t i c20 [ x_matlab , flag , r e l r e s , k_matlab , r e s v e c ]=pcg (A, b , tau , Nmax,R' ,R, x0 ) ;21 errore_matlab=norm( x_matlab−e )22 k_matlab23 tempo_matlab=tocAnche in questo caso si sono svolti diversi test <strong>per</strong> valori della dimensione n crescenti, riportati nellatabella 3.1. Come atteso, il metodo da noi implementato, <strong>non</strong> essendo ottimizzato, risulta più lento diquello implementato in MATLAB. Gli errori e le iterazioni ottenute sono comunque confrontabili.Nelle gure 3.3 e 3.4 sono riportati gli andamenti della norma del residuo in funzione delle iterazioni,<strong>per</strong> dimensioni della matrice pari a 200 e 2000, rispettivamente. Come si può notare il residuo decresceall'aumentare di k, comportamento previsto dal momento che si tratta di un metodo convergente.3.2 Test <strong>per</strong> le <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong>Abbiamo scritto un le di test <strong>per</strong> valutare le prestazioni dei tre metodi implementati in 2.2.1.codice è riportato di seguito.1 % Test d e i metodi <strong>per</strong> l a r i s o l u z i o n e d i Equazioni Non L i n e a r i23 % Funzione e s o l u z i o n e4 fun=@( x ) x−sin ( x).^2 − cos ( x ) . ^ 2 ;5 dfun=@( x ) 1 ;6 s o l =1;78 tau=1e −8;9 Nmax=100;1011 % Parametri12 a=0;13 b=50;Il18


Bisezione Newton SecantiFunzioni Iterazioni / Errore Iterazioni / Errore Iterazioni / Erroree x − 7 29 − 2.9926∗10 −9 7 − 0 5 − 2.6201∗10 −14x − sin 2 x − cos 2 x 29 − 3.7253∗10 −9 1 − 0 2 − 0(x − 2) 5 0 − 0 78 − 3.4509∗10 −8 0 − 0tanh(x − 1.5) 2 − 0 4 − 0 1 − 0Tabella 3.2: Risultati dei test con parametri vicini alla soluzioneBisezione Newton SecantiFunzioni Iterazioni / Errore Iterazioni / Errore Iterazioni / Erroree x − 7 33 − 2.6433∗10 −9 54 − 2.2204∗10 −16 77 − 0x − sin 2 x − cos 2 x 33 − 1.9791∗10 −9 3 − 0 2 − 0(x − 2) 5 33 − 1.0477∗10 −9 95 − 3.7299∗10 −8 100 − 8.8365∗10 −6tanh(x − 1.5) 33 − 1.5134∗10 −9 3 − NaN 2 − ∞Tabella 3.3: Risultati dei test con parametri lontani dalla soluzione14 x0 =50;15 x1 =51;1617 [ x_bisezione , k_bisezione ]= b i s e z i o n e ( fun , a , b , tau ,Nmax ) ;18 [ x_newton , k_newton]=newton ( fun , dfun , x0 , tau ,Nmax ) ;19 [ x_secanti , k_secanti ]= s e c a n t i ( fun , x0 , x1 , tau ,Nmax ) ;20 k_bisezione21 k_newton22 k_secanti23 e r r o r e _ b i s e z i o n e=abs ( s o l −x_bisezione )24 errore_newton=abs ( s o l −x_newton )25 e r r o r e _ s e c a n t i=abs ( s o l −x_secanti )Per praticità si sono eettuati test <strong>per</strong> tre diverse funzioni con soluzioni note, variando semplicementefun, dfun e sol, e ripetendo le prove sia con parametri vicini alla soluzione, sia con parametrilontani. Come parametri vicini si sono considerati: [a, b] = [0, 4], x 0 = 1 e x 1 = 2. Come parametrilontani si sono presi invece: [a, b] = [0, 50], x 0 = 50 e x 1 = 51.Nella tabella 3.2 possiamo osservare come nel metodo di bisezione il numero di iterazioni sia semprelo stesso a prescindere dalla funzione considerata: questo sottolinea che l'algoritmo lavora principalmentesull'intervallo. Da notare inoltre l'entità dell'errore <strong>per</strong> il metodo di Newton e quello dellesecanti nel caso della seconda equazione: avendo usato come punto iniziale x 0 = 1, corrispondentealla soluzione stessa, i metodi hanno trovato subito il valore esatto. Questo si può notare anche <strong>per</strong>la terza equazione, in cui il metodo di bisezione trova subito la soluzione esatta <strong>per</strong>ché il punto m<strong>ed</strong>iodell'intervallo considerato è proprio la soluzione, e il metodo delle secanti la trova <strong>per</strong>ché essa coincidecon il secondo punto iniziale x 1 . Invece il metodo di Newton presenta un numero elevato di iterazioni,a causa della molteplicità <strong>non</strong> unitaria della soluzione.Invece nella tabella 3.3 vi sono i risultati <strong>per</strong> parametri lontani. Nella prima funzione si puònotare come il metodo di Newton e quello delle secanti siano particolarmente sensibili alla vicinanzadei punti iniziali dalla soluzione, mentre il metodo di bisezione risulta meno inuenzabile. Nella terzaequazione si può notare che sia il metodo di Newton sia quello delle secanti hanno un alto numero di20


iterazioni, e addirittura il metodo delle secanti termina prima di arrivare alla precisione richiesta con unnumero di iterazioni massimo pari a 100: provando ulteriormente si è notato che la convergenza avvienealla 133° iterazione. Questi comportamenti sono legati sia alla lontananza che alla molteplicità dellasoluzione. Inne nell'ultima equazione si osserva che il metodo di bisezione converge, mentre il metododi Newton e delle secanti presentano dei problemi attribuibili alla lontananza e alla pendenza nulladella funzione in quei punti iniziali. Entrambi escono dal ciclo quando la seconda condizione d'arrestopresenta il valore assoluto di Not-a-Number : a quel punto in output si trovano i valori della soluzion<strong>ed</strong>ell'iterazione prec<strong>ed</strong>ente, Not-a-Number <strong>per</strong> il metodo di Newton e ∞ <strong>per</strong> quello delle secanti. Questicomportamenti sono facilmente osservabili se vengono fatti eseguire i rispettivi algoritmi utilizzando ilcomando pause di MATLAB.3.2.1 Test di un sistema <strong>non</strong> lineare 2x2Abbiamo provato a risolvere un semplice sistema di <strong>equazioni</strong> <strong>non</strong> <strong>lineari</strong> 2x2, <strong>per</strong> testare l'ecaciadel metodo di Newton multidimensionale da noi implementato.Il sistema da risolvere era il seguente:{ x 2 + y 2 − 1 = 0(3.1)x − y = 0La cui soluzione è:{x = √ 22 ≃ 0.7071y = √ 22 ≃ 0.7071Per risolvere il sistema si è usato il seguente codice di test:1 %Test sistema <strong>non</strong> l i n e a r e 2x223 f=@( x ) [ x(1)^2+x(2)^2 −1;x(1)−x ( 2 ) ] ;4 jacob=@( x ) [ 2 * x ( 1 ) 2*x ( 2 ) ; 1 −1];5 x0 = [ 0 ; 4 ] ;6 tau=1e −8;7 Nmax=100;89 [ x , k]=multi_newton ( f , jacob , x0 , tau ,Nmax)Il test è arrivato alla soluzione corretta in 6 iterazioni, confermando la validità dell'implementazioneeettuata.3.2.2 Applicazione a una giunzione p-nOltre ai test già eettuati, si è voluto provare ad applicare i metodi di bisezione, Newton e secantiall'equazione <strong>non</strong> lineare che descrive l'andamento della corrente in un diodo:I I = V V− 1 ( )kTR S R S q ln II(3.2)I 0dove V V = 0.6 V, R S = 29.13 Ω, I 0 = 4.5 ∗ 10 −12 A e kT q= 0.0259 eV. Tutti e tre gli algoritmi,bisezione, Newton e secanti, hanno raggiunto un'approssimazione accettabile della soluzione, pari aI I = 2.6 mA. Il metodo di bisezione ha impiegato 29 iterazioni, mentre sia quello di Newton che quellodelle secanti hanno impiegato 8 iterazioni.21


3.3 Appendice: tabelle dei risultati dei test di Jacobi e Gauss-SeidelSono di seguito riportate le quattro tabelle contenenti i risultati ottenuti durante i test degli algoritmidi Jacobi e Gauss-Seidel, commentate in sezione 3.1.1.n Risultati Jacobi Vett. Jacobi Matr. G-S Vett. G-S Matr. GMRES10020050010002000ErrorekT empoErrorekT empoErrorekT empoErrorekT empoErrorekT empo1.9888∗10 −12410.03664.2565∗10 −12410.07314.2972∗10 −12420.44306.6113∗10 −12421.95339.7485∗10 −12427.74861.9886∗10 −12410.05094.2568∗10 −12410.05484.2982∗10 −12420.72316.6115∗10 −12425.05469.7483∗10 −124234.38033.2210∗10 −13140.02085.1477∗10 −13140.02558.7946∗10 −13140.08631.2736∗10 −12140.37111.8313∗10 −12141.29243.2183∗10 −13140.01355.1472∗10 −13140.02888.7984∗10 −13140.25371.2758∗10 −12141.78291.8340∗10 −121411.8578Tabella 3.4: Risultati test <strong>per</strong> k dom = 2 e N max = 501.0150∗10 −12110.00281.8994∗10 −12100.01344.2622∗10 −1290.08225.0427∗10 −1280.03253.7701∗10 −1170.133122


n Risultati Jacobi Vett. Jacobi Matr. G-S Vett. G-S Matr. GMRES10020050010002000ErrorekT empo3.5579∗10 −12670.04703.5575∗10 −12670.02985.3719∗10 −13160.02895.3707∗10 −13160.01891.1471∗10 −12110.0046Errore 4.6319∗10 −12 4.6320∗10 −12 8.9559∗10 −13 8.9631∗10 −13 1.7743∗10 −12k6969161610T empo0.11900.08420.02360.03030.0054Errore 7.7228∗10 −12 7.7228∗10 −12 1.5595∗10 −12 1.5589∗10 −12 4.3315∗10 −12k707016169T empo0.74161.17770.12230.32280.0750Errore 8.4906∗10 −12 8.4914∗10 −12 2.2734∗10 −12 2.2740∗10 −12 1.8549∗10 −11k717116168T empo3.29608.47540.41661.98630.0971Errore 1.2992∗10 −11 1.2990∗10 −11 3.2537∗10 −12 3.2542∗10 −12 5.3113∗10 −11k717116167T empo 13.086958.91751.452013.54980.1291Tabella 3.5: Risultati test <strong>per</strong> k dom = 1.5 e N max = 100n Risultati Jacobi Vett. Jacobi Matr. G-S Vett. G-S Matr. GMRES10020050010002000ErrorekT empo4.8505∗10 −1210610.47134.8515∗10 −1210610.21724.2751∗10 −13200.02044.2743∗10 −13200.01741.6849∗10 −11100.1379Errore 6.9910∗10 −12 6.9911∗10 −12 7.2621∗10 −13 7.2633∗10 −13 2.5392∗10 −12k21122112202010T empo3.24952.33820.02620.04050.0185Errore 3.5676∗10 −5 3.5676∗10 −5 1.3004∗10 −12 1.3013∗10 −12 5.8352∗10 −12k2500250020209T empo 26.495844.03150.14630.35710.0856Errore0.04000.0400 1.9159∗10 −12 1.9162∗10 −12 8.3958∗10 −12k2500250020208T empo 113.6179298.65910.52042.49120.1225Errore1.59381.5938 2.7747∗10 −12 2.7733∗10 −12 7.3466∗10 −11T empo 453.9344 2.0485∗10 3 1.842916.94170.1901k2500250020207Tabella 3.6: Risultati test <strong>per</strong> k dom = 1 e <strong>per</strong> N max = 250023


n Risultati Jacobi Vett. Jacobi Matr. G-S Vett. G-S Matr. GMRES10020050010002000ErrorekT empo2.3175∗10 291000.04352.3175∗10 291000.02582.5268∗10 −12310.02202.5265∗10 −12310.01344.4460∗10 −12110.0796Errore 2.4297∗10 30 2.4297∗10 30 5.1937∗10 −12 5.1946∗10 −12 1.9919∗10 −12k100100313110T empo 0.17010.11730.04300.05030.1359Errore 1.2732∗10 31 1.2732∗10 31 1.0994∗10 −11 1.0196∗10 −11 5.1249∗10 −12k10010031319T empo 1.05951.73370.21320.56350.0143Errore 2.6871∗10 31 2.6871∗10 31 1.5447∗10 −11 1.5446∗10 −11 6.4360∗10 −12k10010031318T empo 4.538612.16540.80953.86450.1040Errore 4.6413∗10 31 4.6413∗10 31 7.0654∗10 −12 7.0668∗10 −12 5.2139∗10 −11k10010032327T empo 18.520282.47712.922826.68190.1334Tabella 3.7: Risultati test <strong>per</strong> k dom = 0.5 e <strong>per</strong> N max = 10024


Bibliograa[1] Giuseppe Rodriguez, <strong>Algoritmi</strong> numerici , Pitagora Editrice Bologna, 200825

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

Saved successfully!

Ooh no, something went wrong!