You are on page 1of 58

a

11 -12a lezione di laboratorio

Calcolo Numerico

a.a. 2014-2015
Esercizio 1
Dato il sistema non lineare :
 f 1  x , y   x  0.25 y 2  1.25
F  x  0 : 
 f 2  x , y   0.25 x  y  1.25
2

a) separare graficamente le soluzioni;


b) utilizzare il metodo di punto fisso per approssimare le
soluzioni;
c) applicare quindi il metodo di Newton per risolvere lo
stesso problema.
d) Confrontare i risultati ottenuti nei due casi.
Punto a: per la separazione grafica si tenga conto che ognuna delle
equazioni rappresenta una funzione in forma implicita quindi per la
rappresentazione grafica si utilizza: ezplot
ezplot('x+0.25*y.^2-1.25', [-6 2 -6
2])

hold on
ezplot('0.25*x.^2+y-1.25', [-6 2 -6
2])
hold
In modooff
meno efficiente, si possono esplicitare
di f1 e f2 ricordando che per f1 deve essere
verificata la condizione: 1.25  x  0
ed utilizzare: fplot
% MATLAB7
fplot(@(x)[2*sqrt(1.25-x) -2*sqrt(1.25-x)],[-6,1.25],'b')
hold on
fplot(@(x)1.25-0.25*x.^2, [-6 2 –6 2],'r')
grid,hold off

Le soluzioni sono:
1  D =  -5.5,-4 x  -5.5,-4 e  2  D =  0,1.5 x  0,1.5
Punto b: applichiamo il metodo del punto fisso verificandone
preventivamente le ipotesi.
 g1 ( x , y ) 
 x  1.25  0.25 y 2
 g1 ( y )
x  G  x    
 g2 ( x , y ) 
 y  1.25  0.25 x 2
 g2 ( x )
Le ipotesi 1,2 seguenti assicurano la
convergenza del metodo di punto fisso
1. G continua e derivabile con continuità
 g1 g1 
G  x y 
2.  0    1 : J        x   x, y   D
 x  g 2 g 2 
 x y 

Per questioni numeriche verifichiamo anche la
condizione: 3. G( D)  D
Indichiamo:  i j  max J i j
 x , y  D
Punto b: verifica delle ipotesi per 1
1  D1 =  -5.5,-4 x  -5.5,-4
 y2 5
L’ipotesi 2 per la radice in esame  x  
F  x  0 :  2
4 4
non è soddisfatta, quindi bisogna
cambiare funzione di iterazione. x  y  5
 4 4

 g1 ( x , y ) 
 x   5  4 y  g1 ( y )
x  G  x   
 g2 ( x , y )  y   5  4 x  g2 ( x )

con
5  4 y  0  y  1.25
5  4 x  0  x  1.25
Condizioni verificate in D1.
Verifica delle ipotesi 1, 2
Hp.1 g1 , g2  C 1
 D1  , D1   5.5, 4   5.5, 4
Hp.2  2 
 0 
5 4y 
J  , J 1 2  0, J 2 1  0
 2 
 0 
 5  4x 
4
 
J 12  0  J 12  J 12  4   12  0.4364  1
5  4 y
3/ 2

4
 
J 21  0  J 21  J 21  4    21  0.4364  1
5  4x
3/ 2

N.B. la valutazione di J 12 e J 21 è stata fatta solo nel punto -4


perché entrambe le funzioni sono crescenti e positive!!!
Verifica dell’ ipotesi 2. e della condizione 3.
   max  12 ,  21   0.4364  1
Il metodo di punto fisso converge!!
Verifichiamo ora la condizione 3.
dg1 2
  0 y  D1  g1 crescente quindi:
dy 54y
g1  D1    5.2, 4.58    5.5, 4 
dg2 2
  0 x  D  g2 crescente quindi:
dx 5  4x
g2  D    5.2, 4.58    5.5, 4 
OK condizione 3.!!!!
Verifica delle ipotesi 1, 2 per 2
Hp. 1 g1 , g2  C 1
 D2  , D2   0,1.5   0,1.5
 0 0.5 y   J 11 J 12 
Hp. 2 J   ,
 0.5 x 0   J 21 J 22 

J 12  0.5 y  J 12  J 12  1.5   12  0.75  1

J 21  0.5 x  J 21  J 21  1.5   21  0.75  1

N.B. la valutazione di J 12 e J 21 è stata fatta solo nel punto 1.5


