Sunteți pe pagina 1din 6

Rezolvarea ecuaţiilor diferenţiale de ordinul întâi

MATLAB are facilităţi foarte puternice de rezolvare a problemelor cu valori iniţiale pentru
ecuaţii diferenţiale ordinare:
d
y (t )  f t , y(t ) 
dt
y(t 0 )  y 0

Cel mai simplu mod de a rezolva o astfel de problemă este de a scrie o funcţie care evaluează f şi
de a apela unul dintre rezolvitorii MATLAB. Informaţia minimă pe care un rezolvitor trebuie să o
primească este numele funcţiei, mulţimea valorilor lui t pe care se cere soluţia şi valoarea iniţială
y0 . Rezolvitorii MATLAB acceptă argumente de intrare şi ieşire opţionale care permit să se
specifice mai mult despre problema matematică şi modul de rezolvare a ei.
Fiecare rezolvitor MATLAB este conceput să fie eficient în anumite situaţii, dar toţi sunt în
esenţă interschimbabili. Toţi rezolvitorii au aceeaşi sintaxă, ceea ce ne permite să încercăm
diferite metode numerice atunci când nu ştim care ar fi cea mai potrivită. Sintaxa este:

[t,y]=rezolvitor(@fun,tspan,y0,optiuni,p1,p2,...)

unde rezolvitor este unul din rezolvitorii daţi în tabel.

Rezolvitor Tip Tip algoritm


problemă
ode45 non-stiff Pereche Runge-Kutta explicită, cu ordinele 4 şi 5

ode23 non-stiff Pereche Runge-Kutta explicită, cu ordinele 2 şi 3


ode113 non-stiff Metodă cu mai mulţi paşi explicită, cu ordin variabil, ordinele de la 1
la 13
ode15s stiff Metodă cu mai mulţi paşi implicită, cu ordin variabil, ordinele de la 1 la 15
ode23s stiff Rosenbrock
ode23t stiff moderată Regula implicită a trapezului, cu ordinele 2 şi 3

ode23tb stiff Algoritm Runge-Kutta implicit, ordinele 2 şi 3

Argumentele de intrare sunt:

 fun – specifică funcţia din membrul drept. In versiunile 6.x este un handler de funcţie,iar
în versiunile 5.x este un nume de funcţie (ˆın acest caz se scrie ’fun’ nu @fun);
 tspan – vector ce specifică intervalul de integrare. Dacă este un vector cu două elemente
tspan=[t0 tfinal], rezolvitorul integrează de la t0 la tfinal. Dacă tspan are
mai mult de două elemente rezolvitorul returnează soluţiile în acele puncte. Abscisele
trebuie ordonate crescător sau descrescător. Rezolvitorul nu îşi alege paşii după valorile
din tspan, ci obţine valorile în aceste puncte prin prelungiri continue ale formulelor de
bază care au acelaşi ordin de precizie ca şi soluţiile calculate în puncte.
 optiuni – opţiunile permit setarea unor parametrii ai rezolvitorului şi se crează cu
odeset.

Parametrii de ieşire sunt:


 t – vectorul coloană al absciselor;
 y – tabloul soluţiilor: o linie corespunde unei abscise, iar o coloană unei componente a
soluţiei.

După optiuni pot să apară parametrii variabili, p1, p2, ... care sunt transmişi funcţiei
fun la fiecare apel.

Funcţia odeset crează o structură de opţiuni care poate fi transmisă unui rezolvitor.
Argumentele lui odeset sunt perechi nume proprietate/valoare proprietate. Sintaxa este
optiuni=odeset(’nume1’, valoare1, ’nume2’, valoare2, ...)
Aceasta crează o structură de opţiuni în care proprietăţile cu numele dat primesc o valoare
specificată. Proprietăţile nespecificate primesc valori implicite.

”Stiff” (ţeapăn, rigid, dificil, anevoios) este un concept subtil, dificil şi important în rezolvarea
numerică a ecuaţiilor diferenţiale ordinare. El depinde de ecuaţia diferenţială, de condiţiile
iniţiale şi de metoda numerică. In literatura de specialitate se dă următoarea caracterizare
computaţională a acestui termen:
,,O problemă este stiff dacă soluţia căutată variază lent, dar există soluţii apropiate care variază
rapid, astfel că metoda numerică trebuie să utilizeze paşi foarte mici pentru a obţine rezultate
satisfăcătoare.”
Conceptul de ”stiffness” este o chestiune de eficienţă. Metodele non-stiff pot rezolva problemele
stiff, dar într-un timp foarte lung.

Exemplu:
Să se integreze ecuaţia diferenţială
y t    y t   5  e t  cos5t
pe intervalul [0, 3] cu condiţia iniţială y0   0

function yder=ed1(t,y)
%exemplu de ecuatie diferentiala scalara
yder=-y+5*exp(-t).*cos(5*t);
Vom folosi rezolvitorul ode45. Secvenţa de comenzi MATLAB
>> tspan = [0,3]; yzero=0;
>> [t,y]=ode45(@ed1,tspan,yzero);
>> plot(t,y,’r--*’)
>> xlabel(’t’), ylabel(’y(t)’)
1

0.8

0.6

0.4
y(t)

0.2

-0.2

-0.4
0 0.5 1 1.5 2 2.5 3
t

