Soluzione del laboratorio Metodi di punto fisso e sistemi di equazioni non lineari 29 - Questo testo (compresi i quesiti ed il loro svolgimento) è coperto da diritto d autore. Non può essere sfruttato a fini commerciali o di pubblicazione editoriale. Non possono essere ricavati lavori derivati. Ogni abuso sarà punito a termine di legge dal titolare del diritto. This text is licensed to the public under the Creative Commons Attribution-NonCommercial-NoDerivs2.5 License (http://creativecommons.org/licenses/by-nc-nd/2.5/) Esercizio Si consideri la funzione f(x) = cos 2 (2x) x 2.. Si disegni la funzione e si individuino graficamente i punti in cui f(x) =. Definiamo la anonymous function f = @(x) e la rappresentiamo graficamente dopo averla valutata su mille punti equispaziati; >> f = @(x) cos (2* x ).^2 - x.^2; >> x = linspace (-pi /2, pi /2,); >> plot (x,f(x),x, zeros ( size (x)), 'k '); Si individuano graficamente due zeri, simmetrici rispetto all origine, che chiameremo nel seguito α > e α <..5.5.5 2.5.5.5.5 2 Figura : Rappresentazione di f(x) nell intervallo [ π/2, π/2]. 2. Si verifichi teoricamente per quale intervallo di valori della costante A il metodo di punto fisso per la ricerca degli zeri di f(x) con funzione di iterazione: φ(x) = x + Af(x)
può convergere alla radice α > per una scelta opportuna del dato iniziale. Per il teorema di Ostrowski è richiesto che φ (α) <, ovvero: +Af (α) < < +Af (α) < 2 <Af (α) < <A < 2/f (α) Si noti che, deduco da una analisi del grafico della funzione che f (α) <, è stato cambiato il segno della disequazione nell ultimo passaggio. 3. Si utilizzi la function ptofis.m con A =. e x () =. per ottenere un valore della radice α, sceglio come tolleranza. Si usi il valore della radice ottenuta per verificare numericamente il range di valori ammissibili per A ottenuto teoricamente al punto precedente. Si studi la sensibilità della convergenza del metodo al variare di A e x (). Dobbiamo in questo caso definire la funzione phi ed utilizzare la function ptofis.m con la seguente sintassi: >> phi = @(x) x +.*( cos (2* x ).^2 - x.^2) >> [ succ, it ] = ptofis (., phi,,e -, - pi /2, pi /2); dove gli ultimi due argomenti -pi/2,pi/2 sono gli estremi (su entrambi gli assi cartesiani) dell intervallo nel quale verrà plottato l output grafico della funzione (si veda help ptofis).5.5.5.5.5.5.5.5 Figura 2: Rappresentazione grafica delle iterate di punto fisso per la funzione dell Esercizio con A =. e x () =.. In blu viene rappresentato il grafico della funzione di iterazione φ(x), in verde la bisettrice degli assi e in rosso le iterate calcolate dall algoritmo Il numero di iterazioni effettuate e il valore numerico della soluzione (contenuto nell ultimo elemento del vettore fornito come output della funzione succ) sono: 2
Numero di Iterazioni : 65 Radice calcolata :.5493326 Valutando f (x) = 4 cos(2x) sin(2x) 2x nella radice calcolata otteniamo l intervallo di valori ammissibili di A: >> df = @(x) -4* cos (2* x ).* sin (2* x) -2*x; >> df_a = df( succ ( )) df_a = -2.7955 >> Asup = -2/( df_ a ) Asup =. 754 Ovvero il metodo converge ad α > per < A <.754. Ad esempio, per A =.6 e x () =. otteniamo il seguente risultato: >> phi6 = @(x) x +.6*( cos (2* x ).^2 - x.^2); >> [ succ2, it2 ] = ptofis (., phi6,,e -, - pi /2, pi /2); Numero di Iterazioni : 57 Radice calcolata :.5493326.5.5.5.5.5.5.5.5 Figura 3: Rappresentazione grafica delle iterate di punto fisso per la funzione dell Esercizio con A =.6 e x () =. Notiamo che l algoritmo può convergere per valori del dato iniziale relativamente lontani dalla soluzione, ad esempio per A =.6 e x () = 2. si ottiene il seguente risultato: >> [ succ3, it3 ] = ptofis (2., phi6,,e -, - pi /2, 2.); Numero di Iterazioni : 58 Radice calcolata :.5493326 3
2.5.5.5.5.5.5.5.5 2 Figura 4: Rappresentazione grafica delle iterate di punto fisso per la funzione dell Esercizio con A =.6 e x () = 2.. Per A =.75 >.754, l algoritmo di punto fisso non converge, non esso verificata l ipotesi del teorema di Ostrowski: >> phi75 = @(x) x +.75*( cos (2* x ).^2 - x.^2); >> [ succ3, it3 ] = ptofis (., phi75,,e -, - pi /2, pi /2); Numero massimo di iterazioni raggiunto 4. Stimare l ordine di convergenza e il fattore di convergenza del metodo di punto fisso al variare di A utilizzando la function stimap.m, verificando l affidabilità delle stime teoriche. Dalla stima teorica, per i metodi di punto fisso di ordine il fattore di convergenza è uguale al valore di φ (α). Invochiamo la function stimap.m (che riceve in ingresso il vettore di valori ottenuti dalle successive iterazioni di un metodo iterativo) per verificare ordine e fattore di convergenza per le successioni ottenute con A =. e A =.6: >> [p,c] = stimap ( succ ); Ordine stimato :.83 Fattore di riduzione :.7247642 >> [p2,c2] = stimap ( succ2 ); Ordine stimato :.9999988 Fattore di riduzione :.677333 La convergenza è sempre lineare (ordine uguale a ), mentre i fattori sono in perfetto accordo con la stima teorica (si noti che per A =.6 si ha +.6f (α) < e la convergenza è oscillante, come si vede nell output grafico in Figura 3): >> +.* df_a ans = 4
.5.5.5.5.5.5.5.5 Figura 5: Rappresentazione grafica delle iterate di punto fisso per la funzione dell Esercizio con A =.75 e x () =., caso in cui l algoritmo non giunge a convergenza.. 724 >> +.6* df_a ans = -.6773 5. Fornire un valore di A tale da ottenere un metodo del secondo ordine. Si ha un metodo del secondo ordine se φ (α) =, ovvero se + Af (α) =, e quindi: A = f (α).3577 Verifichiamo di ottenere effettivamente un metodo del secondo ordine con i comandi: >> A_opt = -/ df_a A_ opt =. 3577 >> phi_opt = @(x) x + A_opt *( cos (2* x ).^2 - x.^2); >> [ succ_opt, it_opt ] = ptofis (., phi_opt,,e -, -pi /2, pi /2); Numero di Iterazioni : 5 Radice calcolata :.5493326 >> [ p_opt, c_opt ] = stimap ( succ_opt ); Ordine stimato : 2.6432 Fattore di riduzione :.376845 Il metodo converge in sole 5 iterazioni e la stima dell ordine di convergenza è in accordo con le considerazioni teoriche. 6. Ricordando che il metodo di Newton può essere riletto come metodo di punto fisso, implementarlo utilizzando la function ptofis.m. Determinare sperimentalmente gli 5
.5.5.5.5.5.5.5.5 Figura 6: Rappresentazione grafica delle iterate di punto fisso per la funzione dell Esercizio con A = A opt =.3577 e x () =., caso in cui il metodo ha ordine di convergenza pari a 2. intervalli in cui scegliere il dato iniziale in modo che il metodo converga alla radice α positiva. Il metodo di Newton si può rileggere come metodo di punto fisso con funzione di iterazione: φ N = x f(x) f (x) In questo caso, la funzione di iterazione è discontinua in x = e oscillante altrove. Ciò implica che l intervallo [a, b] all interno del quale scegliere il dato iniziale per assicurare convergenza allo zero α > è piccolo. Per stimare questo intervallo sperimentalmente possiamo procedere nella maniera seguente: variamo il valore di x all interno di un intervallo a piacere; eseguiamo il metodo di Newton a partire da questo dato iniziale e salviamo il valore della soluzione alla quale il metodo converge; infine rapprensentiamo su un grafico i valori della radice così ottenuta in funzione di x. In pratica: phin = @(x)x - ( cos (2* x ).^2 - x.^2)./( -4* cos (2* x ).* sin (2* x) -2*x) vett_sol =[]; vett_x = [.:.:] for x = vett_x [succ,it] = ptofis (x,phin,,e -, - pi /2, pi /2); vett_sol = [ vett_sol succ ( )]; plot ( vett_x, vett_sol, 'o-- ') Dalla Figura 7 si ottiene un intervallo per la scelta del dato iniziale pari a [.2,.88]. Un risultato del metodo di Newton è il seguente (per x () =.8): 6
.6.4.2.2.4.6.8..2.3.4.5.6.7.8.9 Figura 7: Radice calcolata dal metodo di Newton al variare del dato iniziale. Sceglio un dato iniziale all interno dell intervallo [.2,.88] si converge alla radice α >. >> [ succn, itn ] = ptofis (.8, phin,,e -, -pi, 2* pi ); Numero di Iterazioni : 5 Radice calcolata :.5493326 6 5 4 3 2 2 3 3 2 2 3 4 5 6 Figura 8: Rappresentazione grafica delle iterate di punto fisso per il metodo di Newton. Si noti la forma della funzione di iterazione. 7
Esercizio 2. Si scriva la function y = F_molle(x) che restituisce la valutazione di F sul generico vettore x (ovvero deve restituire un vettore di N componenti). La funzione richiede come input il vettore degli N gradi di libertà interni e restituisce le valutazioni delle N funzioni non lineari su tale vettore. Bisogna prestare particolare attenzione per la prima e l ultima componente del sistema, poiché esse sono funzione anche dei punti estremi del x = e x N = L, che non sono dei gradi di libertà incogniti del sistema. Al fine di compattare la scrittura, decidiamo di creare un vettore ausiliario che compre anche i punti estremi x = [; x ; L], e calcoliamo le componenti di F su tale vettore ausiliario tramite un singolo ciclo for : function [y] = F_molle (x) K = ; b = -; L = 2; n = length (x); x = [; x; L]; y = zeros (n,); for j =: n i = j +; y(j) = - K*( -x(i -) + 2*x(i) - x(i +) ) +... b*( (x(i)-x(i -))^3 - (x(i+) -x(i ))^3 ); Si noti che, avo inserito un elemento in testa al vettore x, gli indici di tale vettore sono sfasati rispetto a quelli del vettore y (istruzione i = j+). 2. Si scriva la function J = J_molle(x) che restituisce la matrice Jacobiana J F valutata sul generico vettore x. Anche in questo caso, scegliamo di utilizzare la strategia di creare il vettore ausiliario che compre anche gli estremi per compattare la scrittura. Esso J F una matrice tridiagonale, la componente extradiagonale inferiore esiste solo dalla seconda riga in poi, quella extradiagonale superiore invece fino alla penultima riga. function [J] = J_molle (x) K = ; b = -; L = 2; n = length (x); x = [; x; L]; J = for zeros (n,n); j =: n i = j +; J(j,j) = -2*K + 3*b*(( x(i)-x(i -))^2 + (x(i+) -x(i ))^2); if (j > ) senza la creazione di tale vettore ausiliario, avremmo potuto calcolare la prima e l ultima componente di F all esterno del ciclo for, otteno una scrittura meno compatta 8
J(j,j -) = K - 3*b * (x(i) - x(i -))^2 ; if (j < n) J(j,j +) = K - 3*b * (x(i +) - x(i ))^2 ; 3. Si scriva la function [x,niter] = newton_molle(x,tol,nmax) che implementa il metodo di Newton per il sistema non lineare in esame. Seguo lo schema presentato nell introduzione del metodo, ad ogni iterazione si dovranno richiamare le funzioni appena implementate per la costruzione della matrice e del termine noto del sistema lineare, risolvere il sistema lineare con il comando \di Matlab e infine aggiornare la soluzione. L implementazione del metodo di Newton per sistemi in questo caso è la seguente: function [x, niter ] = newton_molle (x,tol, nmax ) niter = ; err = tol +; x = x; while ( err >= tol && niter < nmax ) J = J_molle (x); y = F_molle (x); dx = -J\y; x = x + dx; err = norm (dx ); niter = niter +; res = norm ( F_molle (x )); if (( niter == nmax && err > tol ) isnan ( res )) fprintf ( 'Non converge \n ') else fprintf ( ' Converge in %i iterazioni,... residuo finale pari a %g\n ',niter, res ); 4. Si risolva il sistema lineare con una tolleranza pari a, un numero massimo di iterazioni pari a e parto da un dato iniziale x sufficientemente vicino alla soluzione del problema x = [, 2,..., 9] T. In questo caso non è necessario fornire un dato iniziale relativamente vicino alla soluzione, ad esempio anche parto dal vettore nullo si giunge a convergenza. >> x = zeros (9,); >> tol = e - ; >> nmax = ; >> [x, niter ] = newton_molle (x,tol, nmax ) Converge in iterazioni, residuo finale pari a. 237 e -3 9