perché entrambe le funzioni sono crescenti e positive!!!
Verifica dell’ipotesi 2. e della condizione 3.
   max  12 ,  21   0.75  1
Il metodo di punto fisso converge!!
Verifichiamo ora la condizione 3.
dg1
 0.5 y  0 y  D2  g1 decrescente
dy
g1  D2    0.69,1.25    0,1.5 
dg2
 0.5 x  0 x  D2  g2 decrescente
dx
g2  D2    0.69,1.25    0,1.5 
OK condizione 3!!!!! Siamo sicuri che le iterate cadono in
[0,1.5]
Istruzioni Matlab per il calcolo di  2
x0=[0 0.5];nmax=30;toll=1.e-6;v1=0.25;v1s=num2str(v1);
v2=1.25;v2s=num2str(v2);f1= ['x(1)+' v1s '*x(2)^2-' v2s];
f2=[ v1s '*x(1)^2+x(2)- ' v2s];fun=strvcat(f1,f2);
% x,y sono in x(1),x(2)
g1=[ v2s '-' v1s ' *x(2)^2 '];g2=[v2s '-' v1s '*x(1)^2']
g=strvcat(g1,g2);
% Si calcolano i valori chiamando sia la function per
% la versione del metodo in parallelo sia quella in serie
[xvect,xdiff,fx,it]=Punto_fissoxs(x0,nmax,toll,fun,g);
iter=0:it;
tab=[iter' xvect xdiff fx];
fprintf(' it \t\t\t soluzione \t\t x_diff fx\n')
fprintf('%2d %19.15f %19.15f %13.3e %13.3e\n',tab')
% versione in serie
[xvects,xdiffs,fxs,its]=Punto_fissoxs_serie(x0,nmax,toll,f
un,g);
iters=0:its;
tabs=[iters' xvects xdiffs fxs];
fprintf(' its \t\t\t soluziones \t\t x_diffs fxs\n')
fprintf('%2d %19.15f %19.15f %13.3e %13.3e\n',tabs')
Risultati e tabella: metodo in parallelo

Numero di iterazioni : 21
Radice calcolata:
1.0000001884590590e+000
1.0000002545504860e+000

it soluzione xdiff fx

0 0.000000000000000 0.500000000000000 0.000e+000 1.188e+000


1 1.187500000000000 1.250000000000000 1.188e+000 3.525e-001
2 0.859375000000000 0.897460937500000 3.525e-001 1.893e-001
3 1.048640966415405 1.065368652343750 1.893e-001 9.028e-002
4 0.966247408650815 0.975088030888841 9.028e-002 4.605e-002
.... .... .... .... ....
19 1.000000753836095 1.000001018201685 2.790e-006 1.395e-006
20 0.999999490898898 0.999999623081811 1.395e-006 6.976e-007
21 1.000000188459059 1.000000254550486 6.976e-007 3.488e-007
Risultati e tabella: metodo in serie
Numero di iterazioni : 11
% sono di meno rispetto al metodo in parallelo!!!
Radice calcolata:
1.0000001884590590e+000
9.9999990577046161e-001
its soluziones xdiffs fxs

0 0.000000000000000 0.500000000000000 0.000e+000 1.188e+000


1 1.187500000000000 0.897460937500000 1.188e+000 1.389e-001
2 1.048640966415405 0.975088030888841 1.389e-001 3.634e-002
3 1.012300833004331 0.993811755874685 3.634e-002 9.216e-003
4 1.003084548471319 0.998455347154522 9.216e-003 2.313e-003
5 1.000771729934636 0.999613986140909 2.313e-003 5.788e-004
6 1.000192969677871 0.999903505851740 5.788e-004 1.447e-004
7 1.000048244746350 0.999975877044936 1.447e-004 3.618e-005
8 1.000012061332053 0.999993969297605 3.618e-005 9.046e-006
9 1.000003015342105 0.999998492326674 9.046e-006 2.262e-006
10 1.000000753836095 0.999999623081811 2.262e-006 5.654e-007
11 1.000000188459059 0.999999905770462 5.654e-007 1.413e-007
Rappresentazione di superficie: ezsurf
figure(1)
z='X.*exp(-(X.^2+Y.^2))';
ezsurf(z,[-2,2,-2,2]);
% se non si specifica
% l’insieme la superficie
% è disegnata nel ezsurf
0.4
% dominio di default
% -2*pi<x<2*pi,-2*pi<y<2*pi
0.5
0.3

colorbar; 0.2
title(' ezsurf')
0.1
0
0

-0.1

-0.5 -0.2
2
1 2 -0.3
0 1
0
-1 -0.4
-1
Y -2 -2 X
Osservazioni:ordine delle variabili
%ezsurf rappresenta le variabili delle espressioni stringhe
% secondo l’ordine alfabetico!!!!!
figure(2)
ezsurf('sin(x).*exp(-y)',[0 pi 0 pi]);
figure(3)
% se le variabili non seguono l’ordine alfabetico la superficie
% risulta modificata (in questo esempio solo nell’orientamento
% poiché le variabili sono in un quadrato):
ezsurf('sin(z).*exp(-t)',[0 pi 0 pi]);

Figure 3

Figure 2
Come intervenire sull’ordine
Per evitare inconvenienti, si può procedere in due modi:
a) Porre attenzione all’ordine alfabetico delle variabili scrivendo ad esempio:
ezsurf('sin(t).*exp(-z)',[0 pi 0 pi]);
b) Imporre l’ordine delle variabili all’interno di ezsurf :
ezsurf(@(z,t)sin(z).*exp(-t),[0 pi 0 pi]);

a) b)
Comando ezsurf
Il comando ezsurf permette di rappresentare anche
superfici date in coordinate parametriche ad esempio:
x = 2 cos(s), y = 2 sin(s), z = z
figure(4)
funx='2*cos(s)';
funy='2*sin(s)';
funz='z'; 5