Rezolvarea ecuaţiilor diferenţiale de ordin superior

Rezolvitorii Matlab de tipul ode… acceptă numai ecuaţii deiferenţiale de ordinul întâi. Pentru a
rezolva ecuaţii diferenţiale de ordin superior trebuie rescrise ecuaţiile sub forma unui sistem
echivalent de ecuaţii diferenţiale de ordinul întâi.
Ecuaţia diferenţială de ordinul n:


y  n   f t , y , y ,..., y n 1 
la care se asociază notaţiile:

y1  y, y 2  y , ..., y n  y n 1

este echivalentă cu următorul sistem de n ecuaţii de ordinul întâi:

 y1  y 2
 y  y
 2 3



 y n  f t , y , y ,..., y  n 1
 

Exemplu:
Să se integreze ecuaţia diferenţială
y t   2t  y t   3 y (t )  0
pe intervalul [0, 5] cu condiţiile iniţiale y 0   3 şi y 0   1
Se notează :
y1  y
y2  y 

Rezultă sistemul de două ecuaţii diferenţiale de ordinul I.


 y   2t  y  3 y
 2 2 1
 
 y1  y 2

function dy=sistem1(t,y)
dy=[y(2);-2*t*y(2)-3*y(1)];

>> [t,y]=ode23(@sistem1,[0,5],[3;1]);
>> plot(t,y)

Exemplu:
Să se rezolve sistemul de ecuaţii diferenţiale
d
 dt y1 (t )   y 2 (t )  y3 (t )

d
 y 2 (t )  y1 (t )  a  y 2 (t )
 dt
d
 dt y 3 (t )  b  y 3 (t )   y1 (t )  c 

unde a, b, c sunt parametri reali
y0   1,1,1 şi cu seturile de parametri
T
pe intervalul [0, 100] cu condiţia iniţială
(a,b,c)=(0.2,0.2,2.5) şi (a,b,c)=(0.2,0.2,5)

function yd=sistem2(t,y,a,b,c)
%sistem de ecuatii diferentiale parametrizat
yd = [-y(2)-y(3); y(1)+a*y(2); b+y(3)*(y(1)-c)];

tspan = [0,100]; y0 = [1;1;1];


options = odeset('AbsTol',1e-7,'RelTol',1e-4);
a=0.2; b=0.2; c1=2.5; c2=5;
[t,y] = ode45(@sistem2,tspan,y0,options,a,b,c1);
[t2,y2] = ode45(@sistem2,tspan,y0,options,a,b,c2);
subplot(2,2,1), plot3(y(:,1),y(:,2),y(:,3))
title('c=2.5'), grid
xlabel('y_1(t)'), ylabel('y_2(t)'), zlabel('y_3(t)');
subplot(2,2,2), plot3(y2(:,1),y2(:,2),y2(:,3))
title('c=5'), grid
xlabel('y_1(t)'), ylabel('y_2(t)'), zlabel('y_3(t)');
subplot(2,2,3); plot(y(:,1),y(:,2))
title('c=2.5')
xlabel('y_1(t)'), ylabel('y_2(t)')
subplot(2,2,4); plot(y2(:,1),y2(:,2))
title('c=5')
xlabel('y_1(t)'), ylabel('y_2(t)')

Rezultate:

c=2.5 c=5

4 20
y 3(t)

y 3(t)
2 10

0 0
5 10
5 20
0 0 10
0
0
y 2(t) -5 -5 y 2(t) -10 -10
y 1(t) y 1(t)

c=2.5 c=5
4 10

2
5

0
y 2(t)

y 2(t)

0
-2

-5
-4

-6 -10
-4 -2 0 2 4 6 -10 -5 0 5 10 15
y 1(t) y 1(t)

Aplicaţie: Circuite electrice în regim tranzitoriu

Un condensator de capacitate C încărcat la tensiunea U0 este cuplat la bornele unui circuit care
cuprinde un rezistor de rezistenţă R în serie cu o bobină având inductivitatea L.
Să se scrie un program pentru calculul şi reprezentarea grafică a variaţiei în timp a intensităţii
curentului în circuit.
Funcţia de variaţie în timp a tensiunii la bornele condensatorului satisface ecuaţia diferenţială de
ordinul doi:
d 2uc duc
LC 2
 RC  uc  0
dt dt
cu condiţiile iniţiale:
uc (0)  U 0
duc
0
dt t 0
Curentul în circuit se determină cu relaţia:
du
i  C c
dt

Date numerice:
U0 = 100 V; C = 100 F; L = 10 mH; R = 3.5 

Sursa MATLAB (function m-file)


function ucond = c_tranz(t,uc)
L=10e-3;
C=100e-6;
R=3.5;
ucond(1,:)=-R/L*uc(1)-1/(L*C)*uc(2);
ucond(2,:)=uc(1);

Sursa MATLAB (m-file)


%Aplicatie - circuite electrice in regim tranzitoriu
U0=100;
t0=0;
tf=1e-1;
C=100e-6;
[t,uc]=ode23(@c_tranz,[t0 tf],[0,U0]);
ic=-C*uc(:,1);
plot(t,ic);

Rezultat – variatia in timp a curentului in circuit

-2

-4

-6
0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1

S-ar putea să vă placă și