Sei sulla pagina 1di 87

UNIVERSITÀ DEGLI STUDI DI FERRARA

Dipartimento di Matematica e Informatica

Corso Matlab per


Analisi Matematica II
c.d.l. Ingegneria Civile e Ambientale1

Michele Miranda, Mattia Zanella

a.a. 2014-2015

1
versione aggiornata al 5 dicembre 2014
2
Indice

1 Curve 1
1.1 Richiami di algebra lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Alcuni disegni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.1 Curve nel piano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.2 Curve in coordinate polari . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.3 Curve nello spazio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Vettori tangenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Lunghezza d’arco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.1 Grafico di funzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.2 Curve parametrizzate . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5 Curvatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.6 Applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2 Funzioni di più variabili 13


2.1 Funzioni e loro grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.1 Funzioni discontinue . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Derivate parziali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 Piani tangenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Gradiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.1 Un esempio nel piano . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.2 Un esempio nello spazio . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3 Superfici 21
3.1 Superfici cartesiane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2 Rotazione di grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3 Superfici parametrizzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.1 Grafici di funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.2 Superfici di rotazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.4 Piano tangente ad una superficie parametrizzata . . . . . . . . . . . . . . . . 28

4 Punti stazionari e massimi e minimi 29


4.1 Classificazione di punti stazionari . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2 Massimo e minimo di una funzione . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.1 Massimo e minimo di una funzione di due variabili su di un rettangolo 31
4.2.2 Massimi e minimi su cerchi . . . . . . . . . . . . . . . . . . . . . . . . 32
4.3 Massimi e minimi vincolati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3
4 INDICE

5 Integrali multipli 35
5.1 Integrali doppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 Formule di riduzione per integrali doppi . . . . . . . . . . . . . . . . . . . . . 36
5.3 Integrali doppi su domini generici . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.3.1 Disegno di insiemi nel piano . . . . . . . . . . . . . . . . . . . . . . . . 38
5.4 Integrali tripli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.4.1 Integrali su domini generici . . . . . . . . . . . . . . . . . . . . . . . . 40
5.4.2 Grafico di regioni solide . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6 Integrali curvilinei e di superficie 43


6.1 Integrali curvilinei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.1.1 Integrali curvilinei per funzioni scalari . . . . . . . . . . . . . . . . . . 43
6.1.2 Rappresentazione di campi vettoriali . . . . . . . . . . . . . . . . . . . 44
6.1.3 Integrali curvilinei per funzioni vettoriali . . . . . . . . . . . . . . . . . 45
6.2 Aree di superfici parametrizzate . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.3 Integrali di superficie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.3.1 Integrali di superficie per funzioni scalari . . . . . . . . . . . . . . . . 49
6.3.2 Rappresentazione di campi lungo una superficie . . . . . . . . . . . . . 49
6.3.3 Integrali di superficie per campi vettoriali: circuitazioni e flussi . . . . 49

7 Successioni e serie di funzioni 53


7.1 Successioni di funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2 Serie di funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.3 Serie di potenze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.4 Serie di Taylor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
7.4.1 Polinomi di Taylor simbolici . . . . . . . . . . . . . . . . . . . . . . . . 57
7.4.2 Moltiplicazione di serie e serie di Taylor di prodotti di funzione . . . . 57
7.5 Serie di Fourier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.5.1 Fenomeno di Gibbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

8 Equazioni differenziali 63
8.1 Linee di flusso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.2 Il metodo numerico ode45 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
8.3 Integrazione simbolica di equazioni differenziali . . . . . . . . . . . . . . . . . 65
8.4 Sistemi di equazioni differenziali . . . . . . . . . . . . . . . . . . . . . . . . . 66
8.5 Equazioni di ordine superiore . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
8.6 Soluzioni definite implicitamente . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.7 Vibrazioni meccaniche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
8.7.1 Vibrazioni non smorzate . . . . . . . . . . . . . . . . . . . . . . . . . . 69
8.7.2 Vibrazioni smorzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

A Derivazione numerica 73
A.1 Derivata prima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
A.2 Derivata seconda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

B Il metodo di integrazione di Simpson 75

C Metodo di Eulero per le equazioni differenziali 77


INDICE 5

D Integrazione di equazioni differenziali per serie 79


D.1 Serie di Taylor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
D.2 Serie di Fourier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6 INDICE
Capitolo 1

Curve

1.1 Richiami di algebra lineare


Iniziamo col disegnare il segmento che congiunge due punti dati; ricordiamo che l’equazione
parametrica del segmento che congiunge due punti P, Q ∈ RN è data da

x = tQ + (1 − t)P, t ∈ [0, 1].

Osserviamo che se i due punti sono nel piano, possiamo scrivere P = (p1 , p2 ), P = (q1 , q2 ).
Quindi un modo semplice per disegnare nel piano il segmento che congiunge P = (1, 2) con
Q = (−3, 5) può essere

t=[0 1];
p=[1 2];
q=[-3 5];
x=(1-t)*p(1)+t*q(1);
y=(1-t)*p(2)+t*q(2);
plot(x,y)

Dopo il comando plot si possono aggiungere le opzioni

axis([-4 2 0 6]); grid on;


str1 = ’\leftarrow P’;
text(p(1),p(2),str1);
str2= ’\leftarrow Q;
text(q(1),q(2),str2);

per migliorarne l’aspetto grafico e specificare gli oggetti considerati.


Il precedente grafico rappresenta il segmento che congiunge i due punti, o anche il vettore
P − Q applicato nel punto Q. Se vogliamo invece dare una rappresentazione grafica di un
vettore (quindi come di un segmento che parte dall’origine e congiunge il punto dato) e della
somma tra due vettori, possiamo considerare i seguenti comandi, che danno rispettivamente
la rappresentazione nel piano dei vettori a = (4, 7), b = (−2, 3), del vettore 1/2a e della
somma a + b:

t=[0 1];

1
2 CAPITOLO 1. CURVE

xa=4*t;
ya=7*t;
xb=-2*t;
yb=3*t;
plot(xa,ya,xb,yb,.5*xa,.5*ya,xa+xb,ya+yb);
axis([-4 5 -2 12]);
grid on;
legend(’a’,’b’,’.5*a’,’a+b’)
Per disegnare invece vettori in dimensione 3 bisognerà utilizzare il comando plot3
Definizione 1.1 Il comando plot3 analogo in R3 a plot e ha la seguente struttura:
• plot3(x,y,z)
se x, y, z ∈ R3 sono tre vettori della stessa lunghezza
• plot3(X,Y,Z)
se X, Y, Z sono tre matrici della stessa grandezza. In questo caso disegnamo le linee
ottenute dalle colonne delle matrici considerate, ossia X, Y e Z.
Ad esempio, possiamo considerare i vettori a = (2, 3, −1), b = (1, −3, 5), c = (−2, 4, −1),
a − b e a + 2b − 3c nello spazio;
t=[0 1];
xa=2*t; ya=3*t; za=-t;
xb=t; yb=-3*t; zb=5*t;
xc=-2*t; yc=4*t; zc=-t;
xs=xa-xb; ys=ya-yb; zs=za-zb;
xx=xa+2*xb-3*xc; yy=ya+2*yb-3*yc; zz=za+2*zb-3*zc;
plot3(xa,ya,za,xb,yb,zb,xc,yc,zc,xs,ys,zs,xx,yy,zz);
grid on;
legend(’a’,’b’,’c’,’a-b’,’a+2b-3c’)
Possiamo anche utilizzare il prodotto scalare per calcolare l’angolo tra due vettori dati;
ricordiamo che vale la formula
n
X
x·y = xi yi = kxkkyk cos ϑ
i=1

per ogni x, y ∈ RN , da cui


x·y
ϑ = arccos .
kxkkyk
Osserviamo che quest’ultima formula restituisce sempre un angolo compreso tra 0 e π; quindi
degli angoli individuati dai due vettori x e y, con la formula precedente si sta determinando
il minore dei due, mentre il secondo sarà dato da 2π − ϑ. Un semplice esempio è dato dai
seguenti comandi, in cui si determina l’angolo tra i due vettori (2, 3, −1) e (1, −3, 2).
a=[2 3 -1];
b=[1 -3 5];
La=sqrt(sum(a.*a));
Lb=sqrt(sum(b.*b));
theta=acos(sum(a.*b)/(La*Lb))
1.2. ALCUNI DISEGNI 3

1.2 Alcuni disegni


1.2.1 Curve nel piano
Possiamo cominciare col disegnare un segmento, determinato da un punto di partenza e da
una direzione. Come punto di partenza prendiamo x = (1, −3) e come direzione fissiamo il
vettore v = (2, 4); disegniamo quindi il segmento x + tv con t ∈ [−2, 2];

t=[-2 2];
x1=1+2*t;
x2=-3+4*t;
plot(x1,x2);
grid on;

Si provi a modificare l’insieme di definizione di t, tracciando alcuni esempi.

Esercizio 1.1 Disegnare le seguenti curve piane;

1. (t − 2, t + sin t), t ∈ R;

2. (tet , log(1 + t)), t ∈ (−1, +∞);

3. (t|t|, t − cos t), t ∈ R;

4. (t2 , t3 ), t ∈ [−1, 1];

5. (cos3 t, sin3 t), t ∈ [0, 2π];

6. (Rt − r sin t, R − r cos t), t ∈ [0, 4π] con diversi valori di R e r (R > r, R = r, R < r);

1.2.2 Curve in coordinate polari


Le curve in coordinate polari, cioè le curve in cui si pone il raggio in funzione dell’angolo
% = %(ϑ), possono essere disegnate semplicemente considerando la parametrizzazione

r(ϑ) = %(ϑ)(cos ϑ, sin ϑ).

In Matlab esiste però anche un comando speciale, polar.

Definizione 1.2 Il comando polar(theta,rho) costruisce il grafico in coordinate polari


dellangolo theta, in radianti, rispetto allangolo rho.

Disegniamo come esempio la rosa a quattro petali data %(ϑ) = cos 2ϑ, ϑ ∈ [0, 2π]. Useremo
la funzione linspace

Definizione 1.3 La funzione linspace(x1,x2) genera un vettore colonna di 100 punti


equamente spaziati tra x1 e x2. Il comando linspace(x1,x2,N) genera un vettore colonna
di N punti.

theta=linspace(0,2*pi);
r=cos(2*theta);
polar(theta,r);
4 CAPITOLO 1. CURVE

Possiamo anche disegnare una curva in coordinate polari definita da un parametro c


per tre differenti valori di c, ad esempio c = −1, .5, 1; disegniamo quindi la curva %(ϑ) =
1 + c sin ϑ, ϑ ∈ [0, 2π].

C={’k’,’b’,’r’};
c=[-1;0.5;1];
theta=linspace(0,2*pi);
for i=1:length(c)
polar(theta,1+c(i)*sin(theta),C{i});
hold on;
end
hold off;
legend(’1-sin(t)’, ’1+\dfrac{1}{2}sin(t)’,’1+sin(t)’);

Consideriamo ora il caso ρ(ϑ) = cos 2ϑ, ϑ ∈ [0, 2π], con c = 1 e c = 2. Osserviamo come il
comando polar non formatti bene il disegno, in quanto scala il grafico basandosi solo sul
primo disegno. Possiamo ovviare questo problema nel modo seguente.

theta=linspace(0,2*pi);
r1=1+sin(theta); r2=1+2*sin(theta);
polar([theta’,theta’], [r1’,r2’]);
legend(’1+sin(t)’, ’1+2sin(t)’);

Esercizio 1.2 Disegnare le seguenti curve piane;

1. % = 2a(1 + cos ϑ), ϑ ∈ [−π, π];

2. % = aeϑ , ϑ ∈ [0, π/6];

3. % = ϑ2 , ϑ ∈ [0, 3/2];

4. % = (1 − cos ϑ), ϑ ∈ [0, 2π].

1.2.3 Curve nello spazio


Segmento Possiamo considerare la generalizzazione naturale dell’esempio considerato nel-
la sezione 1.2.1 disegnando un segmento, determinato dal punto di partenza x = (1, −3, 2) e
direzione data dal vettore v = (2, 4, −1); disegniamo quindi il segmento x+tv con t ∈ [−2, 2];

t=[-2 2];
x1=1+2*t;
x2=-3+4*t;
x3=2-t;
plot3(x1,x2,x3);
grid on;

Si provi a modificare l’insieme di definizione di t, tracciando alcuni esempi.


1.3. VETTORI TANGENTI 5

Elica cilindrica L’elica o spirale cilindrica è descritta dell’equazione parametrica

r(t) = (a cos t, a sin t, kt), t∈R

e a, k che descrivono il raggio e il passo dell’elica rispettivamente. Disegniamo l’elica con


a = 2 e k = 3;
a=2; k=3;
t=linspace(0,4*pi);
plot3(a*cos(t),a*sin(t),k*t);
grid on;
Possiamo anche disegnare il sostegno dell’elica di raggio 2 e passo 1/2 e contemporanea-
mente disegniamo la sua proiezione sul piano xy.
a=2; k=1/2;
t=linspace(0,4*pi);
x=a*cos(t); y=a*sin(t); z=k*t;
plot3(x,y,z,’r’,x,y,0*t,’y’);
grid on;
Il precedente grafico puó essere anche arricchito nel seguente modo:
hold on;
s=linspace(0,4*pi,30);
x=a*cos(s); y=a*sin(s); z=k*s;
stem3(x,y,z,’b’);
hold off;

Esercizio 1.3 Disegnare la curva nello spazio determinata dal luogo delle soluzioni del
sistema
y = x2

3z = 2xy.

1.3 Vettori tangenti


Possiamo disegnare la curva piana r(t) = (4 cos t, 2 sin t), t ∈ [0, 2π], e il vettore tangente
alla curva in r(π/6), dato da r0 (π/6). Disegneremo anche i vettori secanti la curva

r(π/6 + h) − r(π/6)
h
con h = 0.1, 0.05, 0.01.
t=linspace(0,2*pi);
x=4*cos(t); y=2*sin(t);
xp=-4*sin(pi/6); yp=2*cos(pi/6);
s=[0 1];
v1=4*cos(pi/6)+s.*xp;
v2=2*sin(pi/6)+s.*yp;
plot(x,y,v1,v2,’r’);
hold on;
6 CAPITOLO 1. CURVE

for h=[.1 .05 .01];


u1=4*cos(pi/6)+s.*(4*cos(pi/6+h)-4*cos(pi/6))./h;
u2=2*sin(pi/6)+s.*(2*sin(pi/6+h)-2*sin(pi/6))./h;
plot(u1,u2);
end
hold off;
legend(’curva’,’vettore tangente’,’vettori secanti’,2);
Riprendiamo ora l’esempio dell’elica cilindrica e disegniamo il vattore tangente alla curva
in alcuni suoi punti; disegniamo al contempo anche il vettore normale principale, definito
dalla formula
T 0 (t)
,
kT 0 (t)k
dove T (t) = r(t)/kr(t)k definisce il versore tangente. Possiamo quindi considerare i seguenti
comandi:
clear
a=2; k=3;
t=linspace(0,4*pi);
x=a*cos(t); y=a*sin(t); z=k*t;
plot3(x,y,z);
grid on; axis equal; hold on;
xlabel(’x’);ylabel(’y’);zlabel(’z’);
% grafico dell’elica

tt=0:pi/4:4*pi; l=length(tt);
% definisco un vettore di valori compresi tra 0 e 4*pi
xx=a*cos(tt); yy=a*sin(tt); zz=k*tt;
% calcolo r(t), r’(t) e r’’(t) per questi valori
dxx=-a*sin(tt); dyy=a*cos(tt); dzz=k*ones(l);
ddxx=-a*cos(tt); ddyy=-a*sin(tt); ddzz=zeros(l);
s=[0 1];
for i=1:l
tg=norm([dxx(i) dyy(i) dzz(i)]);
% per i valori in tt calcolo il vettore tangente normalizzato
tg1=xx(i)+s.*dxx(i)./tg;
% cioe’ il versore tangente
tg2=yy(i)+s.*dyy(i)./tg;
tg3=zz(i)+s.*dzz(i)./tg;

n=norm([ddxx(i) ddyy(i) ddzz(i)]);


% calcolo inoltre il vettore normale normalizzato
n1=xx(i)+s.*ddxx(i)./n;
% cioe’ il versore normale
n2=yy(i)+s.*ddyy(i)./n;
n3=zz(i)+s.*ddzz(i)./n;

plot3(tg1,tg2,tg3,’-r’,n1,n2,n3,’-g’);
pause
1.4. LUNGHEZZA D’ARCO 7

end
hold off;
In alernativa si può considerare un solo giro d’elica, come segue;
clear
a=2; k=3;
t=linspace(0,2*pi);
x=a*t.*cos(t); y=a*t.*sin(t); z=k*t;
plot3(x,y,z);
grid on; axis equal; hold on;
xlabel(’x’);ylabel(’y’);zlabel(’z’);
% grafico dell’elica

tt=0:pi/8:4*pi; l=length(tt);
% definisco un vettore di valori compresi tra 0 e 4*pi
xx=a*tt.*cos(tt); yy=a*tt.*sin(tt); zz=k*tt;
% calcolo r(t), r’(t) e r’’(t) per questi valori
dxx=a*(cos(tt)-tt.*sin(tt));
dyy=a*(sin(tt)+tt.*cos(tt));
dzz=k*ones(l);
ddxx=-a*(2*sin(tt)+tt.*cos(tt));
ddyy=a*(2*cos(tt)-tt.*sin(tt));
ddzz=zeros(l);
s=[0 1];
for i=1:l
tg=norm([dxx(i) dyy(i) dzz(i)]);
% per i valori in tt calcolo il vettore tangente normalizzato
tg1=xx(i)+s.*dxx(i)./tg;
% cioe’ il versore tangente
tg2=yy(i)+s.*dyy(i)./tg;
tg3=zz(i)+s.*dzz(i)./tg;

n=norm([ddxx(i) ddyy(i) ddzz(i)]);


% calcolo inoltre il vettore normale normalizzato
n1=xx(i)+s.*ddxx(i)./n;
% cioe’ il versore normale
n2=yy(i)+s.*ddyy(i)./n;
n3=zz(i)+s.*ddzz(i)./n;

plot3(tg1,tg2,tg3,’-r’,n1,n2,n3,’-g’);
pause
end
hold off;

1.4 Lunghezza d’arco


Come primo esempio di calcolo di una lunghezza, vediamo come la lunghezza di una poli-
gonale inscritta in una semicirconferenza possa essere usata per approssimare il valore di π.
8 CAPITOLO 1. CURVE

Consideriamo i seguenti comandi:


t=linspace(0,pi);
for i=[1,2,3,4];
s=linspace(0,pi,3^i+1);
x=cos(s); y=sin(s);
dx=diff(x); dy=diff(y);
ds=sqrt(dx.^2+dy.^2);
L=sum(ds);
plot(cos(t),sin(t));
hold on;
plot(x,y);
T=[’Lunghezza della Poligonale= ’,num2str(L)]
text(-40,4,T);
hold off;
pause;
end;
Si provi a modificare il numero di punti usati in linspace. Cosa notiamo?

1.4.1 Grafico di funzione


In questa sezione calcoliamo la lunghezza di una curva cartesiana, cioè la lunghezza del
grafico di una funzione y = f (x), x ∈ [a, b]. Ricordiamo che tale lunghezza è data dalla
formula Z bp
L = l(r, [a, b]) = 1 + f 0 (x)2 dx,
a
2
dove r : [a, b] → R è la parametrizzazione r(x) = (x, f (x)). Solitamente, l’integrale pre-
cedente non si riesce a calcolare analiticamente; se ad esempio consideriamo la funzione
f (x) = x3 + 3x2 − 5x + 2, x ∈ [−1, 2], ci ritroviamo col seguente integrale
Z 2p
L= 36x4 + 36x3 + 6x2 − 60x + 26dx.
−1

Determineremo il valore di L considerando le approssimazioni del grafico di f mediante


poligonali; tali poligonali avranno vertici nei punti di coordinate (x, f (x)); procederemo
quindi con la suddivisione dell’intervallo [−1, 2] in segmenti della medesima ampiezza. Tale
calcolo viene effettuato ad esempio dal seguente semplice script.

x=linspace(-1,2,400);
y=x.^3+3*x.^2-5*x+2;
dx=diff(x);
dy=diff(y);
ds=sqrt(dx.^2+dy.^2);
L=sum(ds)

In tale modo si ottiene il valore L = 20.8314; dire cosa si ottiene se l’ultimo comando
viene sostituito con

L=cumsum(ds)
1.4. LUNGHEZZA D’ARCO 9

Definizione 1.4 Se applicato ad un vettore x il comando cumsum(x) calcola la somma


cumulativa degli elementi in x. Nel caso di matrici necessario specificare la dimensione
lungo la quale si vuole operare, scriveremo quindi cumsum(X,DIM) dove cumsum(X,1) somma
per colonne mentre cumsum(X,2) per righe.

Il vantaggio dell’approssimazione poligonale è quello di ottenere in modo abbastanza


semplice un valore approssimato del valore della lunghezza della curva; non si ha però nes-
suna informazione sull’errore commesso nell’approssimazione. Come vedremo nel prossimo
paragrafo, questo errore può essere anche consistente.

1.4.2 Curve parametrizzate