ezsurf(funx,funy,funz)
0
z

-5

2
1 2
0 1
-1 0
-1
y -2 -2
x
Comando ezplot3
Esegue il plot in 3D di una curva assegnata in coordinate
parametriche.
Sintassi: ezplot(fun(x),fun(y),fun(z),[tmin,tmax])
Se non si specifica l’intervallo assume per default [0,2pi]
ezplot3('sin(t)','cos(t)','t',[0,10*pi])
x = sin(t), y = cos(t), z = t

40

30

20
z
10

0
1
Se si desidera animare la figura, 0 0.5
1
0
si può scrivere: -1 -1
-0.5
y x

ezplot3(fun(x),fun(y),fun(z),[tmin,tmax],'
animate')
Comando ezcontour
Il comando ezcontour permette di tracciare le linee di livello nel
dominio fissato, se questo non viene fornito il comando assume per
default, il dominio di : -2*pi<x<2*pi,-2*pi<y<2*pi

X exp(-(X. 2+Y.2))
2

figure(5) 1.5
z='X.*exp(-(X.^2+Y.^2))';
1
ezcontour(z,[-2,2,-2,2]);
0.5

0
Y

-0.5

-1

-1.5

-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
X
Comando surf
% Le seguenti istruzioni servono per le quattro rappresentazioni
che diamo di seguito.
x=-2:.2:2;y=-2:.2:2;
[X,Y]=meshgrid(x,y); ***
Z=X.*exp(-(X.^2+Y.^2));
surf
0.4

% comando surf 0.5


0.3

figure(6) 0.2

*** 0.1

surf(X,Y,Z);colorbar0 0
title('surf')
-0.1

-0.5 -0.2
2
1 2 -0.3
0 1
0
-1 -1 -0.4
-2 -2
Azione del comando meshgrid
Trasforma il dominio specificato dai vettori x e y nelle matrici X e Y che
possono essere usate per la valutazione di funzioni in 2 variabili e per il
plot di superfici 3-D. Le righe della matrice X in uscita sono copia del vettore
x, le colonne della matrice Y in uscita sono copia del vettore y.
N. B. Le matrici X e Y hanno tante colonne quante sono le componenti di x e
tante righe quante sono le componenti di y. Esse hanno le stesse dimensioni e,
sovrapposte, rappresentano la griglia su cui calcolare la funzione in due variabili.
x = [1 2 3];y = [5 7 9 11];
[X Y]=meshgrid(x,y);f=X.*Y;

X Y X.*Y
x 1 2 3 5 5 5 1*5 2*5 3*5
x 1 2 3 7 7 7 1*7 2*7 3*7
x 1 2 3 9 9 9 1*9 2*9 3*9
x 1 2 3 11 11 11 1*11 2*11 3*11
y y y
Ancora sull’utilizzo del comando meshgrid

Calcolare in [0,3]x[1,2],la funzione Z(x,y)=y*exp(x)


utilizzando passo h= 0.5 sull’asse x e passo k=0.25 sull’asse y.
x=0:0.5:3;y=1:0.25:2; X
[X,Y]=meshgrid(x,y) 0 0.5 1 1.5 2 2.5 3
Z=Y.*exp(X) 0 0.5 1 1.5 2 2.5 3
0 0.5 1 1.5 2 2.5 3
0 0.5 1 1.5 2 2.5 3
0 0.5 1 1.5 2 2.5 3

Y
1.00 1.00 1.00 1.00 1.00 1.00 1.00
1.25 1.25 1.25 1.25 1.25 1.25 1.25
1.50 1.50 1.50 1.50 1.50 1.50 1.50
1.75 1.75 1.75 1.75 1.75 1.75 1.75
2.00 2.00 2.00 2.00 2.00 2.00 2.00
Nodi del Reticolo costruito con meshgrid
X Y
0 0.5 1 1.5 2 2.5 3 1.00 1.00 1.00 1.00 1.00 1.00 1.00
0 0.5 1 1.5 2 2.5 3 1.25 1.25 1.25 1.25 1.25 1.25 1.25
0 0.5 1 1.5 2 2.5 3 1.50 1.50 1.50 1.50 1.50 1.50 1.50
0 0.5 1 1.5 2 2.5 3 1.75 1.75 1.75 1.75 1.75 1.75 1.75
0 0.5 1 1.5 2 2.5 3 2.00 2.00 2.00 2.00 2.00 2.00 2.00

Punti (nodi) del reticolo su cui si calcola la funzione


z(x,y)
(0,1.00) (0.5,1.00) (1,1.00) (1.5,1.00) (2,1.00) (2.5,1.00) (3,1.00)

(0,1.25) (0.5,1.25) (1,1.25) (1.5,1.25) (2,1.25) (2.5,1.25) (3,1.25)

(0,1.50) (0.5,1.50) (1,1.50) (1.5,1.50) (2,1.50) (2.5,1.50) (3,1.50)

(0,1.75) (0.5,1.75) (1,1.75) (1.5,1.75) (2,1.75) (2.5,1.75) (3,1.75)

(0,2.00) (0.5,2.00) (1,2.00) (1.5,2.00) (2,2.00) (2.5,2.00) (3,2.00)


Reticolo costruito con meshgrid

1
(0, 1) (0.5, 1) (1, 1) (1.5, 1) (2, 1) (2.5, 1) (3, 1)

1,25
(0, 1.25) (0.5, 1.25) (1, 1.25) (1.5, 1.25) (2, 1.25) (2.5, 1.25) (3, 1.25)

1,5
t

(0, 1.5) (0.5, 1.5) (1, 1.5) (1.5, 1.5) (2, 1.5) (2.5, 1.5) (3, 1.5)

1,75
(0, 1.75) (0.5, 1.75) (1, 1.75) (1.5, 1.75) (2, 1.75) (2.5, 1.75) (3, 1.75)

2
0 (0, 2) 0.5 (0.5, 2) 1 (1, 2) 1.5 (1.5, 2) 2 (2, 2) 2.5 (2.5, 2) 3 (3, 2)
x
Valutazione della funzione
Valori della funzione Z nei nodi
1.0000 1.6487 2.7183 4.4817 7.3891 12.1825 20.0855

1.2000 1.9785 3.2619 5.3780 8.8669 14.6190 24.1026

1.4000 2.3082 3.8056 6.2744 10.3447 17.0555 28.1198

1.6000 2.6380 4.3493 7.1707 11.8225 19.4920 32.1369

1.8000 2.9677 4.8929 8.0670 13.3003 21.9285 36.1540

2.0000 3.2974 5.4366 8.9634 14.7781 24.3650 40.1711


Comando contour
contour
2

-1

-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

figure(7)
***
contour(X,Y,Z,20)% si specifica il numero di curve
% Oppure:
contour(X,Y,Z,[-.4:.04:.4])% si specificano i valori su
% cui si vogliono le curve
title('contour')
Comandi gradient e quiver quiver
2.5

1.5

0.5

-0.5

-1

-1.5

-2

-2.5
-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2

figure(8)
***
% calcolo del gradiente: a)si specifica lo step di calcolo
% del gradiente, b)non si specifica [px,py]=gradient(Z);
[px,py]=gradient(Z,.2,.2); % a)
quiver(X,Y,px,py) % rappresentazione del gradiente in ogni
% punto
title('quiver')
contour e quiver
2

