a 6 lezione - laboratorio Corso di Laurea ING. MECCANICA a.a 2004-2005 La scatola dei colori Avevo una scatola di colori Ogni colore splendeva di gioia Avevo una scatola di colori Caldi e delicati e vivi. Non avevo il rosso per le ferite e per il sangue, Non avevo il nero per l’orfano, Non avevo il bianco per il viso dei morti, Non avevo il giallo per le sabbie infuocate, Avevo l’arancione per la gioia e per la vita, Avevo il verde per germogli e fioriture, Avevo il blu per limpidi cieli azzurri, Avevo il rosa per i sogni e per il riposo. Mi sedetti e dipinsi La PACE Tali Shurek Esercizio 1 Data l’equazione: f x sin x 0.5sin 2 x 0, x 1, 1 Si verifica facilmente che x = 0 è soluzione. b) Senza preoccuparsi delle ipotesi di convergenza, si approssimi tale soluzione, applicando il metodo di Newton e quello di bisezione per 15 iterazioni. c) Fare le dovute considerazioni. Punto b: metodo di Newton x0=-1; nmax=15; toll=1e-12; fun='sin(x)-0.5*sin(2*x)'; dfun='cos(x)-cos(2*x)'; [xvect,xdiff,fx,it,p,c]=newton(x0,nmax,toll,fun ,dfun); Superato il numero massimo di iterazioni Numero di Iterazioni Radice calcolata Ordine stimato Fattore di riduzione : : : : 15 -1.9309205276636407e-003 0.9999897626825431 0.6666198373211456 Tabella riassuntiva - Newton iter=0:it; fprintf('%2d 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 >> %23.15e %15.3e %15.3e\n',[iter' xvect xdiff fx]') -1.000000000000000e+000 -5.955642027988763e-001 -3.843266909954277e-001 -2.529596248184762e-001 -1.677278487209687e-001 -1.115548118641202e-001 -7.429254153014103e-002 -4.950555324952729e-002 -3.299695812958521e-002 -2.199597566746803e-002 -1.466339248533952e-002 -9.775419823703882e-003 -6.516894652077655e-003 -4.344581058363196e-003 -2.896382816341328e-003 -1.930920527663641e-003 0.000e+000 4.044e-001 2.112e-001 1.314e-001 8.523e-002 5.617e-002 3.726e-002 2.479e-002 1.651e-002 1.100e-002 7.333e-003 4.888e-003 3.259e-003 2.172e-003 1.448e-003 9.655e-004 3.868e-001 9.658e-002 2.735e-002 7.965e-003 2.343e-003 6.920e-004 2.047e-004 6.063e-005 1.796e-005 5.320e-006 1.576e-006 4.671e-007 1.384e-007 4.100e-008 1.215e-008 3.600e-009 xvect ci mostra la lenta convergenza. Punto b: metodo di bisezione a=-1;b=1; nmax=15; toll=1e-12; fun='sin(x)-0.5*sin(2*x)'; [xvect,xdiff,fx,it,p,c]=bisezione(a,b,nmax,toll ,fun); Superato il numero massimo di iterazioni Numero di Iterazioni Radice calcolata Ordine stimato Fattore di riduzione : 15 : -6.1035156250000000e-005 : 1.0000000000000000 : 0.5000000000000000 Tabella riassuntiva - bisezione iter=1:it; fprintf('%2d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 >> %23.15e %15.3e %15.3e\n',[iter' xvect xdiff fx]') 0.000000000000000e+000 -5.000000000000000e-001 -2.500000000000000e-001 -1.250000000000000e-001 -6.250000000000000e-002 -3.125000000000000e-002 -1.562500000000000e-002 -7.812500000000000e-003 -3.906250000000000e-003 -1.953125000000000e-003 -9.765625000000000e-004 -4.882812500000000e-004 -2.441406250000000e-004 -1.220703125000000e-004 -6.103515625000000e-005 5.000e-001 2.500e-001 1.250e-001 6.250e-002 3.125e-002 1.563e-002 7.813e-003 3.906e-003 1.953e-003 9.766e-004 4.883e-004 2.441e-004 1.221e-004 6.104e-005 3.052e-005 0.000e+000 5.869e-002 7.691e-003 9.728e-004 1.220e-004 1.526e-005 1.907e-006 2.384e-007 2.980e-008 3.725e-009 4.657e-010 5.821e-011 7.276e-012 9.095e-013 1.137e-013 Confronto tra i due metodi Newton Iter xvect .... 15 -1.930920527663641e-003 xdiff fx 9.655e-004 3.600e-009 xdiff fx 3.052e-005 1.137e-013 Bisezione Iter xvect .... 15 -6.103515625000000e-005 Il valore ottenuto con la bisezione è più vicino alla soluzione vera x = 0!!! Motivo di tale comportamento? Newton Numero di Iterazioni Radice calcolata Ordine stimato Fattore di riduzione : : : : 15 -1.9309205276636407e-003 0.9999897626825431 0.6666198373211456 Bisezione Numero di Iterazioni Radice calcolata Ordine stimato Fattore di riduzione : 15 : -6.1035156250000000e-005 : 1.0000000000000000 : 0.5000000000000000 La radice è multipla? f x sin x 0.5sin 2 x f 0 0 f x cos x cos 2 x f 0 0 f x sin x 2sin 2 x f 0 0 f x cos x 4cos 2 x f 0 3 0 x = 0 è radice multipla con molteplicità m = 3. Grafico di f ( x ) Anche il grafico mostra che la radice x=0 è multipla fplot('sin(x)-0.5*sin(2*x)’,[-1,1]) grid title('Andamento di f(x)= sin(x)- 0.5*sin(2*x)') Modifica metodo di Newton: m noto f ( xk ) x k 1 x k m f ( x k ) x0=-1; nmax=15; toll=1e-12; fun='sin(x)-0.5*sin(2*x)'; dfun='cos(x)-cos(2*x)'; mol=3; [xvect,xdiff,fx,it,p,c]=newton_m(x0,nmax,toll, fun,dfun,mol); Arresto per azzeramento di dfun Iter xvect .... 3 7.266362938868759e-010 xdiff 1.634e-003 fx 0.000e+000 Modifica del problema: f x , x a, b f x F x 0 f x f ( x) 0, L’applicazione del metodo di Newton al problema F x f ( x ) implica: * F xk xk 1 =xk F xk f ( xk ) f ( xk ) xk 1 xk 2 f ( xk ) f ( xk ) f ( xk ) fun='(sin(x)-0.5*sin(2*x))./(cos(x)-cos(2*x))'; dfun='1-((sin(x)-0.5*sin(2*x)).*(-sin(x)+2* sin(2*x)))./(cos(x)-cos(2*x)).^2'; … Metodo di Newton (*): risultati [xvect,xdiff,fx,it,p,c]=newton(x0,nmax,toll,fun,dfun); Warning: Divide by zero. > In C:\analisi_numerica\prog_matlab_new\eq_non_lin\NEWTON.M at line 70 Warning: Divide by zero. > In C:\analisi_numerica\prog_matlab_new\eq_non_lin\NEWTON.M at line 62 Numero di Iterazioni : 5 Radice calcolata : NaN Iter xvect 0 -1.000000000000000e+000 1 -3.108031246559614e-001 2 -9.943189700371891e-003 3 -3.276824228314046e-007 4 -1.029850733179902e-010 5 NaN xdiff 0.000e+000 6.892e-001 3.009e-001 9.943e-003 3.276e-007 NaN fx 4.044e-001 1.053e-001 3.314e-003 1.092e-007 NaN NaN Semplificazione della F ( x ) Poiché: sin2 x 2sin x cos x f x sin x 1 cos x ; f x 1 cos x 1 2cos x f ( x) F x f ( x ) F x sin x 1 cos x 1 cos x 1 2cos x cos x 2 1 2cos x 2 , F 0 0 per x 0 Grafico di F(x) fplot('sin(x)/(1+2*cos(x))’,[-1,1]) grid title(‘F(x)=sin(x)/(1+2*cos(x))’) Grafico di F’(x) fplot('(cos(x)+2)/(1+2*cos(x))^2’,[-1,1]) grid title(‘DF(x)=(cos(x)+2)/(1+2*cos(x))^2’) Grafico di F’’(x) La derivata seconda non ha segno costante per la convergenza del metodo di Newton occorre prendere x 0 vicino alla soluzione!! fplot('(7+2*cos(x)) *sin(x)/(1+2*cos(x))^3',[-1,1]) grid title('F''''(x)= (7+2*cos(x)) *sin(x)/(1+2*cos(x))^3)') Risultati del problema modificato metodo Newton (*) x0=0.7; fun='sin(x)./(1+2*cos(x))'; dfun='(cos(x)+2)./(1+2*cos(x)).^2'; [xvect,xdiff,fx,it,p,c]=newton(x0,nmax,toll,fun,dfun); Numero di Iterazioni Radice calcolata Ordine stimato Fattore di riduzione : : : : 5 0.0000000000000000e+000 3.0020776453233839 0.3387128554185560 x0=-0.8; [xvect,xdiff,fx,it,p,c]=newton(x0,nmax,toll,fun,dfun); Numero di Iterazioni Radice calcolata Ordine stimato Fattore di riduzione : : : : 5 0.0000000000000000e+000 3.0052937675224145 0.3450700538122051 1. Utilizzo della function ‘fzero’ di Matlab 2 f x x 4 cos x 4 x sin x 0 >> alfa=fzero('(x^2-4)*cos(x)+4*x*sin(x)',0.8) alfa = 8.052563483762232e-001 2. f x sin x 0.5 sin 2 x 0 >> options=optimset('Tolx',1e-15); >> x=fzero('sin(x)-0.5*sin(2*x)',-0.1,options) x = 1.050493220693351e-008 Il risultato è meno preciso!! Esercizio 2: Sistema non lineare Dato il sistema non lineare : x 2 y 2 4 y 0 F x 0 : 2 y x 0 a) separare graficamente le soluzioni; b) utilizzare il metodo di punto fisso per approssimare la soluzione situata nel primo quadrante; c) applicare quindi il metodo di Newton per risolvere lo stesso problema. d) Confrontare i risultati ottenuti nei due casi. Punto a: separazione grafica x 2 y 2 4 y 0 Circonferenza:C=(0,2),R = 2 y x 0 Parabola simm.rispetto l’asse x fplot('2-sqrt(4-x^2)', [0,2]),grid hold on fplot('2+sqrt(4-x^2)', [0,2]) fplot('sqrt(x)',[0,4]), hold off %y=0:.01:4; %x2=0:.01:4; %x1=sqrt(-%y.^2+4*y); %y2=sqrt(x2); %plot(x1,y,x2,y2),grid La soluzione D = [1,2] x [1,2] 2 Grafico di F ( x ) in [1,2] x [1,2] fplot('2-sqrt(4x^2)', [1,2]),grid hold on fplot('2+sqrt(4x^2)', [1,2]) fplot('sqrt(x)',[ 1,2]) axis([1 2 1 2]) hold off Punto b: metodo di punto fisso 2 g1 ( x, y ) x 4 y y g1 ( y ) x Gx g 2 ( x, y) y x g 2 ( x) Convergenza del metodo di punto fisso 1. G continua e derivabile g1 2. G ( D ) D x g1 , g2 3. 0 1 : J g2 x, y x g1 y g2 y Indichiamo: i j max J i j x , y D x D Verifica delle ipotesi: Hp.1, Hp.2 Hp.1 Le funzioni g1 , g2 C 1 D dg1 2 y Hp.2 0 y D g1 crescente 2 dy 4y y g1 D 3, 2 1, 2 g2 è anche crescente g2 D 1, 2 [1, 2] Verifica delle ipotesi: Hp. 3 2 y 0 J 1 2 x J12 2 4y y 2 y , J12 0, J 21 0 4 y y2 0 4 4 y y J 21 2 1 4x 3/ 2 max 3/ 2 0 J12 J12 1 12 1/ 3 1 0 J 21 J 21 1 21 1/ 2 1 12 , 21 1 3 1 Il metodo di punto fisso converge!! Istruzioni metodo punto fisso x0=[1 1]; nmax=30; toll=1.e-6; fun=strvcat('x(1)^2+x(2)^2-4*x(2)', '-x(1)+x(2)^2'); % x,y sono in x(1),x(2) g=strvcat('sqrt(4*x(2)-x(2)^2)','sqrt(x(1))'); [xvect,xdiff,fx,it]=Punto_fissoxs(x0,nmax,toll, fun,g); .... while (it<nmax) & (norm(res_x,inf)>=toll) xap=x; for k=1:n x_new(k)=eval(g(k,:)); % x(k)=x_new(k); % da aggiungere per avere la % soluzione con metodo in serie end x=xap; .... Risultati e tabella: metodo in parallelo Numero di iterazioni : 15 Radice calcolata: 1.9010802796691053e+000 1.3787965146159946e+000 iter=0:it; tab=[iter' xvect xdiff fx]; fprintf('%2d %19.15f %19.15f %13.3e %13.3e\n', tab') it 0 1 2 .... 14 15 soluzione 1.000000000000000 1.732050807568877 1.732050807568877 .... 1.901079828717214 1.901080279669105 1.000000000000000 1.000000000000000 1.316074012952492 .... 1.378796514615995 1.378796514615995 xdiff 0.000e+000 7.321e-001 3.161e-001 .... 1.380e-006 4.510e-007 fx 2.000e+000 7.321e-001 5.322e-001 .... 1.715e-006 4.510e-007 Risultati e tabella: metodo in serie Numero di iterazioni : 8 % sono di meno! Radice calcolata: 1.9010802796691053e+000 1.3787966781469649e+000 it 0 1 2 3 4 5 6 7 8 soluzione 1.000000000000000 1.732050807568877 1.879426839289333 1.898489066726062 1.900772923229405 1.901043907559104 1.901076023090326 1.901079828717214 1.901080279669105 1.000000000000000 1.316074012952492 1.370921893941932 1.377856693102030 1.378685215424248 1.378783488282009 1.378795134561450 1.378796514615995 1.378796678146965 xdiff 0.000e+000 7.321e-001 1.474e-001 1.906e-002 2.284e-003 2.710e-004 3.212e-005 3.806e-006 4.510e-007 fx 2.000e+000 5.322e-001 7.202e-002 8.677e-003 1.030e-003 1.221e-004 1.447e-005 1.715e-006 2.032e-007 Punto c: metodo di Newton Indichiamo: x k k k x ,y : F 0, D Hp. f1 , f 2 F C (D ), det J 0 x, y 2 Th. I D : x 0 La soluzione del sistema: J x h x k 1 x k k 1 h x, y D I ( ) k k 1 F x per k k Istruzioni metodo di Newton x0=[1 1]; nmax=30; toll=1.e-6; fun=strvcat('x(1)^2+x(2)^2-4*x(2)', '-x(1)+x(2)^2'); Jac=strvcat('2*x(1)','2*x(2)-4','-1','2*x(2)'); % Jacobiana in forma di vettore di stringhe [xvect,xdiff,fx,it]=newtonxs(x0,nmax,toll,fun, Jac); Numero di iterazioni : 6 % Sono in numero < 8!! Radice calcolata: 1.9010803402881398e+000 1.3787967001295518e+000 Tabella riassuntiva del metodo di Newton iter=0:it; tab=[iter' xvect xdiff fx]; fprintf('%2d tab') it 0 1 2 3 4 5 6 %19.15f %19.15f %13.3e %13.3e\n’, soluzione 1.000000000000000 3.000000000000000 2.166666666666667 1.927083333333333 1.901399523614772 1.901080391293387 1.901080340288140 1.000000000000000 2.000000000000000 1.541666666666667 1.395833333333333 1.379015003483898 1.378796735902042 1.378796700129552 xdiff 0.000e+000 2.000e+000 8.333e-001 2.396e-001 2.568e-002 3.191e-004 5.101e-008 fx 2.000e+000 5.000e+000 9.045e-001 7.867e-002 9.425e-004 1.495e-007 2.665e-015