Iniziamo con il calcolo approssimato del numero π;
Vediamo ora col seguente esempio quanto l’approssimazione poligonale può non essere
accurata. Consideriamo la curva

r(t) = (4t − 2t3 , t2 ), t ∈ [−1, 3].

Utilizziamo l’approssimazione poligonale dove viene suddiviso l’intervallo [−1, 3] in 400 parti
uguali e la poligonale ha per vertici i punti r(ti ); considereremo inoltre anche un metodo
numerico per il calcolo del seguente integrale:
Z 3 p
L = l(r, [−1, 3]) = 36t4 − 32t2 + 16dt,
−1

che è la formula per il calcolo della lunghezza di una curva regolare.

t=linspace(-1,3,400);
x=4*t-2*t.^3;
y=t.^2;
plot(x,y);
dx=diff(x);
dy=diff(y);
ds=sqrt(dx.^2+dy.^2);
L1=sum(ds);
L2=quad(fcnchk(’sqrt(36*t.^4-32*t.^2+16)’),-1,3,.0001);
T1=[’Lunghezza poligonale approssimante= ’,num2str(L1)];
T2=[’Lunghezza approssimata al decimillesimo= ’,num2str(L2)];
text(-40,4,T1);
text(-40,3.5,T2);

Definizione 1.5 Il comando fcnchk(F,...) trasforma la funzione F in un oggetto di tipo


inline.

Definizione 1.6 Il comando quad(F,A,B,TOL) approssima lintegrale di F calcolato tra gli


estremi A e B mediante la quadratura adattiva di Simpson. Nel caso si dichiari la tolleranza
dell’errore assoluto TOL, invece di utilizzare quella macchina impostata a 1.e-6, si possono
velocizzare i calcoli al costo di risultati meno accurati.
10 CAPITOLO 1. CURVE

Si noti la differenza tra i due valori ottenuti; si può provare a sostituire il valore 400
con altri valori e vedere per quale valore di tale parametro la lunghezza della poligonale è
paragonabile col valore L2.
Una variante del precedente esercizio puó essere la determinazione della lunghezza del-
l’ellisse di equazione
x2 y2
+ = 1,
4 9
che si puó parametrizzare mediante r(t) = (2 cos t, 3 sin t), t ∈ [0, 2π].

t=linspace(0,2*pi,1001);
x=2*cos(t); y=3*sin(t);
plot(x,y);
dx=diff(x); dy=diff(y); ds=sqrt(dx.^2+dy.^2);
L=sum(ds);
qT=[’Lunghezza poligonale approssimante= ’,num2str(L)];
text(-1.5,.2,T);

Ovviamente, come prima, possiamo approssimare il valore dell’integrale


Z 2π p
6 − 5 sin2 tdt
0

utilizzando metodi numerici; useremo qui il comando quad8. Possiamo quindi aggiungere ai
precedenti comandi i seguenti;

L2=quad8(fcnchk(’sqrt(9-5*sin(t).^2)’),0,2*pi);
text(-1.5,.2,’Valore approssimato integrale= ’,num2str(L2));

Esercizio 1.4 Provare a ripetere i conti precedenti per le seguenti curve; si provi anche a
vedere se la lunghezza della curva può essere determinata utilizzando il symbolic toolbox.

1. y = sen x per x ∈ [0, π/2];

2. x = cot t, y = sen 2 t per t ∈ [π/4, π/2];

3. y = x3 per x ∈ [0, 2];

4. x = t cos t, y = t sen t per t ∈ [0, 2π].

1.5 Curvatura
Consideriamo qui la curva parametrizzata da

r(t) = (2 sin(t), cos t, cos t);

creeremo una figura divisa in due parti, dove nella prima parte tracceremo il sostegno di r,
mentre nella seconda parte disegneremo il grafico della funzione curvatura

kr0 (t) × r00 (t)k 1


k(t) = = .
kr0 (t)k3 (1 + cos2 t)3/2
1.6. APPLICAZIONI 11

t=linspace(0,2*pi,200);
subplot(2,1,1);
plot3(2*sin(t),cos(t),cos(t));
grid on;
text(0,1,1-.2,’\uparrow t=0’)
text(2,0,0-.2,’\uparrow t=\pi/2’)
text(-2,0,0-.2,’\uparrow t=3\pi/2’)
subplot(2,1,2);
plot(t,1./(1+cos(t).^2).^(3/2));
set(gca,’XTick’,[0:pi/2:2*pi])
Tramite il calcolo della curvatura, possiamo anche ricavare il cerchio osculatore alla
curva. Prenderemo in considerazione il caso di una curva piana descritta come grafico della
funzione f (x) = x2 , x ∈ [−2, 2]. Disegneremo il sostegno della curva e il cerchio osculatore
la curva nel punto (1/2, 1/4). La curvatura per una curva cartesiana é data da
|f 00 (x)| 2
k(x) = 0 2 3/2
= .
(1 + |f (x)| ) (1 + 4x2 )3/2

Per x = 1/2 otteniamo k(1/2) = 1/ 2; dato che il versore tangente in tale punto é dato √ da
√1 (1, 1) mentre il versore normale è dato da √1 (−1, 1), il cerchio osculatore avrà raggio 2
2 2
1 5
e sarà centrato in (− 2 , 4 ).
x=linspace(-2,2,400);
t=linspace(0,2*pi,600);
plot(x,x.^2,-.5+sqrt(2)*cos(t),1.25+sqrt(2)*sin(t));
axis equal;

Esercizio 1.5
1. Far variare il cerchio osculatore nell’ultimo esempio considerato.
2. Si approssimi la lunghezza di r(t) = (t, t2 , t3 ), t ∈ [0, 2] sia con l’approssimazione poli-
gonale dividendo l’intervallo in 1000 sottointervalli uguali, quindi usando il comando
quad.
3. Determinare k(t) per r(t) = (sin t, cos t, sin2 t), t ∈ [0, 2π] e, mediante il comando
subplot, disegnare la curva e il grafico della sua curvatura.
4. Disegnare la curva cartesiana y = log x, x ∈ [2, 4] e il cerchio osculatore alla curva nel
punto relativo ad x = 2.
5. Disegnare il sostegno della curva r(t) = (t, t2 , t3 ), t ∈ [0, 2] e il cerchio osculatore
relativo al valore t = 1.

1.6 Applicazioni
Consideriamo i seguenti vettori: A=[1 2 3 4 5] e B=[1 2 1 3 3]. Siamo ora interessati
a trovare un polinomio che meglio approssima il nostro set di dati in R2 . Una tecnica
fondamentale della statistica parametrica sono infatti le curve di regressione, in cui si cerca
di approssimare il set di dati con un polinomio lineare del tipo
12 CAPITOLO 1. CURVE

f(x)=p1*x+p2.
A questo fine possiamo utilizzare il toolbox Matlab cftool che ci fornisce sia le stime dei
parametri p1 p2 sia alcuni indicatori sulla precisione della stima, come R2 e Adj − R2 . Noi
ci occuperemo solo del primo.

Definizione 1.7 Consideriamo un insieme di n dati {yi }ni=1 ai quali associamo un modello
lineare rappresentato da n approssimazioni {ŷi }ni=1 . Definiamo la media dei dati come
n
1X
ȳ = yi .
n i=1

e le seguenti quantità
n
X
SStot = (yi − ȳ)2
i=1
n
X
SSreg = (ŷi − ȳ)2
i=1
n
X
SSres = (yi − ŷi )2 .
i=1
2
Il coefficiente di determinazione R è allora
SSres
R2 := 1 −
SStot
ed è tale che
0 ≤ R2 ≤ 1.

Osservazione 1.8 In statistica il coefficiente di determinazione R2 ci fornisce informazioni


riguardo il grado di precisione della retta usata per approssimare i dati. Un R2 vicino al
valore unitario indica un perfetto accordo tra i dati e il modello utilizzato, mentre un R2
vicino allo zero indica che il modello approssima male i dati.

Nel caso test preso in esame la stima dei coefficienti p1=0.5, p2=0.5 e l‘indice R2 assume
il valore di 0.625. Possiamo inoltre considerare polinomi di grado crescente, anche se questi
hanno una valenza statistica meno definita. Cosa succede in questo caso a R2 ?
Capitolo 2

Funzioni di più variabili

2.1 Funzioni e loro grafici


Introduciamo subito un comando per costruire reticoli
Definizione 2.1 Il comando [X,Y]=meshgrid(x,y) replica i vettori x,y in modo da pro-
durre una griglia rettangolare completa salvata in output in X e Y.
Come esempio iniziamo col disegnare ilpgrafico di alcune funzioni di due variabili z = f (x, y).
Possiamo considerare la funzione z = 4 − 2x2 − y 2 , definita
√ nella regione 2x2 + y 2 ≤ 4 (la
regione interna delimitata da una ellisse di semiassi ± 2 e ±1). Come possiamo definire il
dominio nelle variabili (x, y) tramite il comando
√ meshgrid? Un primo modo riscrivere il
problema sfruttando le coordinate polari x = r 2 cos ϑ, y = 2r sin ϑ, con r, ϑ ∈ [0, 1]×[0, 2π],
che ora rappresenta una regione rettangolare. Se si prova però a far variare r fino al valore
1 si riscontrano problemi, in quanto la funzione si annulla e Matlab genera problemi; per
questo faremo variare r fino a 0.95.
[r,theta]=meshgrid(0:.05:.95,0:2*pi/30:2*pi);
x=sqrt(2)*r.*cos(theta);
y=2*r.*sin(theta);
z=sqrt(4-2.*x.^2-y.^2);
surf(x,y,z); axis equal;
Le righe che si vedono in figura altro non sono che le restrizioni della funzione sulle curve a
r costante e ϑ costante. In particolare le linee che dividono le regioni
√ con colori differenti (i
“paralleli“) sono ottenute tramite ϑ 7→ f˜(r, ϑ), con f˜(r, ϑ) = f ( 2r cos ϑ, 2r sin ϑ), mentre
le linee che escono a raggiera dal punto di massima elevazione (i ”meridiani“) sono ottenuti
tramite r 7→ f˜(r, ϑ).
Se non si volessero utilizzare le coordinate polari, si può restare nelle coordinate (x, y),
moltiplicando la funzione per 0 quando 4 − 2x2 − y 2 < 0. Si può procedere come segue.
[x,y]=meshgrid(-sqrt(2):.1:sqrt(2),-2:.1:2);
z=sqrt((4-2.*x.^2-y.^2 >= 0).*(4-2.*x.^2-y.^2));
surfl(x,y,z);
Notiamo qui che l’operazione (4 − 2. ∗ x.2 − y.2 >= 0) è un operatore logico, che restituisce
il valore 1 se la condizione è verificata, altrimenti restituisce 0. Otteniamo quindi una

13
14 CAPITOLO 2. FUNZIONI DI PIÙ VARIABILI

matrice di valori che sono o 1 o 0 a seconda che il punto (x, y) appartenga o meno all’ellisse.
L’operazione consiste quindi semplicemente nel disegnare il grafico della funzione
p
f (x, y) = χE (x, y)(4 − 2x2 − y 2 ), E = {(x, y) ∈ R2 : 2x2 + y 2 ≤ 4}

e χE è la funzione caratteristica dell’insieme E, cioè



 1 se (x, y) ∈ E
χE (x, y) =
0 se (x, y) 6∈ E.

In questo modo la funzione χE (x, y)(4 − 2x2 − y 2 ) è definita per ogni (x, y) ∈ R2 e non
abbiamo problemi a disegnarne il grafico. Concludiamo questa sezione con un commento; le
linee che sono visualizzate nel grafico ottenuto altro non sono che le restrizioni della funzione
x 7→ f (x, y) e y 7→ f (x, y).

2.1.1 Funzioni discontinue


Iniziamo con una funzione che abbiamo già visto durante il corso di teoria, e cioè la funzione
xy
f (x, y) = , (x, y) 6= (0, 0).
x2 + y 2
Utilizziamo le coordinate polari per disegnare tale grafico;
[r,theta]=meshgrid(0:.02:1,0:2*pi/50:2*pi);
x=r.*cos(theta);
y=r.*sin(theta);
z=x.*y./(x.^2+y.^2);
surf(x,y,z); axis equal;
Dal grafico si intuisce la discontinuità della funzione. Possiamo visualizzare meglio questo
fenomeno tramite le restrizioni y = mx, che corrisponde in coordinate polari, alle sezioni
r 7→ f˜(r, ϑ), dove f˜(r, ϑ) = f (r cos ϑ, r sin ϑ).
Le sezioni ad angolo costante si ottiene mediante;
r=linspace(0,1);
plot3(r,r.*0,r.*0);
grid on;
axis([-1 1 -1 1 -.5 .5]);
hold on;
for i=[0:2*pi/50:2*pi]
plot3(r.*cos(i),r.*sin(i),r.^2.*cos(i)*sin(i)./r.^2);
pause(.1)
end;
hold off;
mentre le sezioni a raggio fissato si ottengono tramite;
theta=linspace(0,2*pi);
plot3(cos(theta),sin(theta),cos(theta).*sin(theta),’r’); grid on;
hold on
2.1. FUNZIONI E LORO GRAFICI 15

for r=[0:.1:1]
plot3((1-r)*cos(theta),(1-r)*sin(theta),cos(theta).*sin(theta),’r’);
pause(.5);
end;
hold off;

Si provi a ripetere i comandi precedenti, cioè disegnando prima le sezioni ad angolo costante
e poi quelle a raggio costante, togliendo il comando hold off; alla fine delle sezioni ad
angolo costante.
Possiamo anche ricostruire il grafico della funzione utilizzando il metodo degli insiemi
di livello. Ad esempio possiamo scrivere;

[x,y]=meshgrid(-2:.1:2);
contour(x,y,x.*y./(x.^2+y.^2+eps),10);

Il numero 10 nel comando precedente specifica quante linee di livello si desiderano disegnare;
tale parametro può essere omesso. La variabile eps serve per evitare la divisione per 0; è
una variabile Matlab. Possiamo mettere anche le etichette sui livelli; ad esempio possiamo
considerare:

[x,y]=meshgrid(-2:.1:2);
[C h]=contour(x,y,x.*y./(x.^2+y.^2+eps));
clabel(C,h);

Si può infine selezionare il livello o mettere l’etichetta solo al livello che si desidera. Vedremo
questo nel prossimo paragrafo.
Possiamo visualizzare il comando contour come sezione del grafico della funzione con i
piano orizzontali z = c; possiamo ad esempio considerare i seguenti comandi.

[x,y]=meshgrid(-2:.1:2);
z=x.*y./(x.^2+y.^2+eps);
[u,v]=meshgrid([-2 2]);

subplot(2,4,1);
surf(x,y,z); hold on; surf(u,v,-0.3*ones(2,2)); title(’z=-0.3’);
subplot(2,4,2);
[C h]=contour(x,y,z,[-0.3]); clabel(C,h);

subplot(2,4,3);
surf(x,y,z); hold on; surf(u,v,-0.1*ones(2,2)); title(’z=-0.1’);
subplot(2,4,4);
[C h]=contour(x,y,z,[-0.1]); clabel(C,h);

subplot(2,4,5);
surf(x,y,z); hold on; surf(u,v,0.1*ones(2,2)); title(’z=0.1’);
subplot(2,4,6);
[C h]=contour(x,y,z,[0.1]); clabel(C,h);

subplot(2,4,7);
surf(x,y,z); hold on; surf(u,v,0.3*ones(2,2)); title(’z=0.3’);
16 CAPITOLO 2. FUNZIONI DI PIÙ VARIABILI

subplot(2,4,8);
[C h]=contour(x,y,z,[0.3]); clabel(C,h);
Per mettere assieme il grafico della funzione e il disegno dei livelli, possiamo considerare
i seguenti comandi:
[x,y]=meshgrid(-2:.05:2);
surfc(x,y,x.*y./(x.^2+y.^2+eps));
Si provi per esercizio a ripetere la procedura precedente considerando le sezioni a x = c
e y = c. Si creino quindi dei subplot in cui da una parte viene disegnato il grafico della
funzione f e il piano verticale x = c, e da una parte il grafico della funzione f (c, y); si ripeta
ancora l’esercizio con y = c e f (x, c).

Un secondo esempio Proseguiamo ora disegnando il grafico della funzione, discontinua


in (0, 0), definita da
xy 2
f (x, y) = .
x2 + y 4
Possiamo provare direttamente a disegnare il grafico di f :
[x,y]=meshgrid(-2:.1:2);
surf(x,y,(x.*y.^2)./(x.^2+y.^4));
Il disegno viene comunque prodotto, anche se con un buco attorno all’origine (0, 0). Tale
buco può essere eliminato mediante la variabile eps, che è il più piccolo numero macchina
positivo Matlab.
[x,y]=meshgrid(-2:.1:2);
surf(x,y,(x.*y.^2)./(x.^2+y.^4+eps));
Con i seguenti comandi disegneremo alcuni livelli della funzione data e metteremo l’etichetta
solo ad una selezione speciale di livelli:
[x,y]=meshgrid(-2:.05:2);
L=[-.45:.05:.45];
[C,h]=contour(x,y,(x.*y.^2)./(x.^2+y.^4+eps),L);
v=[-.4:.2:.4]; clabel(C,h,v);
Si ripetano infine come esercizio le cose viste nella sezione precedente.

Esercizio 2.1
1. Disegnare i grafici delle funzioni

xy x2 y y2 x2 y
, , , .
x2 + y2 x2 − y2 x2 + y2 x4+ y2

2. Tracciare le curve di livello delle precedenti funzioni.


3. Scrivere le superfici di livello delle funzioni di tre variabili

x2 + y 2
, |x| + |y| + |z|.
z2
2.2. DERIVATE PARZIALI 17

4. Disegnare il grafico di f (x, y) = xy 3 − x3 y sul dominio (x, y) ∈ [−3, 3]2 ; creare poi
separatamente una mappa dei livelli di tale funzione su tale dominio. Usare infine il
comando surfc.

5. Usare il comando contour per disegnare la curva definita implicitamente dall’equa-


zione:
1
2x2 + xy + y 4 = .
2

2.2 Derivate parziali


Possiamo utilizzare il symbolic toolbox di Matlab per calcolare le derivate parziali di
una funzione. Useremo ad esempio il comando ezplot (su veda anche l’appendice A per
maggiori dettagli sulla derivazione numerica); i comandi seguenti calcolano le derivate di
f (x, y) = sin(x2 + y 2 ) e tracciamo il grafico di f (1, y), ∂x f (x, 1), ∂xx
2 2
f (1, y) e ∂xy f (x, 1).

syms x y
f=sin(x^2+y^2); fx=diff(f,’x’);
fxx=diff(f,’x’,2); fxy=diff(fx,’y’);
subplot(2,2,1); ezplot(subs(f,’x’,1));
subplot(2,2,2); ezplot(subs(fx,’y’,1));
subplot(2,2,3); ezplot(subs(fxx,’x’,1));
subplot(2,2,4); ezplot(subs(fxy,’y’,1));
2
Supponiamo ora di voler disegnare il grafico della funzione ∂xy f utilizzando il comando
2
surf. Dobbiamo convertire la funzione ∂xy f definita precedentemente come una espressione
simbolica in una funzione buona per poter utilizzare surf. Possiamo procedere, a partire
dai comandi precedenti, come segue;

Fxy=fcnchk(char(fxy),’x’,’y’,’vectorized’);
[x,y]=meshgrid(-pi:2*pi/40:pi);
z=Fxy(x,y);
figure(2); clf; surf(x,y,z);

Esercizio 2.2 Si ripeta quanto fatto ora per la funzione f (x, y) = sin2 (2x+3y); si traccino i
2 3 3
grafici di f (x, 2), ∂x f (x, 2), ∂xy f (x, 2) e ∂xyy f (x, 2). Si disegni infine il grafico di ∂xyy f (x, y),
2
(x, y) ∈ [−π, π] .

2.3 Piani tangenti


Vediamo ora come disegnare il grafico di una funzione e del piano tangente al grafico in un
punto fissato; consideriamo ad esempio la funzione f (x, y) = x2 + y 2 e il punto (1, 2, 5); la
formula per il piano tangente è data da

z = f (x0 , y0 ) + ∇f (x0 , y0 ) · (x − x0 , y − y0 ).

Possiamo quindi considerare i seguenti comandi:

[x,y]=meshgrid(-3:.1:3);
surf(x,y,x.^2+y.^2);
18 CAPITOLO 2. FUNZIONI DI PIÙ VARIABILI

hold on;
[u,v]=meshgrid(-2:2:2);
L=5+2*u+4*v;
surf(u+1,v+2,L); hold off;
view(-121,20);

Si noti che la griglia per le variabili (u, v) è meno dettagliata; infatti, essendo L un piano,
servono meno punti per avere un buon grafico.
Possiamo anche considerare la funzione x2 − y 2 nel punto (1, 2, −3). Con i seguenti co-
mandi disegneremo il grafico della funzione per (x, y) ∈ [−3, 3]2 assieme al suo piano tangente
in (1, 2, −3) ed attiveremo il comando rotate3d; si provino gli effetti di tale comando.

[x,y]=meshgrid(-3:.1:3);
surf(x,y,x.^2-y.^2); hold on;
[u,v]=meshgrid(-2:2:2);
L=-3+2*u-4*v;
surf(1+u,2+v,L); hold off;
rotate3d on;