-1

-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

figure(9)
***
[px,py]=gradient(Z,.2,.2);
contour(X,Y,Z,20);hold on
quiver(X,Y,px,py);hold off
Comando plot3
È l’analogo in 3-D di plot. Permette di tracciare nello spazio le
curve i cui punti hanno coordinate assegnate mediante le
componenti di tre vettori x,y,z assegnati.
Sintassi del comando: plot3(x,y,z)

35

30

25

20

15

10

0
1

0.5 1
0.8
0.6
0 0.4
0.2
0
-0.5 -0.2
-0.4
-0.6
-1 -0.8
-1

% rappresentazione dell’elica
t = 0:pi/50:10*pi;
plot3(sin(t),cos(t),t);
Seguito Esercizio 1. Punto c: metodo di Newton

Indichiamo alla k- X  k   x  k  , y k  ;
esima iterazione:
  : F     0,   D
Teorema di convergenza
  F  
Hp. F  C (D ), det  J     0  X   x, y   D
2

  X  
Th.  I     D :  X 
0
 I ( ),

 X
k  1
 X
k
 h
k
   ; ordine  2.
k 

Come si ottiene il vettore all’iterazione (k+1)-esima?


1- Si risolve il sistema lineare all’iterazione k-esima:
Vettore incognito:

