Professional Documents
Culture Documents
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
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
Numero di iterazioni : 21
Radice calcolata:
1.0000001884590590e+000
1.0000002545504860e+000
it soluzione xdiff fx
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
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
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
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
-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
J X h k k
F X , k 0,1, ...
k
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
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
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
[xvect,xdiff,fx,it]=Newtonxs(x0,nmax,toll,fun,Jac);
Newton
Iter xvect xdiff fx
....
5 1.000000000000000 1.000000000000000 7.276e-009 0.000e+000
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:
-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;
y x0
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
x 4 y y 2 g ( y )
X GX 1
y x g2 ( x )
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
it soluzione xdiff fx
15
>> z='4*x.*y+2*y-4'; 12
>> 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);
it soluzione xdiff fx
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
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
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.