2.4 Gradiente
Consideriamo in questa sezione il campo gradiente, che come si è visto è un campo ortogonale
agli insiemi di livello della funzione. Inizieremo con una funzione di due variabili per passare
poi ad una funzione di tre variabili.

2.4.1 Un esempio nel piano


Data la funzione f (x, y) = x2 + 5y 2 con (x, y) ∈ [−2, 2]2 , tracceremo le sue curve di livello
e nello stesso disegno tracceremo il campo gradiente utilizzando la funzione quiver;

[x,y]=meshgrid(-2:.05:2);
L=5*[0:.2:2].^2; % questo vettore definisce la scelta dei livelli
[c,h]=contour(x,y,x.^2+5*y.^2,L); hold on;
[x,y]=meshgrid(-2:.2:2);
dx=2*x; dy=10*y;
quiver(x,y,dx,dy); hold off;

Un secondo esempio è dato dalla funzione f (x, y) = 2x2 + xy + y 2 nel dominio [−2, 2] ×
[−3, 3]; tracciamo quindi nello stesso grafico il campo gradiente di f e un insieme di livello;

[x,y]=meshgrid(-2:.2:2,-3:.2:3);
fx=4*x+y; fy=x+2*y;
quiver(x,y,fx,fy); hold on;
contour(x,y,2*x.*y+y.^2); hold off;

2.4.2 Un esempio nello spazio


Consideriamo qui la funzione f (x, y, z) = x2 + y 2 − z 2 e vogliamo disegnare il livello E1 =
{f = 1}; nello stesso disegno considereremo il campo gradiente di f dato da ∇f (x, y, z) =
2.4. GRADIENTE 19

(2x, 2y, −2z). Il livello E1 è descritto dall’equazione

x2 + y 2 = z 2 + 1,

che significa che per ogni z fissato i punti (x, y) appartengono ad una circonferenza di raggio

z 2 + 1,

[theta,z]=meshgrid(0:pi/20:2*pi,-2:.1:2);
x=sqrt(z.^2+1).*cos(theta);
y=sqrt(z.^2+1).*sin(theta);
surf(x,y,z); hold on;
quiver3(x,y,z,2*x,2*y,-2*z); hold off;
rotate3d on;
Un problema che si nota è che la superficie copre i vettori normali; potremmo anche disegnare
solo i vettori gradiente, la superficie sottesa si dedurrà dai punti di applicazione di tali vettori;
[theta,z]=meshgrid(0:pi/20:2*pi,-2:.1:2);
x=sqrt(z.^2+1).*cos(theta);
y=sqrt(z.^2+1).*sin(theta);
quiver3(x,y,z,2*x,2*y,-2*z);
rotate3d on;

Esercizio 2.3
1. Si disegni, nello stesso grafico, i livelli di f (x, y) = x2 − y 2 a il campo gradiente di f .
2. Si disegni la curva x2 − y 2 = 1 parametrizzandola (si usino seno e coseno iperbolico)
e si disegni nello stesso grafico il campo gradiente di f .
3. Disegnare il livello f (x, y, z) = x2 + 3y 2 + 4z 2 = 9 utilizzando le relazioni;
 √
x = √ 9 − 4z 2 cos ϑ
y = 9 − 4z 2 sin ϑ

e nello stesso grafico si disegni il campo gradiente di f .


20 CAPITOLO 2. FUNZIONI DI PIÙ VARIABILI
Capitolo 3

Superfici

Iniziamo con un semplice esempio e disegniamo un piano nello spazio; considereremo il


piano di equazione x + 2y + z = 3, che corrisponde al grafico della funzione in due variabili
z = 3 − x − 2y = f (x, y). Disegneremo tale grafico sul dominio rettangolare x ∈ [−4, 4],
y ∈ [−2, 2]; per fare questo utilizzeremo il comando meshgrid introdotto precedentemente.
[x,y]=meshgrid(-4:8:4,-2:4:2);
z=3-x-2*y;
surf(x,y,z); view(120,20);
Il comando view può essere utilizzato per modificare il punto da cui viene visualizzata la
superficie (i valori di default sono −37.5o di azimuth, 30o di elevazione). In alternativa
al comando surf per la visualizzazione si può utilizzare il mesh, come mostra il seguente
esempio;
[x,y]=meshgrid(-4:4:4,-2:2:2);
z=3-x-2*y;
mesh(x,y,z); view(120,20);
Per visualizzare un piano possiamo anche utilizzare l’equazione parametrica del pia-
no; disegniamo quindi il piano√che passa per il punto (1, 3, −2) e determinato dai vettori
(1/5, 3/10, −1/2) e (2/5, −1/3, 2), con i parametri s, t ∈ [−2, 2]. Possiamo quindi scrivere:
[s,t]=meshgrid(-2:4:2);
x=1+.2*s+.4*t;
y=3+.3*s-1/3*t;
z=-2-.5*s+sqrt(2)*t;
figure(1); mesh(x,y,z); view(120,60);
figure(2); surf(x,y,z); view(120,60);
Per aiutare la visualizzazione, si provi ad utilizzare il comando rotate3d invece di utilizzare
il comando view.
Visualizziamo inoltre il grafico di due piani; con i seguenti comandi determiniamo anche
l’angolo con cui i due piani si incontrano.
[x,y]=meshgrid(-2:.1:2,-1:.1:1);
z1=1-x-y; z2=(1-x+2*y)/3;

21
22 CAPITOLO 3. SUPERFICI

surf(x,y,z1); hold on;


surf(x,y,z2); hold off;
view(110,20);
n1=[1 1 1]; n2=[1 -2 3];
L1=sqrt(sum(n1.*n1)); L2=sqrt(sum(n2.*n2));
angle=acos(sum(n1.*n2)/L1/L2);
text(3,-1,-3,[’Angolo tra i due piani= ’,num2str(angle)]);

Esercizio 3.1
1. Disegnare il piano passante per (1, 3, 2) determinato dai due vettori

(1, 2, 1/2), (3, −1, 2).

2. Disegnare il piano determinato dall’equazione x + y − z = 2.


3. Disegnare nello stesso grafico i piani x + y + z = 2 e 3x − 4y + 5z = −8, calcolando
l’angolo con cui tali piani si incontrano.

3.1 Superfici cartesiane


Tra le superfici possiamo ovviamente considerare le superfici cartesiane, cioè le superfici che
sono grafici di funzioni di due variabili. Richiamiamo quindi alcuni concetti già visti nel
capitolo 2.
Disegniamo ad esempio il grafico della funzione f (x, y) = 2x2 − y 2 , (x, y) ∈ [−2, 2] ×
[−4, 4]; di tale funzione ne considereremo anche le sezioni lungo i piani x = c, y = c e z = c,
con c una costante fissata. Tracciamo anzitutto il grafico;
[x,y]=meshgrid(-2:.1:2,-4:.1:4);
surf(x,y,2*x.^2-y.^2);
shading interp;
Le sezioni con x = c o y = c si possono visualizzare semplicemente passando il parametro
shading faceted;
Le linee che si vedono altro non sono che le intersezioni del grafico di f con i piani verticali
x = c e y = c. Per ottenere le intersezioni con i piani z = c basterà considerare il comando
countour3.
Il seguente esempio è dato da una superficie che è cartesiana ma come funzione y =
f (x, z) = x2 ; tale superficie è un cilindro la cui base è descritta dalla parabola y = x2 ;
[x,z]=meshgrid(-2:.1:2,[-2,2]);
surf(x,x.^2,z);
Disegniamo infine il piano verticale x + 3y = 3, che è una superficie cartesiana se vista
nella forma y = 1 − x/3 oppure x = 3 − 3y.
[y,z]=meshgrid(-1:2,-1:1);
x=3-2*y;
surf(x,y,z);
3.2. ROTAZIONE DI GRAFICI 23

Esercizio 3.2

1. Disegnare il grafico di f (x, y) = (x2 − y 2 )2 , tracciando anche i livelli di tale funzione.


2
−y 2
2. Disegnare il grafico di f (x, y) = xe−x ; affiancare a tale grafico il grafico costituito
da 25 curve di livello, visto dallalto.

3.2 Rotazione di grafici


L’esempio più semplice di superficie di rotazione è dato dalla sfera; utilizziamo qui il comando
sphere per disegnare la sfera x2 + y 2 + z 2 = 9.

[x,y,z]=sphere(30);
surf(3*x,3*y,3*z);
axis equal;
shading interp;

Il comando sphere crea la sfera di raggio 1 centrata nell’origine; possiamo quindi utilizzare
la stessa funzione per disegnare un ellissoide;

[x,y,z]=sphere(30);
surf(4*x,3*y,2*z);
axis equal;

Possiamo utilizzare il comando cylinder per disegnare la superficie ottenuta ruotando


una funzione x = f (z) attorno all’asse z, con z ∈ [a, b]. La sintassi sarà la seguente:

z=linspace(a,b,40);
x=f(z);
[X,Y,Z]=cylinder(x,30);
surf(X,Y,Z);

Per migliorarne l’effetto visivo, si può usare il comando shading interp. Ma vediamo un
esempio concreto; ruotiamo il grafico della funzione z 2 + 1 attorno all’asse z. Il grafico che
vogliamo ruotare sarà il seguente;

z=linspace(1,3,50);
x=z.^2+1;
plot(x,z);

La rotazione si ottiene quindi nel seguente modo;

z=linspace(1,3,50);
x=z.^2+1;
[X,Y,Z]=cylinder(x,50);
figure(1);
surf(X,Y,Z);
zlabel(’z’); xlabel(’x’); ylabel(’y’);
figure(2);
surf(X,Y,Z);
shading interp;
24 CAPITOLO 3. SUPERFICI

Chiaramente si può ottenere anche la rotazione della stessa funzione ruotandola attorno
all’asse x invece che attorno all’asse z. Per far questo si ricava z in funzione di x e si ripetono
i comandi precedenti.

Esercizio 3.3

1. Ruotare la funzione z − 1 attorno allasse x.

2. Sostituire al comando surf(X,Y,Z) il comando surf(Z,Y,X) e commentare cosa


succede.

Possiamo anche disegnare superfici di rotazione utilizzando le coordinate cilindriche e


sferiche, a seconda delle simmetrie della superficie che si vuole disegnare. Ad esempio, il
cono stesso z 2 = a2 (x2 + y 2 ), a > 0 arbitrario, può essere disegnato ponendo z = ±ar, r ≥ 0
e ϑ ∈ [0, 2π] (di seguito consideriamo il caso a = 1/4).

a=.25;
[r,theta]=meshgrid(0:.2:2,0:2*pi/20:2*pi);
x=a*r.*cos(theta);
y=a*r.*sin(theta);
z=a*r;
surf(x,y,z); axis equal;

Analogamente, possiamo disegnare la superficie laterale di un cilindro come segue;

a=2;
[theta,z]=meshgrid(0:2*pi/30:2*pi,-3:6:3);
x=2*cos(theta); y=2*sin(theta);
surf(x,y,z); axis equal;

Per disegnare una sfera di raggio R possiamo invece utilizzare le coordinate sferiche, con
angoli ϕ ∈ [0, π], ϑ ∈ [0, 2π]:

x = R cos θ sin ϕ

(3.1) y = R sin θ sin ϕ

z = R cos ϕ

Esercizio 3.4

1. Disegnare la sfera descritta in (3.1).

In modo del tutto analogo si può anche disegnare un’ellissoide; i seguenti comandi disegnano
l’ellissoide di semiassi 5, 10 e 5/3 centrato in (1, −1, 0).

[theta,phi]=meshgrid(0:2*pi/30:2*pi,0:2*pi/30:pi);
x=1+5*cos(theta).*sin(phi);
y=-1+10*sin(theta).*sin(phi);
z=5/3*cos(phi);
surf(x,y,z); axis equal;

Esercizio 3.5
3.3. SUPERFICI PARAMETRIZZATE 25

1. Disegnare il grafico di x2 + y 2 = z 2
y2 z2
2. Disegnare il grafico di x2 + 4 − 9 = 1.

3. Disegnare il grafico del cilindro z = sin(3x) con x ∈ [0, 2π], z ∈ [−1, 1].

4. Disegnare la superficie ottenuta ruotando la funzione


1
z =1+ sin2 x, x ∈ [0, π],
2
attorno all’asse x.

5. Disegnare la superficie ottenuta ruotando la funzione


1
z= , x ∈ [0.1, 2],
x
attorno all’asse z.

6. Disegnare la parte di sfera di raggio 3 la cui latitudine è compresa tra [−π/3, π/3].

7. Disegnare il cono z 2 = 19 (x2 + y 2 ) e il cilindro y 2 + z 2 = 1 nello stesso grafico.

8. Disegnare la sfera di raggio 3 centrata in (1, −1, 0); usare hold on e quindi disegnare
l’ellissoide (x − 1)2 + (y + 1)2 /4 + 9z 2 = 25 nello stesso grafico.

3.3 Superfici parametrizzate


Disegneremo qui superfici definite parametricamente, cioè tramite funzioni

f (u, v) = (f1 (u, v), f2 (u, v), f3 (u, v)),

dove f : [a, b] × [c, d] → R3 . Utilizzeremo i seguenti comandi

[u,v]=meshgrid(a:du:b,c:dv:d);
surf(f1(u,v),f2(u,v),f3(u,v));

dove tipicamente du e dv sono presi pari a .1 o .2; in alternativa, potremo usare anche il
comando surfl a seconda dei casi (provare a capire le differenze tra surf e surfl utilizzando
la guida di Matlab). Un esempio di superficie parametrizzata lo abbiamo già incontrato
come grafico di una funzione; vedremo anche esempi di superfici di rotazione.

3.3.1 Grafici di funzioni


Siamo qui nel caso già visto di z = g(x, y), cioè con parametrizzazione data da f (u, v) =
(u, v, g(u, v)), g : [a, b] × [c, d] → R; avremo quindi

[x,y]=meshgrid(a:.1:b,c:.1:d);
surfl(x,y,g(x,y));

Ad esempio, se consideriamo la funzione g(x, y) = x3 + y 3 sul dominio (x, y) ∈ [−2, 2]2 ,


avremo
26 CAPITOLO 3. SUPERFICI

[x,y]=meshgrid(-2:.1:2);
surfl(x,y,x.^3+y.^3);
con la seguente variante se si vuole modificare le coordinate della sorgente di luce:
[x,y]=meshgrid(-2:.1:2);
S=[120,30];
surfl(x,y,x.^3+y.^3,S);
Si potrebbe aggiungere ai precedenti comandi alcuni comandi che disegnano il campo di
vettori normali alla superficie; ricordiamo che il campo normale è dato da
fu (u, v) × fv (u, v)
n̂(u, v) = ,
kfu (u, v) × fv (u, v)k
dove fu e fv rappresentano le derivate parziali della parametrizzazione f . Nel caso di un
grafico avremo quindi che fu (u, v) = (1, 0, gu (u, v)) e fv (u, v) = (0, 1, gv (u, v)), da cui
1
n̂(u, v) = p (−gu (u, v), −gv (u, v), 1).
1 + k∇g(u, v)k2
Come esercizio, si provi ad utilizzare, come fatto nel capitolo 2, il comando quiver per
disegnare il campo normale alla superficie, cioè i vettori n̂(u, v).

3.3.2 Superfici di rotazione


Ricordiamo che una superficie di rotazione può essere ottenuta ruotando attorno all’asse z
il grafico di una funzione z = g(x), x ∈ [a, b], oppure ruotando una curva parametrizzata
(x, z) = r(t), t ∈ [a, b]. La parametrizzazione della superficie si ottiene quindi mediante
f : [a, b] × [0, 2π] data da, nel primo caso
f (u, v) = (u cos v, u sin v, g(u)),
mentre nel secondo caso
f (u, v) = (r1 (u) cos v, r1 (u) sin v, r2 (v)).
Utilizzeremo quindi in generale i seguenti comandi:
[t,theta]=meshgrid(a:.1:b,0:2*pi/30:2*pi);
x=r1(t).*cos(theta);
y=r1(t).*sin(theta);
z=r2(t);
surf(x,y,z);
Possiamo ad esempio considerare il toro, ottenuto ruotando attorno all’asse z la circonfe-
renza (x(t), z(t)) = (3 + cos t, sin t), t ∈ [0, 2π]. Fissiamo il punto di vista tramite il comando
view e imponiamo che gli assi di riferimento siano uguali mediante axis equal.
[t,theta]=meshgrid(0:2*pi/30:2*pi);
x=(3+cos(t)).*cos(theta);
y=(3+cos(t)).*sin(theta);
z=sin(t);
surfl(x,y,z);
view(-10,20);
axis equal;
3.3. SUPERFICI PARAMETRIZZATE 27

Come esercizio, si provi a dire quali sono, nel grafico appena ottenuto, le linee u 7→ f (u, v)
con v costante e quali le linee v 7→ f (u, v) con u costante. Si usino inoltre i comandi shading
interp e shading faceted.
Come esercizio, si utilizzi anche in questo caso il comando quiver per disegnare il campo
normale alla superficie, cioè i vettori
fu (u, v) × fv (u, v)
n̂(u, v) = ,
kfu (u, v) × fv (u, v)k

che nel nostro caso, dato che f (u, v) = ((3 + cos u) cos v, (3 + cos u) sin v, sin u), sarà dato da

(sin u cos v, − sin u sin v, cos u) × (−(3 + cos u) sin v, (3 + cos u) cos v, 0)
n̂(u, v) =
k(sin u cos v, − sin u sin v, cos u) × (−(3 + cos u) sin v, (3 + cos u) cos v, 0)k
=(− cos u cos v, − cos u sin v. − sin u).

Esercizio 3.6
1. Disegnare la superficie parametrizzata da

f (u, v) = (u sin u cos v, u cos u cos v, u sin v), (u, v) ∈ [0, 2π]2 .

Si individuino le curve u = costante e v = costante.


2. Disegnare il grafico del cilindro circolare x2 + y 2 = 1 di altezza 5 e si aggiustino gli assi
in modo da farlo apparire circolare e si modifichi il punto di vista in modo da vedere
l’interno del cilindro.
3. Disegnare il nastro di Möbius parametrizzato da
v v v
f (u, v) = (2 cos v + u cos , 2 sin v + u cos , u sin ), u ∈ [−1/2, 1/2], v ∈ [0, 2π].
2 2 2
Utilizzare il comando rotate3d per aiutare la visualizzazione della superficie. Indivi-
duare, anche tracciando un secondo grafico, le curve con r = −1/2 e r = 1/2.
4. Disegnare il grafico della porzione di iperboloide −x2 − y 2 + z 2 = 1 individuata da
x ∈ [−2, 2] e y ∈ [−3, 3].
5. Possiamo utilizzare le funzioni iperboliche per parametrizzare l’iperboloide del punto
precedente; si disegni la superficie parametrizzata da

f (u, v) = (cos u sinh v, sin u sinh v, ± cosh v), u ∈ [0, 2π], v ∈ [−2, 2].

6. Modificare il punto precedente per disegnare l’iperboloide x2 + y 2 − z 2 = 1.

Esercizio 3.7 Si rappresenti la proiezione stereografica della sfera, cioè si consideri la


parametrizzazione della sfera f : R2 → R3 data da

u2 + v 2 − 1
 
2u 2v
f (u, v) = , ,
u2 + v 2 + 1 u2 + v 2 + 1 u2 + v 2 + 1
e nella stessa figura si disegni la sfera di raggio 1, il piano z = 0 e alcuni punti di tale piano
(u, v, 0) insieme al segmento che li congiunge col punto di coordinate (0, 0, 1).
28 CAPITOLO 3. SUPERFICI

3.4 Piano tangente ad una superficie parametrizzata


Ricordiamo che data una superficie parametrizzata da

f (u, v) = (x(u, v), y(u, v), z(u, v)), (u, v) ∈ [a, b] × [c, d],

l’equazione del piano tangente la superficie in f (u0 , v0 ) è data da