J X h k k
 F  X  , k  0,1, ...
k

2- Si aggiunge la soluzione di tale sistema al vettore dell’iterazione


precedente:  k  1 k k
X  X h k  0,1, ...
Punto c: verifica ipotesi per il calcolo di 2
f1 , f 2  C  D2 
2

 f1 , f 2  1 0.5 y
det J    1  0.25 xy  0 x , y  D2
 x , y  0.5 x 1
D2 =  0,1.5    0,1.5 
1-0.25 x y
1

1 0.9
% verifica grafica
0.8
% della condizione: 0.8

% det  J   0 0.6 0.7

0.4 0.6
ezsurf('1-0.25*x*y', 1.5
1 1.5
0.5
[0 1.5 0 1.5]);colorbar 0.5 0.5
1

y 0 0
x

Dalla figura si evince che la condizione sul determinante jacobiano è


verificata per la seconda radice.
L’ ipotesi det J   0 è verificata anche per la prima
radice; infatti

1  D1 =  -5.5,-4 x  -5.5,-4
1-0.25 x y
-3

-3.5

-3
-4

-4
-4.5

-5
-5

-6
-5.5

-4
-4 -6
-4.5
-4.5
-5
-5 -6.5

y -5.5 -5.5
x

ezsurf('1-0.25*x*y',[-5.5 -4, -5.5 -4]);


colorbar
Istruzioni Matlab per il calcolo della seconda radice col
metodo di Newton
x0=[0 0.5];nmax=30;toll=1.e-6;
v1=0.25;v1s=num2str(v1);v2=1.25;v2s=num2str(v2);
v3=0.5;v3s=num2str(v3);
fun=strvcat(['x(1)+' v1s '*x(2)^2-' v2s],[v1s '*x(1)^2 +x(2)-'
v2s]);
Jac=strvcat('1',[v3s '*x(2)'],[v3s '*x(1)'],'1');
% Jacobiana in forma di vettore di stringhe

[xvect,xdiff,fx,it]=Newtonxs(x0,nmax,toll,fun,Jac);

Numero di iterazioni : 5 sono in numero <11 !!


Radice calcolata:
9.9999999999999978e-001
1.0000000000000002e+000
Tabella relativa al metodo di Newton
iter=0:it;tab=[iter' xvect xdiff fx];
fprintf(' it \t\t\t soluzione \t\t\t\t x_diff
\t\t\t fx\n')
fprintf('%2d %19.15f %19.15f %13.3e %13.3e\n',
tab')
it soluzione xdiff fx

0 0.000000000000000 0.500000000000000 0.000e+000 1.188e+000


1 1.000000000000000 1.250000000000000 1.000e+000 2.500e-001
2 1.022727272727273 0.988636363636364 2.614e-001 1.708e-002
3 0.999957777899971 1.000150723078011 2.277e-002 1.296e-004
4 1.000000007275583 0.999999996808039 1.507e-004 5.680e-009
5 1.000000000000000 1.000000000000000 7.276e-009 0.000e+000

Si consigliano gli studenti di determinare con gli stessi metodi


l’approssimazione di 
1
Confronto tra i metodi
toll=1.e-6
Punto fisso parallelo
Iter xvect xdiff fx
....
21 1.000000188459059 1.000000254550486 6.976e-007 3.488e-007

Punto fisso serie


Iter xvect xdiff fx
....
11 1.000000188459059 0.999999905770462 5.654e-007 1.413e-007

Newton
Iter xvect xdiff fx
....
5 1.000000000000000 1.000000000000000 7.276e-009 0.000e+000

Con il metodo di Newton si ottiene una soluzione con precisione eps


Funzione fsolve di MATLAB: risolve sistemi non lineari
in più variabili
1. Si può creare una function F=fun(x)
function esterna: F=[x(1)^2+x(2)^2-4*x(2)
x(2)^2-x(1)];
x0(1)=1;x0(2)=1;
x=fsolve(@fun,x0) % versione per MATLAB7

x0(1)=1;x0(2)=1;
G='fun';
x=fsolve(G,x0) % versione per MATLAB6
Il punto x che si ottiene è
x =
1.901080394752361e+000 1.378796744940657e+000
E’ possibile in uscita avere anche il valore della
funzione F nel punto x soluzione scrivendo a primo
membro:

[x,f_eval]= … % il secondo membro è uno dei precedenti a


% seconda della versione di Matlab utilizzata
Altra modalità per poter utilizzare fsolve
2. Si può scrivere la funzione direttamente nella chiamata:
[x, f_eval]=fsolve(@(x) [ 2*x(1) - x(2) - exp(-
x(1));-x(1) + 2*x(2) - exp(-x(2))],[-5,5])

La risposta in questo caso è la seguente:


Optimization terminated: first-order optimality
is less than options.TolFun.
x = 0.5671 0.5671
f_eval = 1.0e-009 *
-0.0957
-0.1403
Anche per la function fsolve è possibile usare il comando
options come già descritto per la function fzero per modificare i
valori dei parametri di default che si possono conoscere digitando
optimset per i dettagli
Struttura options
Alcune delle options usate sono: Display, TolX, TolFun,
DerivativeCheck, Diagnostics, FunValCheck,
Jacobian, JacobMult,JacobPattern, LineSearchType,
NonlEqnAlgorithm,MaxFunEval, MaxIter,etc.
Usare l’option Jacobian per specificare che Fun restituisce anche
J che è la matrice Jacobiana nel punto X. Se Fun restituisce un
vettore F di m componenti quando X ha lunghezza n, allora J è una
matrice mxn e J(i,j) è la derivata parziale di F(i) rispetto a
x(j). N. B. La matrice Jacobiana è il trasposto del gradiente di F.
La chiamata che permette di visualizzare la matrice Jacobiana
valutata nel punto trovato X, è ad esempio:
[X,Feval,Exitflag,Output,Jacob]=fsolve(Fun,X0)
e restituisce anche il numero di iterazioni effettuate per raggiungere
il risultato.
Esempio
[x Feval,Exitflag,Output,Jacob] = fsolve(@(x)sin(3*x),[1
4]) % N.B. x=[x(1),x(2)], poiché x0=[1,4]!!!
Restituisce:
x = Feval =
1.0472 4.1888 1.0e-012 *

-0.0003 0.4614
Exitflag =
1
Output =
iterations: 3
funcCount: 12
algorithm: 'trust-region dogleg'
firstorderopt: 1.3841e-012
message: [1x76 char]
Jacob = -3.0000 0
0 3.0000
Esercizio 2
Dato il sistema non lineare :

 x 2
 y 2
4y  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
x2  y2  4y  0 Circonferenza:C=(0,2),R = 2

y x0
2 Parabola simm.rispetto l’asse x
ezplot('x.^2+y.^2-4*y',
[0 4 0 4]), grid
hold on
ezplot('y.^2-x' , [0 4 0
4])
title('x.^2+y.^2-4*y=0,
y.^2-x=0')
hold off

Le soluzioni sono (0,0), che è banale e quindi non ha bisogno di


essere calcolata numericamente e
  D  1, 2  1, 2 
Rappresentazione di F ( x ) in [1,2] x [1,2]

ezplot('x.^2+y.^2-4*y', [1 2 1 2]), grid


hold on
ezplot('y.^2-x',[1 2 1 2])
title('x.^2+y.^2-4*y=0, y.^2-x=0')
Metodo di punto fisso
1- Si determina il problema consistente:

 x  4 y  y 2  g ( y )
X  GX  1

 y  x  g2 ( x )

N.B. Per le funzioni di iterazione si sceglie la


determinazione positiva della radice poiché la
soluzione ha entrambe le coordinate positive.
Punto b: convergenza del metodo di punto fisso
Ipotesi di Convergenza del metodo di punto fisso

1. G continua e derivabile con continuità;


 g1 g1 
 g1 , g2   x y 
2.  0    1 : J       x D
 x, y   g 2 g 2 
 x y 

Per utilità di calcolo,aggiungiamo la
condizione 3. G( D)  D

Indichiamo:  i j  max J i j
 x , y  D
Verifica dell’ ipotesi 1. e della condizione 3.
 x  4 y  y 2  g ( y )  C 1  D 
1
Hp.1 
 y  x  g2 ( x )  C  D 
1 OK ipotesi 1!!!

dg1 2 y
  0 y  D  g1 crescente
dy 4y  y 2

 
Ne consegue: g1 D   3, 2   1, 2
   
E’ banale verificare
che g2 è crescente; perciò:  g2  D   1, 2   [1, 2]

La condizione 3. e verificata!!
Verifica dell’ipotesi 2 per la convergenza
 2 y 
 0 2 
4y  y  2 y
J  , J 12   0, J 21  0
 1  4 y  y2
 0 
2 x 
4
 
J 12  0  J 12  J 12  1  12  1 / 3  1
 
3/ 2
4 y  y2
1
 
J 21 3/ 2  0  J 21  J 21  1   21  1 / 2  1
4x
1
   max  12 ,  21   1
3
Il metodo di punto fisso converge!!
Istruzioni e risultati: metodo punto fisso
x0=[1 1];nmax=30;toll=1.e-6;
f1='x(1)^2+x(2)^2-4*x(2)';f2='-x(1)+x(2)^2';
% x,y sono in x(1),x(2)
fun=strvcat(f1,f2);
g=strvcat('sqrt(4*x(2)-x(2)^2)','sqrt(x(1))');
xvect,xdiff,fx,it]=Punto_fissoxs(x0,nmax,toll,…
fun,g);
% il metodo è usato in parallelo
Numero di iterazioni : 15
Radice calcolata:
1.9010802796691053e+000
1.3787965146159946e+000
Risultati e tabella: metodo di punto fisso usato
in parallelo
iter=0:it;
tab=[iter' xvect xdiff fx];
fprintf(' it soluzione x_diff fx\n')
fprintf('%2d %19.15f %19.15f %13.3e %13.3e\n',
tab')

it soluzione xdiff fx

0 1.000000000000000 1.000000000000000 0.000e+000 2.000e+000


1 1.732050807568877 1.000000000000000 7.321e-001 7.321e-001
2 1.732050807568877 1.316074012952492 3.161e-001 5.322e-001
.... .... .... .... ....
14 1.901079828717214 1.378796514615995 1.380e-006 1.715e-006
15 1.901080279669105 1.378796514615995 4.510e-007 4.510e-007
Risultati e tabella: metodo di punto fisso usato
in serie
Numero di iterazioni : 8 % sono di meno
% del metodo in parallelo!
Radice calcolata:
1.9010802796691053e+000
1.3787966781469649e+000

it soluzione xdiff fx

0 1.000000000000000 1.000000000000000 0.000e+000 2.000e+000


1 1.732050807568877 1.316074012952492 7.321e-001 5.322e-001
2 1.879426839289333 1.370921893941932 1.474e-001 7.202e-002
3 1.898489066726062 1.377856693102030 1.906e-002 8.677e-003
4 1.900772923229405 1.378685215424248 2.284e-003 1.030e-003
5 1.901043907559104 1.378783488282009 2.710e-004 1.221e-004
6 1.901076023090326 1.378795134561450 3.212e-005 1.447e-005
7 1.901079828717214 1.378796514615995 3.806e-006 1.715e-006
8 1.901080279669105 1.378796678146965 4.510e-007 2.032e-007
Punto c: metodo di Newton
Indichiamo: X
k
  x  , y
k k

Hp.   : F     0,   D;
  f1 , f 2  
F  C (D ), det  J 
2
 0   x, y   D
  x, y  
Th.  I    D :  X
 0
 I ( ),  X
 k  1
 X
k
h
k
 
k 

Per ottenere l’approssimazione alla k+1-esima iterazione, si risolve il


sistema lineare:
J X h
k k k
 F X 
la soluzione di tale sistema, aggiunta al vettore della precedente
iterazione, fornisce il vettore soluzione approssimata all’iterazione
k+1:  k  1 k k
X  X h k  0,1, ...
Verifica delle ipotesi
La funzione F  x , y    f1  x , y  , f 2  x , y    C 2  D 
T

Il determinante della matrice Jacobiana è dato da:


det  J   4 xy  2 y  4
4 x y+2 y-4
16

la cui rappresentazione è in Matlab: 14

15
>> z='4*x.*y+2*y-4'; 12

>> ezsurf(z,[1 2 1 2]) 10


10

>> colorbar 5 8

0 6
2
2 4
1.5
1.5
Dalla barra dei colori deduciamo che det(J) 2
y 1 1 x
è non nullo.
Istruzioni, risultati del 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
Risultati e Tabella per il metodo di Newton
iter=0:it;
tab=[iter' xvect xdiff fx];
fprintf(' it soluzione x_diff fx\n')
fprintf('%2d %19.15f %19.15f %13.3e %13.3e\n’, tab')

it soluzione xdiff fx

0 1.000000000000000 1.000000000000000 0.000e+000 2.000e+000


1 3.000000000000000 2.000000000000000 2.000e+000 5.000e+000
2 2.166666666666667 1.541666666666667 8.333e-001 9.045e-001
3 1.927083333333333 1.395833333333333 2.396e-001 7.867e-002
4 1.901399523614772 1.379015003483898 2.568e-002 9.425e-004
5 1.901080391293387 1.378796735902042 3.191e-004 1.495e-007
6 1.901080340288140 1.378796700129552 5.101e-008 2.665e-015

La cifre cerchiate della soluzione approssimata alla iterazione 6, si


possono considerare corrette; si sono infatti assestate dall’iterazione
Precedente.
Esercizio 3: calcolo dell’estremo relativo

Si consideri la seguente funzione: f  x, y   x 2 y  y 2  2 x.

Si determinino, utilizzando Matlab, i suoi estremi relativi.

Risoluzione
Sappiamo che gli estremi relativi coincidono con punti che annullano
il gradiente della funzione. In questo caso dobbiamo risolvere il
sistema non lineare:  f
 x  2 xy  2  0

 f  x2  2 y  0
 y
Seguito risoluzione
Il sistema può risolversi analiticamente ricavando y dalla prima
equazione e sostituendo l’espressione trovata nella seconda equazione:

 1  1  1

 y  y  x  2 3
 x  x  1
.

 x 2
 2 y  0  x 3
 2  0   


3
 y 2

N.B. Si è potuto dividere per x che deve essere diversa da 0 poiché


x=0 non è soluzione dell’equazione.
Se ne deduce che esiste un unico punto estremale (cioè azzera il
gradiente) per la funzione che può essere un estremo oppure un
punto di sella.
A questo punto procediamo numericamente.
Risoluzione numerica
Rappresentiamo le curve definite implicitamente dalle equazioni
del sistema in D=[-2 2]x[-2 2]

clear all;clc;close all


D=[-2 2 -2 2];
ezplot('2*x*y-2',D),grid
hold on
ezplot('x^2+2*y',D)
title('intersezione tra le curve')
hold off

Esaminando la figura che si ottiene ci rendiamo conto che si può


assumere come intervallo di lavoro il quadrato di lato 1
D1=[-1.5 -0.5]x[-1.5 -0.5]
Rappresentazione delle curve del sistema
intersezione tra le curve
2

1.5

0.5

0
y

-0.5

-1

-1.5

-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
x
Calcolo della soluzione del sistema:
metodo di Newton
x0=[-1.5 -1];nmax=10;toll=1e-12;
f1='2*x(1).*x(2)-2';f2='x(1).^2+2*x(2)';
fun=strvcat(f1,f2);
Jac=strvcat('2*x(2)', '2*x(1)','2*x(1)','2');
[xvect,xdiff,fx,it]=Newtonxs(x0,nmax,toll,fun,Jac
);
Numero di iterazioni : 5
Radice calcolata:
-1.2599210498948732e+000
-7.9370052598409979e-001

Il valore vero della soluzione è:


x=-2^(1/3)= - 1.259921049894873e+000
y= 1/x = -7.937005259840997e-001
Quindi l’approssimazione è stata ottenuta con una
precisione dell’ordine di quella della macchina.
Il punto estremale trovato è un estremo?
Per rispondere al quesito posto, dobbiamo calcolare il determinante
della matrice hessiana nel punto trovato.

H=[2*xvect(end,2) 2*xvect(end,1);2*xvect(end,1)
2];
d=det(H);

d =

-9.524406311809196e+000
Poiché questo determinante è < 0, il punto estremale trovato non è
estremo relativo ma è una sella per la funzione.

You might also like