(x(s, t), y(s, t), z(s, t) = f (u0 , v0 ) + (s − u0 )fu (u0 , v0 ) + (t − v0 )fv (u0 , v0 ).

Prendiamo ad esempio l’iperboloide parametrizzato da

f (u, v) = (cos u sinh v, sin u sinh v, cosh v)

e il punto f (0, 1). Il piano tangente sarà quindi dato da

(x(s, t), y(s, t), z(s, t) = (sinh 1 + t cosh 1, s sinh 1, cosh 1 + t sinh 1).

I seguenti comandi disegnano l’iperboloide per u ∈ [0, 2π], v ∈ [−2, 2] e il suo piano tangente.
[u,v]=meshgrid(0:pi/40:2*pi,-2:.1:2);
x=cos(u).*sinh(v); y=sin(u).*sinh(v); z=cosh(v);
surf(x,y,z); hold on;
[s,t]=meshgrid(-2:2:2);
X=sinh(1)+cosh(1)*t;
Y=sinh(1)*s;
Z=cosh(1)+sinh(1)*t;
surf(X,Y,Z); hold off;

Esercizio 3.8

1. Disegnare il grafico di z = sin(x2 + y 2 ) e il suo piano tangente in (1, 1, sin 2).


2. Disegnare il grafico di

f (u, v) = (2 cos u sin v, sin u sin v, 3 cos v)

e il suo piano tangente nel punto f (0, π/3).


3. Disegnare il toro

f (u, v) = ((3 + cos u) cos v, (3 + cos u) sin v, sin u), (u, v) ∈ [0, 2π]2

e il suo piano tangente nel punto f (π/4, 0) (utilizzare anche il comando axis equal).
Capitolo 4

Punti stazionari e massimi e


minimi

4.1 Classificazione di punti stazionari


Il problema della classificazione dei punti stazionari consiste nella classificazione di una
forma quadratica; il primo metodo per la classificazione di una forma quadratica consiste
nello studio del segno degli autovalori di una matrice. Possiamo quindi utilizzare il comando
eig che, data una matrice, restituisce come risultato due matrici, una che contiene, nelle
colonne, gli autovettori, e una seconda in forma diagonale sulla cui diagonale sono contenuti
gli autovalori. Cosı̀ ad esempio possiamo considerare i seguenti comandi;

A=[-6 -6; -6 2];


[V,D]=eig(A)

Si deduce quindi che A ha un autovalore negativo e uno positivo, quindi A è una matrice
indefinita. Analogamente;

A=[6 0 -2; 0 4 0; -2 0 2];


[V,D]=eig(A)

da cui si deduce che A è definita positiva.


La verifica si può anche fare applicando il Teorema di Sylvestre, e cioè calcolando i
determinanti dei minori principali; possiamo quindi considerare i seguenti comandi

A=[-6 6; -6 2];
A(1,1)
det(A)

da cui si vede che i numeri ottenuti sono entrambi negativi per la prima matrice, e quindi
la matrice è indefinita, mentre

A=[6 0 -2; 0 4 0; -2 0 2];


A(1,1)
det([6 0; 0 4])
det(A)

29
30 CAPITOLO 4. PUNTI STAZIONARI E MASSIMI E MINIMI

da cui si vede che tutti i determinanti dei minori principali sono positivi, e quindi A è
definita positiva.
Tipicamente il problema consiste nel cercare prima i punti stazionari e poi nel classificarli
e per questo può essere utilizzato il symbolic toolbox. Consideriamo per semplicità la
funzione di due variabili
f (x, y) = 4x2 + 3y 2 + 12xy + 7x + 8y + 5
che, come si vedrà, ha un solo punto stazionario.
syms x y real
f = 4*x^2+3*y^2+12*x*y+7*x+8*y+5;
e calcoliamone i punti stazionari attraverso il comando solve applicato alle derivate parziali
fx=diff(f,x); fy=diff(f,y);
S=solve(fx,fy,x,y)
Si ottiene una struttura S che contiene un valore di x e uno di y, cioè f (x, y) ha un solo
punto stazionario (xm , ym ).
xm=S.x
ym=S.y
Calcoleremo ora le derivate seconde e le valuteremo nel punto (xm , ym ) con il comando subs,
ottenendo la matrice Hessiana H(xm , ym ).
fxx=diff(fx,x); fxy=diff(fx,y);
fyx=diff(fy,x); fyy=diff(fy,y);
H=[subs(fxx,{x,y},{xm,ym}) subs(fxy,{x,y},{xm,ym});
subs(fyx,{x,y},{xm,ym}) subs(fyy,{x,y},{xm,ym})]
Per determinare se (xm , ym ) un punto di minimo, di massimo o di sella, troviamo gli
autovalori di H;
eig(H)
Gli autovalori sono di segno opposto, dunque la matrice Hessiana è indefinita e (xm , ym )
è un punto di sella. Andiamo a controllare quanto detto tracciando il grafico di f :
x=linspace(-1,.5);
[X,Y]=meshgrid(x);
f = 4.*X.^2+3.*Y.^2+12.*X.*Y+7.*X+8.*Y+5;
surf(X,Y,f)

4.2 Massimo e minimo di una funzione


I massimi e i minimi, assieme ai loro punti di massimo e di minimo di una funzione possono
essere individuati utilizzando i comandi Matlab min e max; l’accuratezza del calcolo dei
massimi e dei minimi dipende dalla griglia scelta per definire la funzione.
Iniziamo con un esempio di una funzione di una variabile; supponiamo di voler determi-
nare il massimo e il minimo della funzione
f (x) = 2 cos(2x) − 3 cos x, x ∈ [0, 2π].
Possiamo considerare molto semplicemente i seguenti comandi;
4.2. MASSIMO E MINIMO DI UNA FUNZIONE 31

x=linspace(0,2*pi,700);
y=2*cos(2*x)-3*cos(x);
M=max(y)
m=min(y)
Si provi a calcolare analiticamente il massimo e il minimo della funzione data e si commentino
i risultati ottenuti.

Esercizio 4.1 Si scrivano comandi Matlab che calcolino il massimo e il minimo della
funzione
x
f (x) = 2 sin(2x) − 3 cos( ),
2
ed utilizzino subplot per disegnare il grafico della funzione e della sua derivata (calcolata
numericamente utilizzando incrementi pari a .001) nell’intervallo [0, 2π]. Come variante di
questo esercizio, si ripeta il procedimento utilizzando il comando subplot per disegnare la
funzione assieme alle sue derivate prima e seconda calcolata analiticamente.

4.2.1 Massimo e minimo di una funzione di due variabili su di un


rettangolo
Supponiamo ora di voler determinare il massimo e il minimo di

f (x, y) = sin x + sin y + sin(x + y), (x, y) ∈ [−π/4, π/4]2 .

Possiamo quindi considerare i seguenti comandi, in cui la determinazione del massimo e


del minimo viene fatta sia guardando il grafico della funzione, sia studiando le sue linee di
livello.
[x,y]=meshgrid(-pi/4:pi/80:pi/4);
z=sin(x)+sin(y)+sin(x+y);
figure(1); surf(x,y,z);
figure(2); [C,h]=contour(x,y,z,20);
clabel(C,h);
Studiando i due grafici ottenuti, si deduce subito che il massimo viene assunto nel punto
(π/4, π/4), mentre il punto di minimo viene assunto in (−π/4, −π/4); possiamo modificare
i precedenti comandi in modo da individuare i valori ed i punti di massimo e minimo della
funzione;
[x,y]=meshgrid(-pi/4:pi/80:pi/4);
z=sin(x)+sin(y)+sin(x+y);
figure(1); surf(x,y,z);
[M,ind]=max(z(1:prod(size(z))));
Mx=num2str(x(ind)); My=num2str(y(ind));
M=num2str(M);
TM=[’Massimo= ’,M,’, assunto in (’,Mx,’,’,My,’)’]
text(-1,1,5,TM);
Si provi a modificare i precedenti comandi in modo da individuare anche il minimo e il punto
di minimo. Si provi quindi ad usare il comando help per capire come funzionano i comandi
max e min, sia nel caso in cui l’argomento è un vettore, che nel caso in cui l’argomento è una
32 CAPITOLO 4. PUNTI STAZIONARI E MASSIMI E MINIMI

matrice. Se ne dovrebbe dedurre che nel caso in cui z è una matrice, max(z) è un vettore
riga, i cui elementi sono determinati dai massimi di z in ogni colonna. In questo modo,
il valore massimo è individuato semplicemente con il comando max(max(z)). Nei comandi
considerati sopra, quello che è stato fatto è stato praticamente ridurre la matrice z ad un
vettore di lunghezza il prodotto delle dimensioni della matrice z; in questo modo fare max
una volta sola coincide con il comando max(max(z)).

4.2.2 Massimi e minimi su cerchi


Supponiamo ora di voler calcolare il massimo e il minimo della funzione

f (x, y) = x2 + 2y 2 − 4y − 2, x2 + y 2 ≤ 4.

Ci sono sostanzialmente due modi di procedere; uno è l’utilizzo delle coordinate polari, il
secondo è estendere la funzione su di un dominio rettangolare ponendola zero all’esterno del
cerchio mediante gli operatori logici; in questo secondo metodo c’è però da tener presente
che se la funzione è tutta strettamente positiva o strettamente negativa nel cerchio, allora
la risposta ottenuta sarebbe incorretta, e quindi il metodo andrebbe modificato.
Il primo metodo viene trattato con i seguenti comandi;
[r,theta]=meshgrid(0:.1:2,0:pi/20:2*pi);
x=r.*cos(theta); y=r.*sin(theta);
f=x.^2+2*y.^2-4*y-2; surfl(x,y,f);
[m,imin]=min(f(1:prod(size(f))));
m=num2str(m);
mx=num2str(x(imin)); my=num2str(y(imin));
Tm=[’Minimo= ’,m,’, assunto in (’,mx,’,’,my,’)’]
text(0,2,10,Tm);
Nel secondo caso possiamo considerare i seguenti comandi:
[x,y]=meshgrid(-2:.05:2);
f=(x.^2+y.^2<=4).*(x.^2+2*y.^2-4*y-2);
surfl(x,y,f);
[M,imax]=max(f(1:prod(size(f))));
M=num2str(M);
Mx=num2str(x(imax)); My=num2str(y(imax));
TM=[’Massimo= ’,M,’, assunto in (’,Mx,’,’,My,’)’]
text(0,2,10,TM);
Provare ad impostare il punto di vista con view(-100,10) per avere una buona visualizza-
zione dei punti di massimo e di minimo.

Esercizio 4.2
1. Disegnare il grafico e le linee di livello della funzione

f (x, y) = 2x3 + xy 2 + 5x2 + y 2

nel rettangolo −2.5 ≤ x ≤ 0.6, −3 ≤ y ≤ 3; inserire a mano nel grafico i punti


stazionari ed etichettarli come punti di sella o punti di massimo o minimo locali.
4.3. MASSIMI E MINIMI VINCOLATI 33

2. Utilizzare i metodi grafici (grafico e linee di livello) per individuare i punti estremali
di
f (x, y) = e−xy , 4x2 + y 2 ≤ 2.
Utilizzare il comando text per riportare i valori massimo e minimo e i punti do-
ve vengono assunti. Si ripeta l’esercizio utilizzando le coordinate polari (ellittiche).
Si utilizzi anche il metodo di estensione di f ad un dominio rettangolare mediante
operatori logici e si commenti il risultato ottenuto.

4.3 Massimi e minimi vincolati


Quando il vincolo è parametrizzabile, possiamo individuare il massimo e il minimo per
via grafica; il grafico del vincolo e delle linee di livello possono inoltre essere utilizzati per
l’individuazione dei punti estremali (saranno individuati dai punti di tangenza tra il vincolo
e il livello della funzione), dando cosı̀ una visualizzazione del metodo dei moltiplicatori di
Lagrange.
Supponiamo ad esempio di voler trovare gli estremi della funzione

f (x, y) = x3 + y 3 + 3xy

soggetta al vincolo (x − 3)2 + (y − 3)2 = 9. Tracciamo quindi il grafico di f , la curva che


definisce il vincolo e la curva nello spazio che si ottiene restringendo la funzione al vincolo:

[x,y]=meshgrid(-1:.1:7);
z=x.^3+y.^3+3*x.*y;
surf(x,y,z); hold on;
t=linspace(0,2*pi,300);
x=3+3*cos(t); y=3+3*sin(t);
f=x.^3+y.^3+3*x.*y;
plot3(x,y,f,’r’);
plot3(x,y,0*f);
hold off;

Si utilizzi il comando rotate3d per avere una visualizzazione migliore del risultato ottenuto.
Utilizzeremo ora una procedura grafica che ci darà una buona stima dei valori estremali
di f soggetta al vincolo dato. Nel primo caso parametrizzeremo la curva e quindi tracceremo
il grafico della funzione ristretta a tale curva; gli estremali saranno individuati guardando
tale grafico. Il vincolo è una circonferenza con parametrizzazione

 x = 3 + 3 cos t,
, t ∈ [0, 2π].
y = 3 + 3 sin t

Possiamo quindi utilizzare tale parametrizzazione per ottenere una funzione di una variabile,
e possiamo quindi individuare il massimo e il minimo utilizzando i comandi max e min.

t=linspace(0,2*pi,300);
x=3+3*cos(t); y=3+3*sin(t);
f=x.^3+y.^3+3*x.*y; plot(t,f);
34 CAPITOLO 4. PUNTI STAZIONARI E MASSIMI E MINIMI

Quello ottenuto è il grafico della funzione ristretta al vincolo; si potrebbe darne una visua-
lizzazione tridimensionale, considerando ad esempio il comando
plot3(x,y,f);
Come esercizio, si tracci il grafico cosı̀ ottenuto, assieme alla curva che definisce il vincolo
vista nello spazio tridimensionale. Come variante e/o abbellimento della figura, invece del
comando plot3(x,y,f) si potrebbe utilizzare il comando stem3(x,y,f).
Osservando il grafico ottenuto, si intuisce che il massimo è circa 350 ed è ottenuto per
t = 0.8, mentre il minimo è pari a 0 ottenuto circa per t = 3.95. Per avere una stima
migliore di tali risultati, si può aggiungere la seguente lista di comandi a quanto fatto
precedentemente;
[m,mt]=min(f); tmin=num2str(t(mt));
m=num2str(m);
T=[’Minimo= ’,m,’ ottenuto per t= ’,tmin];
text(3.5,50,T);
Con il secondo metodo, disegneremo la curva che definisce il vincolo e i livelli di f . Ov-
viamente, le limitazioni sulla griglia scelta vanno scelte in modo da contenere tutta la curva
che definisce il vincolo; anche la scelta dei livelli dovrà essere fatta in maniera opportuna ed
in genere si procede per tentativi successivi.
[x,y]=meshgrid(-1:.1:7);
f=x.^3+y.^3+3*x.*y;
L=[0:10 20:10:100 150:50:350];
[C,h]=contour(x,y,f,L);
v=[0:2:10 150:50:350];
clabel(C,h,v); hold on;
t=linspace(0,2*pi,300);
x=3+3*cos(t); y=3+3*sin(t);
plot(x,y); hold off;
Come variante, per una visualizzazione del metodo dei moltiplicatori di Lagrange, si potreb-
be disegnare il campo gradiente della funzione che definisce il vincolo
g(x, y) = (x − 3)2 + (y − 3)2 − 9
assieme al campo gradiente della funzione f ; tali campi gradiente vanno disegnati sulla curva
g(x, y) = 0. I punti estremali si avranno in corrispondenza dei punti nei quali tali campi
gradiente sono paralleli tra loro.
Esercizio 4.3 Si utilizzi il metodo grafico per stimare il massimo e il minimo della funzione
f (x, y) = xy
2 2
soggetta al vincolo 4x + y = 9. Inoltre, si tracci nello stesso disegno il grafico di f , la
curva che definisce il vincolo e la curva dello spazio ottenuta restringendo f al vincolo. Si
parametrizzi inoltre il vincolo e si tracci il grafico della funzione di una variabile ottenuta
restringendo la funzione al vincolo e da tale grafico si dia una stima del massimo e del
minimo della funzione. Si utilizzino quindi i comandi max e min per la determinazione dei
punti estremali; usare infine il comando text per scrivere i valori ottenuti sul grafico.
In conclusione, si usi il metodo delle linee di livello per individuare i punti di massimo e
di minimo, etichettando i livelli.
Capitolo 5

Integrali multipli

In questo capitolo trattiamo gli integrali multipli, e più precisamente gli integrali doppi nella
sezione 5.1 e gli integrali tripli nella sezione 5.4.

5.1 Integrali doppi


Ricordiamo che l’integrale doppio di una funzione continua definita su un rettangolo f :
[a, b] × [c, d] → R è dato passando al limite nelle somme di Riemann
X
f (x∗h , yk∗ )(xh+1 − xh )(yk+1 − yk )
h,k

dove a ≤ x0 ≤ · · · ≤ xN ≤ b, c ≤ y0 ≤ · · · ≤ yM ≤ d induce una partizione del rettangolo


in rettangolini [xh , xh+1 ] × [yk , yk+1 ] e (x∗h , yk∗ ) ∈ [xh , xh+1 ] × [yk , yk+1 ] (sarà il punto di
minimo di f su tale rettangolino se stiamo costruendo le somme integrali inferiori, mentre
sarà il massimo di f sul rettangolino se stiamo considerando le somme integrali superiori).
Il punto (x∗h , yk∗ ) può essere anche preso arbitrario dato che f è una funzione continua (e
questo sarà il caso per tutte le funzioni che qui considereremo).
Tale costruzione si adatta molto bene a Matlab, in quanto possiamo considerare par-
tizioni del rettangolo fatte da rettangoli congruenti, cioè ad esempio

h(b − a) k(c − d)
xh = , yk = , h = 0, . . . , N, k = 0, . . . , M.
N M
Potremmo quindi considerare i seguenti comandi

dx=(b-a)/N; dy=(c-d)/M;
[x,y]=meshgrid(a+dx/2:dx:b-dx/2,c+dy/2:dy:d-dy/2);
f=f(x,y);
Riemann=sum(sum(f))*dx*dy;

Ad esempio, se f (x, y) = sin(x + y) e il rettangolo è dato da [0, π/2]2 , allora possiamo


considerare i seguenti comandi, dove si disegna il grafico di sin(x + y) e si calcola la somma
di Riemann;

35
36 CAPITOLO 5. INTEGRALI MULTIPLI

[x,y]=meshgrid(0:pi/60:pi/2);
surf(x,y,sin(x+y));
N=50; M=50; dx=pi/100; dy=dx;
[x,y]=meshgrid(0+dx/2:dx:pi/2-dx/2);
f=sin(x+y); R=sum(sum(f))*dx*dy;
R=num2str(R); text(.1,.1,1.4,[’Somma di Riemann= ’,R]);
Si utilizzi il comando rotate3d per visualizzare meglio la figura. Si provi poi a ripetere
quanto fatto ora con la funzione f (x, y) = cos2 (x + 2y) sul rettangolo [0, π] × [0, π/2].

5.2 Formule di riduzione per integrali doppi


Vediamo qui una applicazione della formula di riduzione di un integrale doppio con f :
[a, b] × [c, d] → R
Z Z b Z d
f (x, y)dxdy = dx f (x, y)dy.
[a,b]×[c,d] a c

In Matlab esiste la funzione dblquad che fornisce una quadratura numerica dell’integrale
doppio. Vediamo come funziona con un esempio; la funzione f deve essere data in pasto
al comando dblquad o tramite il comando fcnchk oppure deve essere definita utilizzando
un m–file. In pratica, f deve essere riconosciuta da Matlab come una function, che può
essere definita sia direttamente col comando fcnchk, oppure esternamente tramite un m–file.
Calcoliamo ad esempio l’integrale di
1
f (x, y) = p
x2 + 2y 2 + 1

con (x, y) ∈ [0, 1] × [0, 2]; useremo il comando fcnchk.


Stima=dblquad(fcnchk(’1./sqrt(x.^2+2*y.^2+1)’),0,1,0,2);
Stm=num2str(Stima);
[x,y]=meshgrid(0:.5:1,0:.1:2);
z=1./sqrt(x.^2+2*y.^2+1); surf(x,y,z);
rotate3d;
axis([0 1 0 2 0 1]);
text(.2,1.5,.2,[’Integrale= ’,Stm]);
Si può anche usare il comando Matlab del symbolic toolbox int; tale comando serve per
calcolare gli integrali di funzioni di una variabile, quindi per il calcolo di un integrale doppio
andrà utilizzato due volte.
syms x y real
Int1=int(1/sqrt(x^2+2*y^2+1),x,0,1);
R=int(Int1,y,0,2);
Si noti che con tali comandi il risultato esplicito non si riesce ad ottenere (il compilatore
o restituisce un’espressione complicata o scrive un messaggio di attenzione comunicando
che l’integrale non si riesce a calcolare esplicitamente). Possiamo però ottenere il risultato
numerico dell’integrazione mediante il comando;
R=double(R);
5.3. INTEGRALI DOPPI SU DOMINI GENERICI 37

Esercizio 5.1

1. Si utilizzi sia l’integrale iterato che il comando dblquad per calcolare


Z
x sin(x + y)dxdy.
[0,π/6]×[0,π/3]

Si tracci anche il grafico della funzione integranda e mediante il comando text si


riporti il valore delle integrazioni effettuate.

2. Trovare il volume del solido sottostante il grafico dell’iperboloide

z = x2 − y 2 , (x, y) ∈ [−1, 1] × [1, 3].

Si disegni il grafico della funzione f (x, y) = x2 − y 2 e si riportino i valori delle


integrazioni effettuate sia con il dblquad che con l’integrazione iterata.

5.3 Integrali doppi su domini generici


Per poter integrare funzioni su domini limitati generici, procederemo in analogia a quanto si
è fatto nel corso della teoria; più precisamente, si considererà un rettangolo che contiene il
nostro dominio ed estenderemo la funzione ponendola zero nella regione del rettangolo che
non appartiene al dominio.
Prendiamo ad esempio la funzione f (x, y) = 3 − x2 − 2y 2 sul dominio E = {x2 + y 2 ≤ 1};
l’integrale di f su E rappresenta il volume del sottografico di f che è la parte di un cilindro
compreso tra il piano z = 0 e il paraboloide z = f (x, y). Calcoleremo l’integrale utilizzando
le somme di Riemann e anche il comando dblquad.

z=fcnchk(’(x.^2+y.^2<=1).*(3-x.^2-2*y.^2)’);
dx=2/50; dy=2/50;
[x,y]=meshgrid(-1+dx/2:dx:1-dx/2);
Riemann=sum(sum(z(x,y)))*dx*dy;
R=num2str(Riemann);
Stima=dblquad(z,-1,1,-1,1);
S=num2str(Stima);
[x,y]=meshgrid(-1:.2:1);
surf(x,y,z(x,y));
text(-1,.8,3.2,[’Somma di Riemann= ’,R]);
text(-1,.8,3.6,[’Integrazione numerica= ’,S]);
text(-1,.8,4,[’Valore preciso=9*pi/4=7.0686’]);

Una variazione ai comandi precedenti si può effettuare quando si richiama la funzione


dblquad: più precisamente, la funzione può essere definita tramite un m–file. Cosı̀ ad
esempio potremmo considerare il comando

Stima=dblquad(z,-1,1,-1,1,Puntomedio);

dove Puntomedio.m è un m–file descritto ad esempio dai seguenti comandi;


38 CAPITOLO 5. INTEGRALI MULTIPLI

function [A,n]=Puntomedio(fun,a,b,E);
fun=fcnchk(fun,’vectorized’);
x=a:.001:b;
y=fun(x);
y2=diff(y,2)/.001^2;
K=max(abs(y2));
n=ceil(sqrt(K*(b-a)^3/E/24));
h=(b-a)/n;
xstart=a+h/2:h:b-h/2;
f=fun(xstart);
A=sum(f)*h;
Atri modi per passare la funzione da integrare al comando dblquad possono essere i seguenti;
dblquad(@(x,y) funzione,a,b,c,d);
dove al posto della stringa funzione va inserita la definizione della nostra funzione e a, b,
c e d sono gli estremi di integrazione, cioè nel nostro caso
funzione= 3-x.^2-2*y.^2
a=-1; b=1; c=-1; d=1;
In alternativa si può considerare la sintassi:
dblquad(@funzione.m,a,b,c,d);
dove funzione.m è un m–file che definisce la funzione da integrare, e deve quindi essere
strutturato come segue;
function z=funzione(x,y);
...

5.3.1 Disegno di insiemi nel piano


A volte può essere utile, prima di calcolare un integrale, avere un’idea della regione su cui
si vuole calcolare l’integrale. Ad esempio, se si chiede di integrare f (x, y) = xy sul dominio
limitato dai grafici y = x4 e y = 3x − x3 , possiamo preliminarmente utilizzare i seguenti
comandi;
x=linspace(-2,2);
plot(x,x.^4,x,3*x-x.^3);
Si nota quindi che i due grafici si incontrano per x = 0 e in un secondo punto x = b compreso
tra 1 e 1.5; avremo che l’integrale sarà quindi dato da
Z b Z 3x−x3
1 b8 9b4 b10
 
6
xydy = + − −b .
0 x4 2 8 4 10
Il punto b andrebbe determinato come soluzione dell’equazione

b3 + b2 − 3 = 0,

ma per questo tipo di equazioni non esistono formule risolutive. Con i seguenti comandi,
individueremo tale soluzione numericamente con il comando fzero;
5.4. INTEGRALI TRIPLI 39

x=linspace(-2,2); plot(x,x.^4,x,3*x-x.^3);
axis([-.25 1.5 -1 4]); grid on;
b=fzero(’x.^4-3*x+x.^3’,1);
syms x y real
syms x y real;
A=int(int(x*y,y,x^4,3*x-x^3),x,0,b);
A=num2str(double(A));
T=[’\int_D xy dx dy= ’,A];
text(.01,3.25,T); text(.7,1,’D’);
set(gca,’XTick’,[0:.5:1 b]);
text(-.1,3*(-.1)-(-.1)^3,’\leftarrow 3x-x^3’);
text(1,1,’\leftarrow x^4’);

Qui i comandi nell’ambiente text che vengono preceduti da un backslash sono riconosciuti
dal formattatore LaTeX, che è un formattatore per testi scientifici, molto usato in ambito
matematico. Si provi ad esempio ad inserire dentro un comando text i seguenti comandi

\frac{x^2}{\sqrt{1-x}}
\int_0^2 e^\sqrt{5-6x^2} dx

Esercizio 5.2 Si consideri l’integrale


Z p
x3 + 1dxdy
D

con D dominio limitato dai grafici y = x2 , x = 1 e l’asse delle x.

1. Calcolare le somme √di Riemann con N = M = 50 ed usare il comando fcnchk per


estendere f (x, y) = x3 + 1 nulla all’esterno di D.

2. Disegnare il grafico di f , estesa a zero fuori da D, sul quadrato (x, y) ∈ [0, 1]2 ed usare
il comando text per riportare il valore della somma di Riemann.

3. Calcolare a mano l’integrale.

4. Usare il comando dblquad per stimare l’integrale. Se il comando non funziona a causa
delle troppe discontinuità della funzione, utilizzare come metodo alternativo l’m–file
Puntomedio.m o creare un m–file alternativo per il calcolo dell’integrale (ad esempio
scrivere un m–file che implementi il metodo di Simpson per il calcolo dell’integrale;
per informazioni sul metodo di Simpson, rimandiamo all’appendice B).

5. Tracciare il grafico delle curve che definiscono il dominio D ed usare il comando text
per mettere le etichette sulle curve, sul dominio D e per riportare il valore delle somme
di Riemann ottenute, del valore esatto calcolato a mano e il valore numerico ottenuto
con dblquad (o con un qualsiasi altro metodo adottato per il calcolo).

5.4 Integrali tripli


La somma di Riemann per un integrale triplo sarà definita mediante una griglia tridimen-
sionale, cosı̀ possiamo considerare comandi come segue;
40 CAPITOLO 5. INTEGRALI MULTIPLI

dx=(b-a)/N; dy=(c-d)/M; z=(e-f)/P;


[x,y,z]=meshgrid(a:dx:b,c:dy:d,e:dz:f);
dove si è preparata la griglia per il calcolo di un integrale triplo su di un parallelepipedo
[a, b] × [c, d] × [e, f ].
Se ad esempio vogliamo calcolare l’integrale della funzione f (x, y, z) = x2 + yz su E =
[0, 2] × [−3, 0] × [−1, 1] con N = M = P = 30, possiamo considerare i seguenti comandi,
dove a fianco della somma di Riemann utilizziamo anche l’integrazione iterata, cioè il fatto
che E è un insieme semplice e
Z Z 2 Z 0 Z 1
f (x, y, z)dxdydz = dx dy (x2 + yz)dz.
E 0 −3 −1

dx=2/30; dy=3/30; dz=2/30;


px=dx/2:dx:2-dx/2;
py=-3+dy/2:dy:-dy/2;
pz=-1+dz/2:dz:1-dz/2;
[x,y,z]=meshgrid(px,py,pz);
Riemann=sum(sum(sum(x.^2+y.*z)))*dx*dy*dz
syms x y z real
A=int(int(int(x^2+y*z,z,-1,1),y,-3,0),x,0,2)

5.4.1 Integrali su domini generici


Consideriamo ora il problema dell’integrazione della funzione f (x, y, z) = ex sull’insieme
E = {(x, y, z) : 0 ≤ y ≤ 1, 0 ≤ x ≤ y, 0 ≤ z ≤ x + y};
possiamo considerare i comandi seguenti;
w=fcnchk(’(0<=y).*(y<=1).*(0<=x).*(x<=y).*(0<=z).*(z<=x+y).*exp(x)’);
dx=1/50; dy=dx; dz=2/100;
[x,y,z]=meshgrid(dx/2:dx:1-dx/2,dy/2:dy:1-dy/2,dz/2:dz:2-dz/2);
Riemann=sum(sum(sum(w(x,y,z))))*dx*dy*dz;
syms x y z real;
A=int(int(int(exp(x),z,0,x+y),0,y),0,1)
Si noti come sono stati utilizzati gli operatori logici di confronto. Infine, si noti che il risultato
viene riportato scritto in forma esponenziale decimale; per convertirlo in un numero decimale
basta inserire la seguente riga di comando;
double(A);

5.4.2 Grafico di regioni solide


Può essere utile prima di calcolare un integrale triplo a mano avere un’idea di come è fatto il
dominio di integrazione, in modo da avere un aiuto per la scelta del metodo di integrazione.
Possiamo quindi utilizzare Matlab per questo scopo, disegnando i bordi dell’insieme di
integrazione. Se ad esempio volessimo disegnare la regione solida della sezione precedente
descritta analiticamente da
E = {(x, y, z) : 0 ≤ y ≤ 1, 0 ≤ x ≤ y, 0 ≤ z ≤ x + y},
potremmo procedere come segue;
5.4. INTEGRALI TRIPLI 41

y=linspace(0,1); x=0*y; z=0*y;


plot3(x,y,z);
hold on; grid on;
x=0*y; z=y; plot3(x,y,z);
x=y; z=0*y; plot3(x,y,z);
x=y; z=x+y; plot3(x,y,z);
x=linspace(0,1); y=1+0*x; z=0*x; plot3(x,y,z);
z=x+1; plot3(x,y,z);
z=linspace(0,2); x=1+0*z; y=1+0*z;
plot3(x,y,z);
z=linspace(1,0); x=0*z; y=1+0*z;
plot3(x,y,z); hold off;

Esercizio 5.3

1. Si scriva l’integrale triplo Z


3
e−% dxdydz
E
2 2 2
con E = {(x, y, z) : x + y + z ≤ 1} in coordinate sferiche; qui si intende % =
p
x2 + y 2 + z 2 . Si scrivano le somme di Riemann per tale integrale triplo con N =
M = P = 40 e si riporti il risultato ottenuto in un grafico dove viene rappresentata la
sfera di raggio 1. Si riporti inoltre il risultato del valore esatto dell’integrale ottenuto
a mano o con il calcolo simbolico di Matlab.
2. Si calcolino le somme di Riemann per l’integrale
Z
ydxdydz
E

con E = {0 ≤ z ≤ x + 2y, 0 ≤ x ≤ 1, 0 ≤ y ≤ x2 }. Si disegni la regione solida E.


42 CAPITOLO 5. INTEGRALI MULTIPLI
Capitolo 6

Integrali curvilinei e di
superficie

In questa sezione considereremo gli integrali curvilinei di prima e seconda specie (rispetti-
vamente, per funzioni scalari e vettoriali) e gli integrali di superficie per funzioni scalari e
vettoriali. Come applicazioni considereremo le formule di Gauss–Green e Stokes.

6.1 Integrali curvilinei


6.1.1 Integrali curvilinei per funzioni scalari
Una prima applicazione degli integrali curvilinei di prima specie, come visto nelle lezioni di
teoria, è ad esempio il calcolo della massa di un filo la cui densità di massa sia descritta da
una data funzione. Una volta calcolata la massa totale del filo, è possibile calcolare quindi
le coordinate del baricentro del filo. Supponiamo ad esempio di avere un filo della forma
di una semicirconferenza di raggio 2 nel piano la cui densità di massa sia descritta dalla
funzione p
f (s) = 1 + s2 ;
qui stiamo supponendo che il parametro s sia il parametro d’arco calcolato a partire dal
punto (2, 0). Stiamo quindi considerando la parametrizzazione r : [0, 2π] → R2 ,

r(s) = (2 cos(s/2), 2 sin(s/2)).

L’intervallo e la parametrizzazione sono stati calcolati tenendo conto che la lunghezza del
filo è L = 2π. La massa totale del filo sarà quindi data da
Z 2π p
M= 1 + s2 ds.
0

Si noti che nella formula precedente non compare kr0 (s)k, in quanto, avendo scelto s come
parametro d’arco, tale quantità è pari ad 1. Calcoliamo il precedente integrale usando il
symbolic toolbox;

syms s

43
44 CAPITOLO 6. INTEGRALI CURVILINEI E DI SUPERFICIE

densita=sqrt(1+s^2);
int(densita,0,2*pi)
massa=double(ans)

Calcoliamo ora le coordinate del baricentro del filo; per effettuare questo calcolo, invece
di utilizzare il parametro d’arco, considereremo la parametrizzazione equivalente data da
γ : [0.π] → R2 ,
γ(t) = (2 cos t, 2 sin t).
Dato
√ che kγ 0 (t)k = 2, si avrà che s(t) = 2t, da cui r(s) = r(2t) = γ(t) e la densità diventa
1 + 4t2 . Quindi le coordinate del baricentro saranno date da
Z π Z π
1 p
2
1 p
x̄ = 2 cos t 1 + 4t dt, ȳ = 2 sin t 1 + 4t2 dt.
M 0 M 0

Per il calcolo di tali coordinate utilizziamo il comando quad8, in quanto il calcolo simbolico
non si riesce a fare.

f=inline(’4*sqrt(1+4*t.^2).*cos(2*t)’);
g=inline(’4*sqrt(1+4*t.^2).*sin(2*t)’);
xbar=(1/massa)*quad8(f,0,pi)
ybar=(1/massa)*quad8(g,0,pi)

6.1.2 Rappresentazione di campi vettoriali


Prima di affrontare il problema del calcolo di integrali curvilinei per funzioni vettoriali,
proviamo a dare una rappresentazione grafica dei campi di vettori che vogliamo integrare.

Campi nel piano Un campo di vettori nel piano è determinato da una coppia di funzioni
scalari,
F (x, y) = (F1 (x, y), F2 (x, y))
e il metodo migliore per visualizzare un campo di vettori, come già visto nei capitoli
precedenti, è l’utilizzo del comando quiver.
Ad esempio, supponiamo di voler disegnare il campo

F (x, y) = (1, x + y 2 ), (x, y) ∈ [−2, 3] × [−1, 2].

La cosa importante è non disegnare troppi vettori del campo in considerazione, altrimenti il
disegno rischia di diventare illeggibile. Una griglia divisa tra le 10 e le 15 parti è solitamente
più che sufficiente.

f1=inline(’0*x+1’,’x’,’y’);
f2=inline(’x+y.^2’,’x’,’y’);
x=linspace(-2,3,11);
y=linspace(-1,2,11);
[X,Y]=meshgrid(x,y);
F1=f1(X,Y); F2=f2(X,Y);
quiver(X,Y,F1,F2)
axis image
6.1. INTEGRALI CURVILINEI 45

Il comando axis image serve solamente i numeri sulle coordinate x e y (confrontare con
il comando axis equal). Se vogliamo disegnare il grafico delle direzioni del campo F ,
possiamo modificare i comandi precedenti, semplicemente normalizzando il vettore F (x, y).
f1=F1./sqrt(F1.^2+F2.^2);
f2=F2./sqrt(F1.^2+F2.^2);
quiver(X,Y,f1,f2)
axis image
Potremmo anche disegnare il campo gradiente di una funzione assegnata; se prendiamo
ad esempio la funzione
x2
−y 2 −xy
f (x, y) = e− 2 , (x, y) ∈ [−2, 2];
[x,y]=meshgrid(-2:.2:2);
f=exp(-x.^2/2-y.^2+x.*y);
[fx,fy]=gradient(f,.2,.2);
quiver(x,y,fx,fy);

Campi nello spazio In modo analogo possiamo disegnare campi vettoriali nello spazio;
ad esempio, consideriamo il campo
F (x, y, z) = (1, x + y 2 , z), (x, y, z) ∈ [−2, 3] × [−1, 2] × [−1, 1].
u=inline(’1+0*x’,’x’,’y’,’z’);
v=inline(’x+y.^2’,’x’,’y’,’z’);
w=inline(’z’,’x’,’y’,’z’);
x=linspace(-2,3,6);
y=linspace(-1,2,6);
[X,Y]=meshgrid(x,y);
for z = -1:.4:1
Z=z+0*X;
V=v(X,Y,Z);
W=w(X,Y,Z);
quiver3(X,Y,Z,U,V,W)
hold on
end
hold off

6.1.3 Integrali curvilinei per funzioni vettoriali


Ricordiamo che data una funzione F : D ⊂ R3 → R3 e una curva r : [a, b] → D, si definisce
l’integrale curvilineo di seconda specie come:
Z Z b
F d~r := F (r(t)) · r0 (t)dt.
r a

Cosı̀ ad esempio se consideriamo la funzione F (x, y, z) = (x, z, ex+y ) e la curva


r(t) = (t cos t, t sin t, t2 ), t ∈ [0, 2π],
possiamo calcolare l’integrale curvilineo come segue;
46 CAPITOLO 6. INTEGRALI CURVILINEI E DI SUPERFICIE

u=inline(’x’,’x’,’y’,’z’);
v=inline(’z’,’x’,’y’,’z’);
w=inline(’exp(x+y)’,’x’,’y’,’z’);
n=200;
t=linspace(0,2*pi,n+1); dt=2*pi/n;
s=simpvec(n);
x=t.*cos(t); y=t.*sin(t); z=t.^2;
xdot=cos(t)-t.*sin(t);
ydot=sin(t)+t.*cos(t);
zdot=2*t;
I1=u(x,y,z).*xdot;
I2=v(x,y,z).*ydot;
I3=w(x,y,z).*zdot;
integrale=dot(s,(I1+I2+I3))*dt/3
Qui il comando simpvec è una functions che possiamo definire mediante un m–file come
segue;
function s=simpvec(n)
s=2*ones(1,n+1);
s(2:2:n)=4*ones(1,n/2);
s(1)=1; s(n+1)=1;
Può succedere che la curva su cui calcolare il nostro integrale curvilineo non sia definita
in modo parametrico ma sia semplicemente descritta da una tabella di valori. Ad sempio
potremmo avere la seguente tabella di valori;

x 0 .1 .25 .4 .54 .76 .82 .93 1


y 0 .005 .0312 .0800 .1458 .2888 .3362 .4352 .5

Se la funzione da integrare è data da F (x, y) = (x cos y, x+y), per il calcolo dell’integrale


curvilineo utilizziamo l’approssimazione che considera come curva la poligonale che conginge
i punti (Pj )j=1,...,n definiti dalla precedente tabella (quindi con n = 9):
Z n Z
X 1
F · d~r = F (rj (t)) · rj0 (t)dt
r j=1 0

con rj (t) = (1 − t)Pj + tPj+1


x=[0 .1 .25 .4 .54 .76 .82 .93 1];
y=[0 .005 .0312 .0800 .1458 .2888 .3362 .4352 .5];
u=inline(’x.*cos(y)’,’x’,’y’);
v=inline(’x+y’,’x’,’y’);
n=50;
s=simpvec(n);
dt=1/n;
lavoro=0;
for j=1:8
xx=linspace(x(j),x(j+1),n+1);
yy=linspace(y(j),y(j+1),n+1);
6.2. AREE DI SUPERFICI PARAMETRIZZATE 47

I=(x(j+1)-x(j))*u(xx,yy)+(y(j+1)-y(j))*v(xx,yy);
integrale=dot(s,I)*dt/3;
lavoro=lavoro+integrale;
end
lavoro

6.2 Aree di superfici parametrizzate


Ricordiamo che la formula per il calcolo dell’area di una superficie Σ = r(D) parametrizzata
da r : D ⊂ R2 → R3 è data dalla formula
Z
Area(Σ) = kru (u, v) × rv (u, v)kdudv;
D

nel caso di una superficie cartesiana, r(u, v) = (u, v, f (u, v)), tale formula diventa
Z p
Area(Σ) = 1 + k∇f (u, v)k2 dudv.
D

Se volessimo ad esempio calcolare l’area di un elicoide


r(u, v) = (u cos(2v), u sin(2v), v), (u, v) ∈ [0, 1] × [0, π],
l’area da calcolare diventa
Z π Z 1 p
Area(Σ) = dv 1 + 4u2 du.
0 0

Per il calcolo di tale area utilizzeremo il symbolic toolbox come segue;


[u,v]=meshgrid(0:.05:1,0:pi/20:pi);
surf(u.*cos(2*v),u.*sin(2*v),v);
du=1/50; dv=pi/50;
[u,v]=meshgrid(du/2:du:1-du/2,dv/2:dv:pi-dv/2);
Riemann=sum(sum(sqrt(1+4*u.^2)))*du*dv;
T2=[’Somma di Riemann= ’,num2str(Riemann)];
text(-.9,1,3.4,T2);
Stima=pi*quad(fcnchk(’sqrt(1+4*u)’),0,1);
T3=[’Area stimata= ’,num2str(Stima)];
text(-.9,1,3,T3);
syms u real
Area=pi*int(sqrt(1+4*u^2),u,0,1);
T1=[’Area= ’,num2str(double(Area))];
text(-.9,1,3.8,T1)
Se invece volessimo calcolare l’area della superficie cartesiana data dal grafico della
funzione
f (x, y) = x2 + y 2 , (x, y) ∈ [0, 1]2 ,
l’integrale da calcolare diventa
Z p
Area(Σ) = 1 + 4x2 + 4y 2 dxdy.
[0,1]2

Possiamo considerare i seguenti comandi;


48 CAPITOLO 6. INTEGRALI CURVILINEI E DI SUPERFICIE

[x,y]=meshgrid(0:.05:1);
surfl(x,y,x.^2+y.^2);
dx=1/50; dy=1/50;
[x,y]=meshgrid(dx/2:dx:1-dx/2);
Riemann=sum(sum(sqrt(1+4*x.^2+4*y.^2)))*dx*dy;
T1=[’Somma di Riemann= ’,num2str(Riemann)];
text(0,1,2.3,T1);
Stima=dblquad(fcnchk(’sqrt(1+4*x+4*y)’),0,1,0,1);
T2=[’Area mediante dblquad= ’,num2str(Stima)];
text(0,1,2.1,T2);

Esercizio 6.1

1. Calcolare l’area della superficie laterale del toro, ottenuto ruotando la circonferenza di
raggio 2 centrata in (3, 0). Si disegni il grafico della superficie e si riportino i seguenti
valori;

(a) l’area calcolata mediante l’integrale e il valore ottenuto calcolandola esplicitamen-


te a mano;
(b) la somma di Riemann con m = n = 50 usando il metodo del punto medio;
(c) una stima dell’area ottenuta mediante dblquad.

2. Si trovi l’area della porzione di sfera di raggio 1 con angolo ϕ ∈ [0, π/4] e si riportino
sul grafico della superficie i seguenti valori:

(a) l’area ottenuta calcolando a mano l’integrale;


(b) una stima dell’area ottenuta mediante integrazione numerica;
(c) la somma di Riemann ottenuta con n = m = 50 mediante il metodo del punto
medio.

3. Si ripeta
√ l’esercizio
√ precedente con la porzione di sfera che giace sopra il quadrato
[−1/ 2, 1/ 2]2 .

4. Si disegni il grafico della superficie definita parametricamente in coordinate sferiche


da
1
%(ϑ, ϕ) = 1 + sin(6ϑ) cos(5ϕ)
5
utilizzando i vari metodi visti sopra, in particolare dblquad e le somme di Riemann.

6.3 Integrali di superficie


Cosı̀ come per gli integrali curvilinei, anche per gli integrali di superficie si distinguono due
casi, il caso scalare e il caso vettoriale.
6.3. INTEGRALI DI SUPERFICIE 49

6.3.1 Integrali di superficie per funzioni scalari


Se Σ è una superficie regolare parametrizzata da una funzione r : D ⊂ R2 → R3 , si definisce
l’integrale di una funzione continua f : Σ → R ponendo
Z Z
f dΣ := f (r(u, v))kru (u, v) × rv (u, v)kdudv.
Σ D

Se poi la superficie è cartesiana, cioè r(u, v) = (u, v, g(u, v)), la formula precedente diventa
Z Z p
f dΣ := f (u, v, g(u, v)) 1 + k∇g(u, v)k2 dudv.
Σ D

Quindi, se ad esempio volessimo esempio calcolare l’integrale di f (x, y, z) = x + y + z sulla


superficie grafico della funzione g(x, y) = sin(x + y 2 ), (x, y) ∈ [0, 2]2 , possiamo considerare
i seguenti comandi;
f=fcnchk(’x+y+sin(+y.^2).*sqrt(1+cos(x+y.^2).^2.*(1+4*y.^2))’,’x’,’y’);
dblquad(f,0,2,0,2)
Come esercizio, seguendo l’interpretazione di f come una densità di massa, si calcoli il
baricentro della superficie appena considerata.

6.3.2 Rappresentazione di campi lungo una superficie


Tracciamo ora il grafico del campo vettoriale F (x, y, z) = (y, z, x) lungo la superficie x +
y + z = 0. Useremo un meshgrid per definire [x,y] e ricaveremo la z di conseguenza;
[x,y]=meshgrid(-2:2:2);
surfl(x,y,-x-y); hold on
[x,y]=meshgrid(-2:.5:2);
z=-x-y;
quiver3(x,y,z,y,z,x);
hold off
Potremmo anche solo disegnare il campo senza disegnare la superficie,
[x,y]=meshgrid(-2:.5:2);
z=-x-y;
quiver3(x,y,z,y,z,x);

6.3.3 Integrali di superficie per campi vettoriali: circuitazioni e


flussi
Rotore e Teorema di Stokes Una prima applicazione può essere il calcolo della circui-
tazione di un campo; come esempio considereremo il campo

F (x, y, z) = (−z, x, y)

e come curva considereremo l’intersezione del paraboloide z = x2 + y 2 e il piano z = y. Tale


curva può essere parametrizzata da
 
1 1 1 1 1
r(t) = cos t, + sin t, + sin t , t ∈ [0, 2π].
2 2 2 2 2
50 CAPITOLO 6. INTEGRALI CURVILINEI E DI SUPERFICIE

Vogliamo quindi verificare che vale la seguente identità;


I Z
F · d~r = rotF · n̂Σ dΣ,
r Σ

dove Σ è la porzione del piano z = y contenuta all’interno della curva r. Nella formula prece-
dente il versore n̂Σ deve essere preso in maniera coerente, cioè in modo tale che l’orientazione
indotta da tale campo su Σ induca la giusta orientazione sulla curva r. Avendo fissato la
parametrizzazione r, il versore n̂Σ , ortogonale al piano z = y, deve avere componento z
positiva, quindi
1
n̂Σ = √ (0, −1, 1),
2
Con i seguenti comandi, disegneremo la curva r, il piano z = y assieme al versore normale
n̂Σ (0, 1/2, 1/2) e calcoliamo l’integrale curvilineo
Z 2π    
1 1 1 1 1 1 1 1
− − sin t, cos t, + sin t · − sin t, cos t, cos t dt
0 2 2 2 2 2 2 2 2

e l’integrale di superficie
Z
1
(6.1) (1, −1, 1) · √ (0, −1, 1)dΣ
Σ 2

con Σ = {(x, y, z) ∈ R3 : z = y, x2 + y 2 ≤ y}. Con i seguenti comandi calcoliamo l’integrale


curvilineo;

syms t real
Ft=[-1/2-1/2*sin(t) 1/2*cos(t) 1/2+1/2*sin(t)];
T=[-1/2*sin(t) 1/2*cos(t) 1/2*cos(t)];
fz_int=dot(Ft,T);
I=double(int(fz_int,0,2*pi))

Si scrivano come esercizio i comandi che servono a calcolare l’integrale di superficie (6.1).

Divergenza e flussi Chiudiamo questo capitolo con il calcolo di un flusso di un campo


vettoriale. Consideriamo quindi il campo
p
F (x, y, z) = (y, x, z x2 + y 2 )

e come superficie Σ consideriamo il bordo del cilindro

E = {(x, y, z) ∈ R3 : x2 − 2x + y 2 ≤ 0, 0 ≤ z ≤ 1}.

Calcoleremo tale flusso in due modi differenti, verificando quindi la validità della formula di
Gauss–Green Z Z
divF (x, y, z)dxdydz = F · n̂Σ dΣ,
E Σ

con n̂Σ normale uscente dal cilindro. Se vogliamo calcolare l’integrale della divergenza,
abbiamo che p
divF (x, y, z) = x2 + y 2 ,
6.3. INTEGRALI DI SUPERFICIE 51

mentre il dominio di integrazione in coordinate cilindriche

x = 1 + % cos ϑ, y = % sin ϑ, z=t

con % ∈ [0, 1], ϑ ∈ [0, 2π) e t ∈ [0, 1]. Si tratta quindi di calcolare il seguente integrale;
Z Z p Z 2π Z 1 p
(6.2) divF (x, y, z)dxdydz = x2 + y 2 dxdydz = dϑ % 1 + %2 + 2% cos ϑdϑ,
E E 0 0

che cacleremo utilizzando Matlab tramite i seguenti comandi.


f=fcnchk(’sqrt(1+rho.^2+2*rho.*cos(theta)).*rho’,’rho’,’theta’);
dblquad(f,0,1,0,2*pi)

L’integrale di superficie va invece diviso in tre parti, tenendo conto la decomposizione

Σ = Σ1 ∪ Σ2 ∪ Σ3

dove
Σ1 = {x2 − 2x + y 2 = 0, 0 ≤ z ≤ 1}, Σ2 = {z = 0, x2 − 2x + y 2 < 0},
Σ3 = {z = 1, x2 − 2x + y 2 < 0}.
La prima superficie la parametrizziamo in coordinate cilindriche r : [0, 2π) × [0, 1],

r(ϑ, t) = (1 + cos ϑ, sen ϑ, t),

da cui si ricava che


n̂Σ1 (ϑ, t) = (cos ϑ, sen ϑ, 0).
Otteniamo quindi che
2π 1 √
Z Z Z
F · n̂Σ1 dΣ = dϑ ( sen ϑ, 1 + cos ϑ, 1 + 2 cos ϑ) · (cos ϑ, sen ϑ, 0)dt
Σ1 0 0
Z 2π
= (2 sen ϑ cos ϑ + sen ϑ)dϑ = 0.
0

La superficie Σ2 è il grafico z = 0 con normale n̂Σ2 (x, y, 0) = (0, 0, −1); dato che F (x, y, 0) =
(y, x, 0), si vede subito che Z
f · n̂Σ2 dΣ = 0.
Σ2

Per l’ultimo integrale, vista Σ3 come grafico z = 1 con normale n̂Σ3 (x, y, 1) = (0, 0, 1),
troviamo l’integrale
Z Z Z p
F · n̂Σ3 dΣ = F (x, y, 1) · (0, 0, 1)dxdy = x2 + y 2 dxdy,
Σ3 {x2 −2x+y 2 ≤0} {x2 −2x+y 2 ≤0}

che è lo stesso integrale in (6.2).


52 CAPITOLO 6. INTEGRALI CURVILINEI E DI SUPERFICIE
Capitolo 7

Successioni e serie di funzioni

In questo capitolo considereremo le successioni e le serie di funzioni, tra cui principalmente


tratteremo le serie di potenze, le serie di Taylor e le serie di Fourier.

7.1 Successioni di funzioni


Cominciamo con una successione di funzione data da
nx
fn (x) = 2 2 ,
n x +1
definite su tutto R. Possiamo considerare i seguenti comandi, che servono per disegnare i
grafici delle prime dieci funzioni della successione;
x=linspace(-.5,.5,100);
[X,N]=meshgrid(x,n);
fn=(N.*X)./(N.^2.*X.^2);
plot(x,fn)
h=legend(’n=0’,’n=1’,’n=2’,’n=3’,’n=4’,’n=5’,’n=6’,...
’n=7’,’n=8’,’n=9’,’n=10’);
Possiamo anche inserire un ciclo for per vedere l’evoluzione dei grafici della successione
data;
for cnt=1:length(n)
plot(x,fn(cnt,:))
hold on
pause(.5)
end
hold off
Possiamo ripetere le operazioni precedenti nel caso delle due funzioni
r
sin(nt) 1
fn (x) = , gn (x) = x2 + .
n n
Prendiamo in considerazione la seconda funzione, lasciando come esercizio il caso della
prima.

53
54 CAPITOLO 7. SUCCESSIONI E SERIE DI FUNZIONI

x=linspace(-1,1,100);
n=[0:20];
[X,N]=meshgrid(x,n);
gn=sqrt(X.^2+1./N);
plot(x,abs(x),’r’);
legend(’|x|’)
hold on
for cnt=1:length(n)
plot(x,gn(cnt,:))
pause(.5)
end
hold off

7.2 Serie di funzioni


Consideriamo qui l’esempio della serie di funzioni associata alla successione di funzioni
1
un (x) = ;
1 + x2n
le funzioni date sono pari, quindi considereremo solo il caso x ≥ 0. Possiamo considerare i
seguenti comandi;
x=linspace(0,4,100);
n=[0:5];
[X,N]=meshgrid(x,n);
un=1./(1+x.^(X*N));
serie=cumsum(un);
subplot(2,1,1);
plot(x,un,’LineWidth’,2);
set(gca,’FontSize’,14);
xlabel(’Asse x’,’FontSize’,14);
ylabel(’Asse y’,’FontSize’,14);
h=legend(’n=0’,’n=1’,’n=2’,’n=3’,’n=4’,’n=5’)
grid on
subplot(2,1,2)
plot(X,serie,’LineWidth’,2)
set(gca,’FontSize’,14)
xlabel(’Asse x’,’FontSize’,14);
ylabel(’Asse y’,’FontSize’,14);
h=legend(’n=0’,’n=1’,’n=2’,’n=3’,’n=4’,’n=5’)
Esercizio 7.1
1. Si ripeta l’esercizio con la serie associata alla successione
un (x) = nx xn .

2. Si consideri la serie associata alla successione


xn
un (x) = ,
(1 + x2 )n
7.3. SERIE DI POTENZE 55

discutendone, riportandola ad una serie geometrica, la convergenza.

7.3 Serie di potenze


Formalmente una serie di potenze è un polinomio di grado eventualmente infinito e viceversa,
i polinomi sono serie di potenze in cui i coefficienti sono definitivamente nulli. Vediamo come
trattare il caso della serie di potenze

X xn
;
n=0
n!
per ogni k ∈ N, la somma parziale di grado k di tale serie, data da
k
X xn
sk (x) = ;
n=0
n!

è un polinomio di grado k. Cosı̀ ad esempio se k = 3 otteniamo

x2 x3
s3 (x) = 1 + x + + .
2 6
In Matlab, il modo di determinare un polinomio è assegnare i coefficienti del polinomio, con
la convenzione che il vettore dei coefficienti rappresenta le potenze di x in ordine decrescente
di grado. Ad esempio, il polinomio s3 (x) è determinato dal vettore [1/6 1/2 1 1]. Con
i seguenti comandi determiniamo il polinomio s10 (x) e ne disegna il grafico sull’intervallo
[−2, 3].
n=[1 1:10];
a=1./cumprod(n); % coefficienti dei primi 11 termini della serie
b=a(length(a):-1:1); % b e’ il vettore a letto da destra a sinistra
% e rappresenta il polinomio somma parziale
% di grado 10 della serie
x=linspace(-2,3);
plot(x,polyval(b,x))
Il comando polyval(b,x) serve in Matlab per costruire il polinomio, nella variabile x che
ha il vettore b come coefficienti. Si provi come esercizio a sovrapporre al grafico precedente
il grafico, tracciato in rosso, della funzione ex ; si modifichi anche l’intervallo [−2, 3] con altri
intervalli.

Serie con solo termini dispari. Come ulteriore esempio possiamo considerare la serie
di potenze

X (−1)n x2n+1
;
n=0
(2n + 1)!

determineremo il polinomio di grado 101 ne tracceremo il grafico sull’intervallo [0, 7]. La


somma parziale di grado 101 si ottiene considerando la somma parziale con n = 50. Si
presenta qualche difficoltà; la prima consiste nel fatto che il fattoriale (2n + 1)! non è
semplicemente cumprod(2*n+1), in quanto questo prodotto mancherebbe i termini pari, che
vanno quindi aggiunti (inoltre tale vettore va modificato in modo che i primi due termini
56 CAPITOLO 7. SUCCESSIONI E SERIE DI FUNZIONI

rappresentino 0! = 1 e 1! = 1). La seconda difficoltà consiste nel fatto che nelle somme
parziali relative alla serie data, le potenze pari sono tutte nulle e tali zeri vanno inseriti nel
vettore dei coefficienti. Possiamo procedere come segue, semplicemente costruendo il vettore
b che sia lungo il doppio del vettore a e che inizialmente contenga tutti 0, e i coeffcienti di
a vengono inseriti nelle posizioni pari di b,
n=[0:50];
a=(-1).^n./(cumprod(2*n+1).*cumprod([1 2*n(2:51)]));
b=zeros(1,2*length(a));
b(2:2:length(b))=a;
c=b(length(b):-1:1); % c e’ il vettore che definisce il polinomio
% somma parziale di grado 101
x=0:.01:7;
plot(x,polyval(c,x))

Esercizio 7.2
1. Tracciare il grafico della somma parziale di grado 10 della serie di potenze

X
xn
n=0

1
sull’intervallo [−.9, .9]. Tracciare nella stessa figura il grafico della funzione y = 1−x ,
inserendo anche una legenda.
2. Disegnare la somma parziale di grado 50 della serie di potenze

X (−1)n x2n+1
n=0
2n + 1

sull’intervallo [−.5, 1].


3. Disegnare la somma parziale di grado 6 della serie di potenze

X (−1)n x2n
;
n=0
(2n)!

si ripeta quanto fatto per la somma parziale di grado 100, tracciando anche il grafico
della funzione cos x, considerando vari intervalli di definizione.

7.4 Serie di Taylor


Disegnamo ora nella figura il grafico di sin x e i suoi polinomi di Taylor di grado 1, 3, 11 e
51 nell’intervallo [−2π, 2π]; possiamo considerare i seguenti comandi;
n=[0:25]; % length(n)=26
a=(-1).^n./(cumprod(2*n+1).*cumprod([1 2*n(2:length(n))])); %length(a)=26
b=zeros(1,2*length(a)); % length(b)=52
b(2:2:length(b))=a;
c51=b(length(b):-1:1); % length(c51)=52
7.4. SERIE DI TAYLOR 57

c11=c51(41:52); % length(c11)=12
c3=c11(9:12); % length(c3)=4
c1=c3(3:4); % length(c1)=2
x=-2*pi:.01:2*pi;
y51=polyval(c51,x);
y11=polyval(c11,x);
y3=polyval(c3,x);
y1=polyval(c1,x);
plot(x,sin(x),x,y1,x,y3,x,y11,x,y51);
legend(’sin x’,’Grado 1’,’Grado 3’,’Grado 11’,’Grado 51’);
axis([-2*pi 2*pi -1.5 1.5])
Si noti che il grafico di sin x, che dovrebbe comparire in blu nel grafico, in realtà è coper-
to completamente dal grafico della funzione y51, mostrando che il polinomio di grado 51
rappresenta quasi completamente la funzione sin x nell’intervallo [−2π, 2π].

7.4.1 Polinomi di Taylor simbolici


Possiamo anche utilizzare il symbolic toolbox per trovare l’espansione di Taylor di una data
funzione attorno ad un arbitrario punto x0 . A tal proposito è comodo il comando Matlab
taylor; possiamo cosı̀ trovare il polinomio di Taylor di grado 8 di sin x attorno a x0 = 0 e
quello di grado 10 attorno a x0 = π/4;
syms x
T7=taylor(sin(x),8)
T10=taylor(sin(x),pi/4,10)
Possiamo utilizzare il comando sym2poly per convertire una espressione simbolica di un
polinomio nel vettore dei suoi coefficienti;
t7=sym2poly(T7)
t10=sym2poly(T10)
e viceversa possiamo anche utilizzare il comando poly2sym per il viceversa.

7.4.2 Moltiplicazione di serie e serie di Taylor di prodotti di fun-


zione
Se abbiamo due serie di potenze

X ∞
X
f (x) = an xn , g(x) = bn x n ,
n=0 n=0

possiamo considerare il loro prodotto h(x) = f (x)g(x) che è ancora una serie di potenze

X X
h(x) = cn xn , cn = h = 0n ah bn−h .
n=0

Questo prodotto, che è il caso discreto della convoluzione tra due funzioni, viene implemen-
tato in Matlab dal comando conv;
58 CAPITOLO 7. SUCCESSIONI E SERIE DI FUNZIONI

f=[1 6 1];
g=[2 -3 5];
h=conv(f,g)

Questo esempio ha come risultato i coefficienti della seguente espressione:

h(x) = f (x)g(x) = (x2 + 6x + 1)(2x2 − 3x + 5) = 2x4 + 9x3 − 11x2 + 27x + 5.

Possiamo applicare quanto appena detto per il calcolo della serie di Taylor per una
funzione prodotto; ad esempio, possiamo considerare la funzione

h(x) = (x2 − 2x + 1) sin x

e ne calcoliamo il polinomio di Taylor attorno ad x0 = 0 di grado 51, tracciando i grafici in


[−2, 2].

n=[0:25];
a=(-1).^n./(cumprod(2*n+1).*cumprod([1 2*n(2:26)]));
b=zeros(1,2*length(a));
b(2:2:length(b))=a;
c51=b(length(b):-1:1); % Polinomio di Taylor di sin(x)
p=[1 -2 1]; % il polinomio x^2-2x+1
c=conv(p,c51); % il polinomio del prodotto, pero’ troppo lungo
q=c(length(c)-51:length(c)); % fino al grado 51
plot(-2:.01:2,polyval(q,-2:.01:2))

Si provi infine il comando taylortool che racchiude in una interfaccia grafica quanto
appena visto.

Esercizio 7.3

1. Nella stessa figura, tracciare il grafico di ex e i suoi polinomi di Taylor di grado 1, 3,


8 e 12 attorno ad x0 = 0 nell’intervallo [−2, 2] (si metta una legenda, si riscalino gli
assi se necessario).

2. Nella stessa figura, si tracci il grafico di cos x e i suoi polinomi di Taylor centrati in
x0 = 0 di grado 2, 6, 12 e 50 nell’intervallo [−2π, 2π] (si metta una legenda, si riscalino
gli assi se necessario, si inserisca una griglia).

3. Nella stessa figura, si tracci il grafico di log(x) e i suoi polinomi di Taylor centrati in
x0 = 2 di grado 1, 3, 10 e 20 nell’intervallo [.1, 4] (si metta una legenda, si riscalino
gli assi se necessario).

4. Utilizzare il symbolic toolbox per determinare il polinomio di grado 9 attorno a x0 = 0


della funzione arctan x; si utilizzi il comando sym2poly per convertire quanto trovato
nella rappresentazione vettoriale del polinomio. Tracciare infine nella stessa figura il
grafico di arctan x e del polinomio trovato nell’intervallo [−1.3, 1.3].

5. Trovare il polinomio di grado 15 attorno a x0 = 0 di (x2 − 1) sin x cos x e si tracci il


grafico di quanto ottenuto nell’intervallo [−2, 2].
7.5. SERIE DI FOURIER 59

7.5 Serie di Fourier


Ricordiamo che data una funzione f : [0, T ] → R (estesa poi T –periodica a tutto R, possiamo
costruire la serie di Fourier associata definendo i coefficienti
2 T
Z
ak = f (x) cos(kωx)dx, k ≥ 0,
T 0
Z T
2
bk = f (x) sin(kωx)dx, k ≥ 1,
T 0

con ω = T frequenza o pulsazione della funzione. La serie sarà data da

a0 X
Sf (x) = + (ak cos(kωx) + bk sin(kωx)) .
2
k=1

Come esercizio, calcoliamo il polinomio di Fourier di grado 7 associato alla funzione

f (x) = xχ[0,π) (x) + x2 χ[−π,0) (x),

definita in [−π, π) e prolungata 2π–periodica. Possiamo ad esempio considerare i seguenti


comandi;
x=linspace(-pi,pi,100);
fx=x.^2.*(x<0)+x.*(x>=0);
k=[1:7];
[X,K]=meshgrid(x,k);
[FX,K]=meshgrid(fx,k);
a0=1/pi*trapz(x,fx);
ak=FX.*cos(K.*X);
ak=trapz(x,ak’);
ak=ak./pi;
bk=FX.*sin(K.*X);
bk=trapz(x,bk’);
bk=bk./pi;
[FX,AK]=meshgrid(fx,ak);
[FX,BK]=meshgrid(fx,bk);
SF=a0/2*ones(size(x));
SF(2:(length(k)+1),:)=AK.*cos(K.*X)+BK.*sin(K.*X);
SF=sum(SF);
subplot(2,1,1)
p=plot(x,fx,’b’,x,SF,’r’,...
x-2*pi,fx,’b’,x-2*pi,SF,’r’,...
x+2*pi,fx,’b’,x+2*pi,SF,’r’);
set(p,’LineWidth’,2);
grid on;
set(gca,’FontSize’,14)
title(’f(x) e Serie di Fourier’,’FontSize’,14);
xlabel(’Asse x’,’FontSize’,14)
ylabel(’Asse y’,’FontSize’,14)
60 CAPITOLO 7. SUCCESSIONI E SERIE DI FUNZIONI

legend(’f(x)’,’SF’)
subplot(2,1,2)
bar([ak;bk]’)
grid on
set(gca,’FontSize’,14)
title(’Piano delle frequenze’,’FontSize’,14)
xlabel(’k’,’FontSize’,14)
ylabel(’ak,bk’,’FontSize’,14);
legend(’ak’,’bk’)
Può essere utile creare un function m–file, che chiameremo CoeffFourier, per il calcolo
dei coefficienti di Fourier di una data funzione.
function [a0,ak,bk]=CoeffFourier(x,fx)
%
global T omega k
%
%
[X,K] = meshgrid(x,k);
[FX,K] = meshgrid(fx,k);
%
a0 = 2/T * trapz(x,fx);
%
ak = FX .* cos(omega*X.*K);
ak = trapz(x,ak’);
ak = 2/T * ak;
%
bk = FX .* sin(omega * X.*K);
bk = trapz(x,bk’);
bk = 2/T * bk;

Si noti la definizione delle variabili globali global k T omega, che quindi dovranno essere
definite prima di richiamare la funzione CoeffsFourier.

Esercizio 7.4
1. Modificare i comandi precedenti per comprendere, nel grafico delle frequenze, anche il
termine a0 /2; considerare anche la variante in cui si riportano nel piano delle frequenze
i valori di |ak | e |bk |.
2. Ripetere quanto fatto per la funzione f : (−π, π] → R, f (x) = x

7.5.1 Fenomeno di Gibbs


Il fenomeno di Gibbs é quel fenomeno che si verifica in prossimitá delle discontinuitá di una
funzione; quello che si nota, anche visivamente osservandone i grafici, é che in prossimitá di
un salto della funzione (in prossimitá di una discontinuitá), si nota che la serie di Fourier
produce un errore che si sposta sempre piú vicino al punto di discontinuitá, ma che in
intensitá non diminuisce se si aumenta il grado di approssimazione. Tale errore resta sempre
pari ad un decimo il salto della funzione. Verifichiamo questo fenomeno con un esempio.
7.5. SERIE DI FOURIER 61

Consideriamo la funzione f : [−π, π] → R definita da

f (x) = χ[−π/2,π/2] (x)

ed introduciamo l’errore relativo



n
1 a0 X
En (x) = f (x) − − (ak cos kx + bk sin kx) .

|f (x)| 2
k=1

x=linspace(-pi,pi,100);
fx=1.*(x>=-pi/2 & x<=pi/2);
k=[1:30];
[X,K]=meshgrid(x,k);
[FX,K]=meshgrid(fx,k);
a0=1/pi*trapz(x,fx);
ak=FX.*cos(K.*X);
ak=trapz(x,ak’);
ak=ak./pi;
bk=FX.*sin(K.*X);
bk=trapz(x,bk’);
bk=bk./pi;
[FX,AK]=meshgrid(fx,ak);
[FX,BK]=meshgrid(fx,bk);
SF=a0/2*ones(size(x));
SF(2:(length(k)+1),:)=AK.*cos(K.*X)+BK.*sin(K.*X);
SF=sum(SF);
En=abs((SF-fx))./abs(fx);
subplot(2,1,1);
p=plot(x,fx,’b’,x,SF,’r’,...
x-2*pi,fx,’b’,x-2*pi,SF,’r’,...
x+2*pi,fx,’b’,x+2*pi,SF,’r’);
set(p,’LineWidth’,2);
grid on;
set(gca,’FontSize’,14)
title(’f(x) e Serie di Fourier’,’FontSize’,14);
xlabel(’Asse x’,’FontSize’,14)
ylabel(’Asse y’,’FontSize’,14)
legend(’f(x)’,’SF’)
axis([0,1.6,.5,1.2]) % ci concentriamo sul salto
subplot(2,1,2);
plot(x,En,’g’,’Linewidth’,2)
axis([0,1.6,0,.1])
grid on
set(gca,’FontSize’,14)
title(’Errore relativo’,’FontSize’,14)
xlabel(’Asse x’,’FontSize’,14)
ylabel(’Asse y’,’FontSize’,14)
62 CAPITOLO 7. SUCCESSIONI E SERIE DI FUNZIONI
Capitolo 8

Equazioni differenziali

In questo capitolo considereremo alcune equazioni differenziali ordinare e vedremo alcuni


metodi per lo studio delle soluzioni, anche in casi in cui il calcolo esplicito della soluzione
non si puó fare.

8.1 Linee di flusso


Possiamo utilizzare il comando quiver per disegnare le linee di flusso di una equazione
differenziale. L’idea sostanziale risiede nella considerazione che cercare una funzione u :
I → R soluzione dell’equazione
u0 (t) = f (t, u(t))
equivale a carcare una funzione per la quale nel punto (t, u(t)) la direzione tangente al
grafico sia determinata da f , cioé nel punto (t, u(t)) sia assengata la direzione tangente
(1, u0 (t)) = (1, f (t, u(t))).
Possiamo ad esempio considerare l’equazione

u0 (t) = cos(2t + u(t))

con t ∈ [−5, 5] e u ∈ [.5, 4.5];

[t,u]=meshgrid(-5:.5:5,.5:.5:4.5);
dt=ones(size(t));
du=cos(2*t+u);
quiver(t,u,dt,du);
title(’u’’=cos(2t+u)’);

Per migliorare la resa grafica di quanto ottenuto ad esempio riducendo della metá la lun-
ghezza dei vettori ottenuti, considerando ad esempio il comando

quiver(t,u,dt,du,.5);

Possiamo anche considerare il Problema di Cauchy associato all’equazione differenziale data;


 0
u (t) = cos(2t + u(t))
u(t0 ) = u0

63
64 CAPITOLO 8. EQUAZIONI DIFFERENZIALI

Un comando Matlab utile in questi casi è il comando streamline, che possiamo utilizzare
come segue. Supponiamo di partire all’istante t0 = −2 e di cercare le quattro soluzioni
associate ai valori iniziali 1, 2, 3, 4; possiamo quindi aggiungere ai comandi precedenti quanto
segue;
hold on
u0=[1,2,3,4];
t0=-2*ones(size(u0));
S=streamline(t,u,dt,du,t0,u0);
set(S,’Color’,’r’)
Le linee in rosso saranno quindi i grafici delle soluzioni dei Problemi di Cauchy associati.

Esercizio 8.1
1. Utilizzare il comando quiver per tracciare le linee di flusso del campo

u0 = 2t2 − u3 ;

si utilizza la finestra [−1, 1]2 con incrementi .2 in ogni direzione.


2. Utlizzare il comando
tt quiver per tracciare le linee di flusso di

u0 = sin(t + u)

su di un rettangolo contenente l’origine (si facciano varie prove con differenti valori
per le dimensioni della finestra e degli incrementi).

8.2 Il metodo numerico ode45


In Matlab esistono vari pacchetti per risolvere le equazioni differenziali, tra questi segna-
liamo qui il pacchetto ode45. Come esempio consideriamo il Problema di Cauchy
 0
y (t) = t+2 cos t
y 2 (t)
y(0) = 2
q
la cui soluzione analitica è data da u(t) = 3 32 t2 + 6t + 8. Per la soluzione numerica, che
sarà una soluzione approssimata, possiamo procedere come segue;
[t,u]=ode45(fcnchk(’(t+2*cos(t))./u.^2’),[0 5],2);
U=(3*t.^2/2+6*sin(t)+8).^(1/3);
plot(t,u,’b’,t,U,’r’)
[u(length(t)),U(length(t))]
I precedenti comandi danno le soluzioni numerica ed analitica in [0, 5] e ne disegna il grafico;
i due grafici sono sovrapposti, mostrando quanto la soluzione numerica sia accurata. L’ul-
timo comando confronta infatti le due soluzioni in t = 5. Nell’eventualità che la soluzione
numerica non sia cosı̀ accurata, si può anche modificare la griglia di calcolo, che nei coman-
di precedenti viene scelta di default dal comando ode45; possiamo ad esempio sostituire la
prima riga di comando con la seguente;
8.3. INTEGRAZIONE SIMBOLICA DI EQUAZIONI DIFFERENZIALI 65

[t,u]=ode45(fcnchk(’(t+2*cos(t))./u.^2’),[0:.2:5],2);

Nel comando ode45 non è necessario utilizzare tt fcnchk, ma possiamo anche utilizzare un
function m–file, con la sintassi

[t,u]=ode45(’f’,[a b],u0);

dove la funzione f viene definita in un m–file che avrà la forma

function uprimo=f(x,y)
uprimo=(t+2*cos(t))./u.^2;

8.3 Integrazione simbolica di equazioni differenziali


In Matlab esiste anche il symbolic toolbox dsolve per trovare la soluzione generale di una
equazione differenziale, che viene utilizzato con la seguente sintassi

syms t y
g=dsolve(’Dy=f(t,y)’,’t’)

per l’integrale generale, mentre useremo la sintassi

syms t y
g=dsolve(’Dy=f(t,y),y(a)=b’,’t’)

per la soluzione del Problema di Cauchy.


Ad esempio, se vogliamo risolvere l’equazione y 0 = t2 + y, possiamo considerare;

syms t y
g=dsolve(’Dy=t^2+y’,’t’)

Il risultato sarà una funzione con un parametro C2; se vogliamo determinare la soluzione in
un dato punto, ad esempio t = 0, possiamo considerare il comando

a=subs(g,0)

da cui si può capire il valore della costante C2 per cui si ha che la soluzioni soddisfi una
cerca condizione iniziale per t = 0.
Se invece vogliamo considerare direttamente un Problema di Cauchy, ad esempio

u0 = u − t

u(−1.5) = −1

possiamo considerare i seguenti comandi;

syms t y
g=dsolve(’Dy=y-t,y(-1.5)=-1’,’t’)
ezplot(g,[-2 2])
66 CAPITOLO 8. EQUAZIONI DIFFERENZIALI

8.4 Sistemi di equazioni differenziali


Si possono anche considerare sistemi di equazioni differenziali, come ad esempio
 0
x (t) = 2x(t) − 3y(t), x(0) = 1
y 0 (t) = 2x(t) + y(t), y(0) = −1;

utilizzeremo ode45 per determinare una soluzione approssimata per t ∈ [0, 1]. L’equazione
è un’equazione del prim’ordine u0 = F (t, u), con u vettore di componenti (x, y) ed F (t, u) =
(2u1 − 3u2 , 2u1 + u2 ); quindi la procedura non sarà molto differente da quella vista per le
equazioni del prim’ordine. Iniziamo col creare un m–file
function xprimo=F(t,x)
xprimo=[2*x(1)-3*x(2);2*x(1)+x(2)];
e poi richiamare tale m–file coi seguenti comandi;
t0=0; t1=1;
[t,x]=ode45(’F’,[t0 t1], [1,-1]);
figure(1); clf;
plot(x(:,1),x(:,2));
n=length(t);
T=[’(’,num2str(x(n,1)),’, ’,num2str(x(n,2)),’)’];
text(x(n,1),x(n,2),T);
figure(2); clf;
plot(t,x(:,1),t,x(:,2));
legend(’x(t)’,’y(t)’);

8.5 Equazioni di ordine superiore


Possiamo utilizzare quanto visto per i sistemi per risolvere equazioni di ordine superiore al
primo; ad esempio, supponiamo di voler risolvere l’equazione

x00 (t) + 6x(t)x0 (t) − x2 (t) = sin(x(t)), x(0) = 1, x0 (0) = 2

con t ∈ [0, 5]. Possiamo quindi introdurre la variabile y(t) = x0 (t) ed ottenere quindi il
sistema  0
x (t) = y(t), x(0) = 1
y 0 (t) = −6x(t)y(t) + x2 (t) + sin(x(t)), y(0) = 2.
Definiamo quindi l’m–file
function xprimo=higher(t,x)
xprimo=[x(2); -6*x(1).*x(2)+sin(x(1))];
e quindi costruiamo la soluzione;
[t,x]=ode45(’higher’,[0 5], [1 2]);
plot(t,x(:,1),t,x(:,2));
legend(’x(t)’,’y(t)’)

Esercizio 8.2
8.6. SOLUZIONI DEFINITE IMPLICITAMENTE 67

1. Si determini la soluzione dell’equazione differenziale;


ty(t) + 2t
y 0 (t) =
t2 + 1
e tra queste si trovi quella che soddisfa y(1) = 2. Utilizzare ode45 per trovare la
soluzione approssimata con t ∈ [1, 6], disegnando in blu la soluzione esatta ed in
rosso quella approssimata (si usi anche il comando text per dare i valori esatti ed
approssimati della soluzione in t = 6).
2. Si utilizzi ode45 per determinare la soluzione del problema

y[(t) = t − y(t) + 1, y(0) = 3

con t ∈ [0, 3]. Si disegni la soluzione, indicando il valore della soluzione per t = 3.
3. Si utilizzi ode45 per trovare una soluzione approssimata del sistema
 0
x (t) = 3x(t) + 4y(t), x(0) = 1
y 0 (t) = 3x(t) + 2y(t), y(0) = 2

con t ∈ [0, 1]. Disegnare nello stesso grafico le soluzioni x = x(t) e y = y(t), ed in un
secondo grafico la curva y = x.
4. Si consideri l’equazione differenziale del secondo ordine

x00 (t) + tx0 (t) + t2 x(t) = 0;

utilizzare ode45 per trovare la soluzione in t ∈ [0, 3] con i seguenti dati iniziali,
specificando per la variabile indipendente i seguenti valori t=[0:.01:3];
a) x(0) = 1, x0 (0) = 0 e si chiami tale soluzione f ;
b) x(0) = 0, x0 (0) = 1 e si chiami tale soluzione g;
c) x(0) = 2, x0 (0) = −3 e si chiami tale soluzione h.
Si noti che, dalla teoria delle equazioni differenziali lineari (a coefficienti non necessa-
riamente costanti), la soluzione generica del problema è data da una combinazione di
f e g; verificare che effettivamente la soluzione h è data da h = 2f − 3g, dove 2 = h(0)
e −3 = h0 (0). Si disegni quindi il grafico di 2f − 3g e di h nella stessa figura.

8.6 Soluzioni definite implicitamente


Può succedere a volte che la soluzione di un’equazione differenziale la si trova ma non definita
in modo esplicito, ma implicitamente nella forma

F (t, y(t)) = c,

per una qualche funzione F e c ∈ R. In tal caso può essere utile utilizzare il comando
contour per lo studio di tali soluzioni.
Supponiamo ad esempio di voler risolvere l’equazione

0 t t2 + 1
y (t) = ;
y(t)ey(t)
68 CAPITOLO 8. EQUAZIONI DIFFERENZIALI

la soluzione di tale equazione si trova in modo diretto (l’equazione è a variabili separabili)


ed è determinata da
3
(t2 + 1) 2
(8.1) (y(t) − 1)ey(t) − = c,
3
con c che dipende dalle condizioni iniziali. Disegneremo nel quadrato [−3, 3]2 le curve che
sono i grafici di tale equazione con c che assume i valori da −4 a 2 saltando di 1/2;
[t,y]=meshgrid(-3:.1:3);
z=(y-1).*exp(y)-1/3.*(t.^2+1).^(3/2);
c=[-4:.5:2]; % i livelli
contour(t,y,z,c)
Possiamo aggiungere anche le etichette al grafico precedente, sostituendo l’ultima riga con
[C,h]=contour(t,y,z,c);
clabel(C,h);
Se abbiamo un Problema di Cauchy, cioè se imponiamo una condizione iniziale y(t0 ) = y0 ,
allora il livello c sarà univocamente determinato; ad esempio, se nell’esempio precedente
9 1/10
imponiamo y(0) = 1/10, allora da (8.1) ricaviamo che c = − 10 e − 13 ;
[t,y]=meshgrid(-3:.1:3);
z=(y-1).*exp(y)-1/3.*(t.^2+1).^(3/2);
c=-.9*exp(.1)-1/3;
contour(t,y,z,[c c]);
Si noti che vengono disegnate due curve; si provi a capire come mai e soprattutto, quale
delle due curve è quella che definisce il grafico della funzione.

Esercizio 8.3 Trovare la soluzione generale dell’equazione


t2 + 1
t2 y 0 (t) =
3y 2 (t) + 1
ed utilizzare il comando contour per tracciare il grafico di dieci curve che definiscono le
soluzioni; in un altra figura, si tracci il grafico della curva che definisce la soluzione del
problema y(1) = 2.

8.7 Vibrazioni meccaniche


In questa sezione considereremo il problema delle vibrazioni meccaniche; con questo intendia-
mo il problema della determinazione e dello studio delle soluzioni dell’equazione differenziale
del secondo ordine a coefficienti costanti

(8.2) y 00 (t) + 2δy 0 (t) + ω02 y(t) = B cos(ωt),

dove δ ∈ R rappresenta un fattore di smorzamento, ω0 la frequenza propria del sistema, ω


e B rispettivamente la frequenza e l’intensità del termine forzante. Nel caso B = 0 si parla
di vibrazioni libere, mentre per B 6= 0 si parla di vibrazioni forzate; il caso δ = 0 siamo nel
caso di vibrazioni non smorzate, con δ 6= 0 di vibrazioni smorzate. Tratteremo prima il caso
di vibrazioni non smorzate, quindi il caso delle vibrazioni smorzate.
8.7. VIBRAZIONI MECCANICHE 69

8.7.1 Vibrazioni non smorzate


Vibrazioni libere Possiamo considerare ad esempio il problema di Cauchy associato a
(8.2) con B = 0 e dati iniziali y(0) = y 0 (0) = 1, la cui soluzione è data da

y(t) = cos(ω0 t) − sin(ω0 t);

per disegnare il grafico della soluzione possiamo considerare i seguenti comandi:

t=linspace(0,40,100);
y0=1;
v0=1;
omega0=1;
A=sqrt(y0^2+v0^2/omega0^2);
c=y0/A;
s=-v0/(A*omega0);
yt=A*(c*cos(omega0*t)-s*sin(omega0*t));
plot(t,yt)
grid on

Vibrazione forzata; caso ω 6= ω0 e battimenti Come variazione del problema prece-


dente consideriamo il caso in (8.2) con B = 1 e ω = 0; i dati iniziali che consideriamo sono
sempre y(0) = y 0 (0) = 1, e quindi la soluzione sarà data, se ω0 = 1, da

y(t) = 1 + sin(t).

Tracciamo il grafico di tale soluzione nel caso di ω0 = 1;

t=linspace(0,40,100);
y0=1;
v0=1;
omega0=1;
B=1;
A=sqrt((y0-B/omega0^2)^2+v0^2/omega0^2);
c=(y0-B/omega0^2)/A;
s=-v0/(A*omega0);
yt=A*(c*cos(omega0*t)-s*sin(omega0*t))+B/omega0^2;
ht=B*ones(length(t));
plot(t,yt,t,ht,’r’);
grid on

Qui si è disegnato in rosso il grafico del termine forzante, mentre in blu si ha la soluzione; si
nota quindi semplicemente un’oscillazione libera, traslata di uno rispetto alla posizione di
equilibrio. √
Possiamo modificare il precedente caso considerando ω = 1/ 2; in tal caso la soluzione
sarà data da  
t
y(t) = 2 cos √ − cos t + sin t;
2
siamo in presenza del fenomeno noto come battimenti, e possiamo visualizzare tale fenomeno
considerando i seguenti comandi;
70 CAPITOLO 8. EQUAZIONI DIFFERENZIALI

t=linspace(0,200,1000);
y0=1;
v0=1;
omega0=1;
B=1;
A=sqrt((y0-(B/omega0)^2)^2+(v0^2/omega0)^2);
c=(y0-(B/omega0)^2)/A;
s=-v0/(A*omega0);
omega=1/sqrt(2);
yt=A*(c*cos(omega0*t)-s*sin(omega0*t))+B*cos(omega*t)/(omega0^2-omega^2);
ht=B*cos(omega*t);
plot(t,yt,t,ht,’r’);
grid on

Ancora, in rosso abbiamo disegnato il grafico del termine forzante, mentre in blu abbiamo il
grafico della soluzione; si nota quindi nei battimenti un’oscillazione con ampiezza variabile
me in qualche modo con ampiezza periodica. Si provi come esercizio a considerare differenti
valori di ω 6= ω0 , considerando in particolare valori di ω sempre più vicini, ma non uguali,
a quelli di ω0 .

Vibrazione forzata; caso ω = ω0 e risonanza Se il termine forzante è ha una pulsazione


ω = ω0 , allora si verificare il fenomeno della risonanza; in questo caso, la soluzione particolare
va moltiplicata per t, e quindi la soluzione di (8.2) con y(0) = y 0 (0) = 1 è data da

t
y(t) = sin(t) + sin(t).
2

t=linspace(0,250,1000);
y0=1;
v0=1;
omega0=1;
B=1;
A=sqrt((y0-B/omega0^2)^2+v0^2/omega0^2);
c=(y0-B/omega0^2)/A;
s=-v0/(A*omega0);
yt=A*(c*cos(omega0*t)-s*sin(omega0*t))+B*t.*sin(omega0.*t)/(2*omega0);
hx=B*cos(omega0*t);
plot(t,yt,t,ht,’r’)
grid on

8.7.2 Vibrazioni smorzate


Trattiamo qui il caso in cui δ 6= 0; il polinomio caratteristico associato sarà dato da p(λ) =
λ2 + 2δλ + ω02 e il comportamento delle soluzioni dipenderà dal valore del discriminante
∆/4 = δ 2 − ω02 . Si parla di smorzamento supercritico se |δ| > ω0 (in questo caso il polinomio
caratteristico avrà due radici reali distinte), smorzamento critico se δ = ω0 (una sola radice
reale del polinomio caratteristico) ed infine smorzamento subcritico se |δ| < ω0 (avremo qui
due radici complesse coniugate).
8.7. VIBRAZIONI MECCANICHE 71

Vibrazione smorzata: caso supercritico Consideriamo l’equazione (8.2) con δ = 1.2,


ω0 = 1, B = 0 e il problema di Cauchy con dati iniziali y(0) = 1, y 0 (0) = −3; in tal caso la
soluzione è data da √
9 − 11 −δt  2√11 t √
2 11

y(t) = √ e e 10 − e− 10 t
2 11
e il suo grafico lo possiamo disegnare come segue;
t=linspace(0,10,100);
y0=1;
v0=-3;
omega0=1;
delta=1.2;
r1=-delta-sqrt(delta^2-omega0^2);
r2=-delta+sqrt(delta^2-omega0^2);
c1=(v0-y0*r2)/(r1-r2);
c2=y0-c1;
yt=c1*exp(r1*t)+c2*exp(r2*t);
plot(t,yt);
grid on

Vibrazione smorzata: caso critico Consideriamo come esempio il caso ω0 = δ = 1,


B = 0 e il problema di Cauchy con dati iniziali y(0) = 1, y 0 (0) = −3; la soluzione è data da

y(t) = e−t (1 − 2t),

il cui grafico sarà dato da


t=linspace(0,10,100);
y0=1;
v0=-3;
omega0=1;
yt=y0*exp(-omega0*t)+(v0+omega0*y0)*t.*exp(-omega0*t);
plot(t,yt);
grid on

Vibrazione smorzata: caso subcritico Consideriamo il caso ω0 = 1, δ = 0.1, B = 0


con dati iniziali y(0) = y 0 (0) = 1; la soluzione è
√ !
−δt 11
y(t) = e cos($t) − sin($t) ,
3
p
dove $ = ω02 − δ 2 . Il grafico di tale soluzione sarà dato da
t=linspace(0,80,1000);
y0=1;
v0=1;
omega0=1;
delta=0.1;
omega=sqrt(omega0^2-delta^2);
72 CAPITOLO 8. EQUAZIONI DIFFERENZIALI

A=sqrt(y0^2+((v0+delta*y0)/omega)^2);
c=y0/A;
s=-(omega0+delta*y0)/(A*omega);
yt=A*exp(-delta*t).*(c*cos(omega*t)+s*sin(omega*t));
plot(t,yt);
grid on

Vibrazione smorzata forzata Chiudiamo con un esempio di vibrazione smorzata con


termine forzante; consideriamo solo il caso subcritico con ω0 = 1, δ = 0.1, termine forzante
con B = 1/2, ω = 1/3 e risolviamo il problema di Cauchy con dati iniziali y(0) = y 0 (0) = 1.
La soluzione è data da
2δωB B(ω02 − ω 2 )
y(t) = Ae−δt (c cos($t) + s sin($t)) + 2
sin(ωt) + cos(ωt)
a a2
dove
s  2
1+δ
q q
a= (ω02 − ω 2 )2 + 4δ 2 ω 2 , $= ω02 − δ2 , A= 1+ ,
$
1
1 + cδ
,c= s=−A ;
A $
tracciamo il grafico di y(t) assieme al grafico del termine forzante (in rosso);

t=linspace(0,80,1000);
y0=1;
v0=1;
omega0=1;
delta=0.1;
omega=1/3;
B=1/2;
a=sqrt((omega0^2-omega^2)^2+4*delta^2*omega^2);
nu=sqrt(omega0^2-delta^2);
A=sqrt(y0^2+((v0+delta*y0)/nu)^2);
c=y0/A;
s=-(v0/A+c*delta)/nu;
yt=A*exp(-delta*t).*(c*cos(nu*t)+...
s*sin(nu*t))+(2*delta*omega*B/a^2)*sin(omega*t)...
+(B*(omega0^2-omega^2)/a^2)*cos(omega*t);
plot(t,yt,t,B*cos(omega*t),’r’);
grid on
Si noti come la soluzione ha un certo andamento per un certo intervallo di tempo, mentre
poi a regime si comporta come il termine forzante.
Appendice A

Derivazione numerica

Si può utilizzare Matlab per il calcolo approssimato delle derivate di una funzione data;
sostanzialmente, una funzione altro non sarà che un vettore di valori. Possiamo quindi rica-
vare il valore approssimato delle derivate semplicemente utilizzando i rapporti incrementali
della funzione.

A.1 Derivata prima


Per il calcolo della derivata prima della funzione f possiamo utilizzare la formula;
∆f f (x + ∆x) − f (x)
(x) = .
∆x ∆x
Il valore ottenuto sarà necessariamente un valore approssimato di f 0 (x) e tale errore sarà
tanto più piccolo quanto più piccolo sarà il valore di ∆x. Si può quindi calcolare la derivata
di sin x in [0, 2π] mediante questo metodo:
x=linspace(0,2*pi,1000);
y=sin(x);
deltax=diff(x); deltay=diff(y);
derivata=deltay./deltax;
Ovviamente, dato che ∆x è costante lungo la griglia, avremmo anche potuto considerare il
comando;
derivata=deltay/(2*pi*1000):
Possiamo comparare il risultato ottenuto tracciando il grafico del vettore derivata assieme
al grafico della funzione cos x;
plot(x(1:999),derivata,’-’,x,cos(x),’:’);
legend(’Derivazione Numerica’,’Derivata’);
title(’Derivazione numerica ed analitica di y=sin(x)’);
xlabel(’x’); ylabel(’y’);
Il comando diff non fa altro che ottenere da un vettore dato un vettore che contiene
le differenze tra due entrate consecutive del vettore, e viene quindi prodotto un vettore la

73
74 APPENDICE A. DERIVAZIONE NUMERICA

cui lunghezza è di uno inferiore rispetto alla lunghezza del vettore di partenza. Per questo
motivo abbiamo dovuto considerare, nel grafico della derivata, il vettore x(1:999).
Come varianti del comando diff si puó considerare il comando diff(x,2), che, dato ad
esempio il vettore x=[a,b,c,d], produce il vettore [c-2b+a,d-2c+b]; tale comando coincide
col comando diff(diff(x)), e servirà in seguito per il calcolo delle derivate seconde. Il
comando diff(x,1) coincide con diff(x).
Allo stesso modo, si possono calcolare numericamente le derivate parziali di una funzione
di più variabili; cosı̀ ad esempio, per una funzione di due variabili f (x, y), possiamo ottenere
le seguenti approssimazioni

∂f f (x + ∆x, y) ∂f f (x, y + ∆y)


(x, y) ∼ , (x, y) ∼ .
∂x ∆x ∂y ∆y

A.2 Derivata seconda


Per il calcolo della derivata seconda si può procedere essenzialmente come nella sezione
precedente, e cioè utilizzando il rapporto incrementale della derivata prima approssimata
f (x+2∆x)−f (x+∆x) f (x+∆x)−f (x+)
f 0 (x + ∆x) − f 0 (x) −
f 00 (x) ∼ ∼ ∆x ∆x
∆x ∆x
f (x + 2∆x) − 2f (x + ∆x) + f (x)
= .
(∆x)2

Quindi, se volessimo ad esempio calcolare la derivata seconda numerica di f (x) = ex in [0, 3]


potremmo considerare i seguenti comandi;
x=linspace(0,3,1000);
deltax=3/1000;
derivata2=diff(exp(x),2)/(deltax)^2;
Ovviamente, allo stesso modo potremmo ottenere le derivate seconde numeriche per una
funzione di due variabili;

∂2f f (x + 2∆x, y) − 2f (x + ∆x, y) + f (x, y)


2
(x, y) ∼ ,
∂x (∆x)2
e
∂2f f (x, y + 2∆y) − 2f (x, y + ∆y) + f (x, y)
2
(x, y) ∼ .
∂y (∆y)2
mentre la derivata seconda mista sarà data da
∂2f f (x + ∆x, y + ∆y) − f (x + ∆x, y) − f (x, y + ∆y) + f (x, y)
(x, y) ∼ .
∂x∂y ∆x∆y
Come esercizio, si scrivano comandi Matlab che calcolino le derivate seconde di una fun-
zione di due variabili, dove si utilizzi il comando diff(x,2) e diff(y,2) per il calcolo delle
derivate seconde non miste.
Appendice B

Il metodo di integrazione di
Simpson

Con tale nome di denota il metodo di approssimazione dell’integrale di una funzione f :


[a, b] → R ottenuto suddividendo l’intervallo in n = 2m parti uguali, prendendo cioè h = b−a
n
come lunghezza dei sottointervalli e sostituendo le somme di Riemann con le somme
m m−1
!
h X X
Sn = f (a) + 4 f (x2k−1 ) + 2 f (x2k ) + f (b)
3
k=1 k=1

dove xk = kh, k = 0, . . . , n sono i punti estremi degli intervalli che definiscono la partizione.
Le somme di Simpson possono quindi essere calcolate utilizzando in Matlab i seguenti
comandi;

h=(b-a)/n;
xdispari=a+h:2*h:b-h;
xpari=a+2*h:2*h:b-2*h;
Sn=h/3*(f(a)+4*sum(f(xdispari))+2*sum(f(xpari))+f(b));

Si potrebbe verificare una tale formula, confrontandola anche con le somme di Riemann e
con il valore esatto dell’integrale, sull’integrale
Z 2
1
dx
0 1 + x2

con n = 20. Una possibile successione di comandi diventa quindi;


a=0; b=2; n=20;
h=(b-a)/n;
xdispari=a+h:2*h:b-h;
xpari=a+2*h:2*h:b-2*h;
fdispari=1./(1+xdispari.^2);
fpari=1./(1+xpari.^2);
S20=h/3*(1/(1+a^2)+4*sum(fdispari)+2*sum(fpari)+1/(1+b^2));

75
76 APPENDICE B. IL METODO DI INTEGRAZIONE DI SIMPSON
Appendice C

Metodo di Eulero per le


equazioni differenziali

Consideriamo qui il metodo noto come metodo di Eulero per il calcolo approssimato delle so-
luzioni delle equazioni differenziali del prim’ordine; prendiamo in considerazione l’intervallo
[−5, 5], n = 40 e il problema ai valori iniziali
 0
y (t) = cos(2t + y(t))
y(−5) = 4.

Si usa quindi il seguente metodo:

t0=-5; y0=5; tf=5;


n=40; % numero di passi
h=(tf-t0)/n; % ampiezza del passo
t=t0:h:tf;
y=y0*ones(size(t));
for i=1:n
y(i+1)=y(i)+h*cos(2*t(i)+y(i));
end
plot(t,y)

Si noti che il metodo si basa semplicemente sulla scrittura della derivata discreta

y(ti+1 ) − y(ti )
∼ y 0 (ti ) = cos(2ti + y(ti )).
h
Possiamo anche creare un function m–file per l’implementazione del metodo di Eulero; tale
function avrà in ingresso la funzionef che compare in y 0 = f (t, y), il punto iniziale t0 e il
punto finale t1 , il dato iniziale y0 e il numero di passi n. Possiamo quindi scrivere

function [t,y]=Euler(f,t0,t1,y0,n)
% Metodo di Eulero per il problema
%
% y’=f(t,y)
% y(t0)=y0

77
78 APPENDICE C. METODO DI EULERO PER LE EQUAZIONI DIFFERENZIALI

%
% nell’intervallo [t0,t1] con n passi
%
% Utilizzo; si scrivere
%
% y=Euler(’f’,t0,t1,y0,n)
%
% dove f deve essere una funzione \textsc{Matlab} built-in
% o il nome, racchiuso tra apici, di un function m--file.
% In uscita si ottiene un vettore t dei valori della variabile
% indipendente e il vettore y dei valori della variabile dipendente.
% Il comando plot(t,y) produce il grafico della soluzione.
if nargin<5
error(’Mancano dei parametri. Usare: y=Euler(f,t0,t1,y0,n)’)
end
f=fcnchk(f,’vectorized’);
h=(t1-t0)/n;
t=t0:h:t1;
y=y0*ones(size(t));
for i=1:n
y(i+1)=y(i)+h*f(t(i),y(i));
end

A questo punto, se vogliamo utilizzare il file appena creato per risolvere il problema di
Cauchy precedente, possiamo semplicemente considerare
[t,y]=Euler(’cos(2*t+y)’,-5,5,4,40);
plot(t,y)
Come variante, possiamo anche considerare disegnare la soluzione trovata in rosso sul
campo direzionale definito dall’equazione y 0 = cos(2t + y);
[t,y]=meshgrid(-5:.5:5,.5:.5:4.5);
dt=ones(size(t));
dy=cos(2*t+y);
quiver(t,y,dt,dy);
hold on;
[t,y]=Euler(’cos(2*t+y)’,-5,5,4,40);
plot(t,y,’r’); hold off;
title(’y’’=cos(2t+y)’);
Appendice D

Integrazione di equazioni
differenziali per serie

Si possono utilizzare anche le serie di funzioni per determinare le soluzioni di determinate


equazioni differenziale; presentiamo qui due esempi, uno in cui utilizziamo le serie di Taylor,
ed uno in cui utilizzeremo le serie di Fourier.

D.1 Serie di Taylor


A volte può essere utile la teoria delle serie di Taylor per la determinazione di una soluzione
di un’equazione differenziale; infatti, se ad esempio consideriamo l’equazione

(D.1) y 00 (t) − 2ty 0 (t) + y(t) = 0, y(0) = 1, y 0 (0) = 0,

con t ∈ [0, 1], allora possiamo cercare la soluzione nella forma



X
(D.2) y(t) = an tn .
n=0

Le condizioni iniziali sono condizioni sui primi due coefficienti, a0 = 1, a1 = 0; per la


determinazione degli altri coefficienti, basta inserire (D.2) in (D.1) per trovare l’equazione
algebrica
2n − 1
an+2 = an , n ≥ 0.
(n + 1)(n + 2)
Si noti che quindi a partire da a0 si costruiranno tutti i cefficienti di indice pari, mentre
partendo da a1 si costruiranno quelli di indice dispari. Possiamo quindi considerare i seguenti
comandi, che ci daranno il polinomio di Taylor di grado 10; l’unica accortezza è che nella
costruzione dei coefficienti col comando a=b(11:-1:1), avremo la relazione a(n) = an−1
b=[1 0]; % Condizioni iniziali
% coefficienti di indice pari
for n=0:2:8
b(n+3)=(2*n-1)/((n+1)*(n+2))*b(n+1);
end

79
80 APPENDICE D. INTEGRAZIONE DI EQUAZIONI DIFFERENZIALI PER SERIE

% coefficienti di indice dispari


for n=1:2:7
b(n+3)=(2*n-1)/((n+1)*(n+2))*b(n+1);
end
a=b(11:-1:1); % invertiamo i coefficienti
plot(-2:.01:2,polyval(a,-2:.01:2))

Si provi con gradi maggiori, come ad esempio 30 o 100 e si noterà che la velocità di calcolo
è comunque elevata.

Esercizio D.1

1. Disegnare il polinomio di Taylor di grado 10 della soluzione del problema di Cauchy


 00
y (t) − 2ty 0 (t) + y(t) = 0,
y(0) = 0, y 0 (0) = 1,

con t ∈ [−2, 2].

2. Disegnare il polinomio di Taylor di grado 10 della soluzione del problema di Cauchy


 00
y (t) − 2ty 0 (t) + y(t) = 0,
y(0) = 1, y 0 (0) = 1,

con t ∈ [−2, 2].

D.2 Serie di Fourier


Supponiamo di voler risolvere la seguente equazione differenziale lineare del secondo ordine
a coefficienti costanti
y 00 (t) + ω02 y(t) = b(t)
e supponiamo che b sia una funzione T –periodica sviluppabile in serie di Fourier; allo-
ra possiamo cercare la soluzione particolare dell’equazione utilizzando le serie di Fourier.
Cerchiamo quindi una funzione ȳ sviluppata in serie di Fourier mediante

α0 X
ȳ(t) = + [αk cos(kωt) + βk sin(kωt)] ,
2
k=1


dove ω = T , in modo tale che

00 a0 X
ȳ (t) + ω02 ȳ(t) = b(t) = + [ak cos(kωt) + bk sin(kωt )] ,
2
k=1

con Z T /2
2
ak = b(t) cos(kωt)dt, k ≥ 0,
T −T /2
Z T /2
2
bk = b(t) sin(kωt)dt, k ≥ 1.
T −T /2
D.2. SERIE DI FOURIER 81

Siamo ricondotti quindi ad un sistema (infinito) che coinvolge i coefficienti in quanto la


richiesta che ȳ sia soluzione particolare si traduce nell’equazione

α0 ω02 X 
αk (ω02 − k 2 ω 2 ) cos(kωt) + βk (ω02 − k 2 ω 2 ) sin(kωt)

+
2
k=1

a0 X
= + [ak cos(kωt) + bk sin(kωt )] .
2
k=1

Troviamo quindi che


a0
α0 = ,
ω02
mentre per k ≥ 1, se ω02 6= k 2 ω 2 , allora

ak bk
αk = , βk = .
ω02 − k 2 ω 2 ω02 − k 2 ω 2

Se infine esiste m ≥ 1 per cui ω02 = m2 ω 2 , allora siamo nella situazione in cui va trovata la
soluzione particolare dell’equazion2

y 00 (t) + ω02 y(t) = am cos(ω0 t) + bm sin(ω0 t);

tale soluzione è data da


am bm
− t cos(ω0 t) + t sin(ω0 t).
2ω0 2ω0
In definitiva avremo che la soluzione particolare sarà data da
a0 am bm
ȳ(t) = − t cos(ω0 t) + t sin(ω0 t)+
2ω02 2ω0 2ω0
∞  
X ak bk
+ cos(kωt) + 2 sin(kωt) .
ω02 − k 2 ω 2 ω0 − k 2 ω 2
k=1,k6=m

Come esempio possiamo considerare la funzione b : [−π, π) → R studiata nella Sezione


7.5 associata all’equazione differenziale

y 00 (t) + y(t) = b(t),

dove su [−π, π) la funzione b è data da b(t) = tχ[0,π) (t) + t2 χ[−π,0) (t), e poi viene estesa
2π–periodica. Abbiamo quindi T = 2π e ω = 1. Abbiamo anche ω0 = 1, e quindi lo sviluppo
in serie di Fourier della soluzione sarà
a0 a1 b1
ȳ(t) = − t cos t + t sin t+
2 2 2
∞  
X ak bk
+ cos(kt) + sin(kt) .
1 − k2 1 − k2
k=2

Come esercizio, si scriva in Matlab dei comandi che calcolino i coefficienti di ȳ e si disegni
il grafico della soluzione particoalre cosı̀ ottenuta.

Potrebbero piacerti anche