Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Ecuaţii diferenţiale în MATLAB ....................................................................................................................................................................................................... 1
1. Probleme cu valori iniţiale ....................................................................................................................................................................................................... 1
1.1 Rezolvitori .............................................................................................................................................................................................................................. 1
1.2 Exemple .............................................................................................................................................................................................................................. 3
1.3 Opţiuni ................................................................................................................................................................................................................................ 8
1.2 Tratarea evenimentelor........................................................................................................................................................................................................ 9
2. Probleme cu valori pe frontieră ............................................................................................................................................................................................. 15
MATLAB are facilităţi foarte puternice de rezolvare a problemelor cu valori iniţiale pentru ecuaţii
diferenţiale ordinare:
𝑑𝑦(𝑡)
= 𝑓(𝑡, 𝑦(𝑡)), 𝑦(𝑡0 ) = 𝑦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ă 𝑦0 .
Rezolvitorii MATLAB acceptă argumente de intrare şi ieşire opţionale care permit să se specifice
Pagina 1
EDO în MATLAB 2
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 tabela 1.
Rezolvitor Tip Algoritm
problemă
ode45 Nonstiff Pereche Runge-Kutta explicită, cu ordinele 4 şi 5
ode23 Nonstiff Pereche Runge-Kutta explicită, cu ordinele 2 şi 3
ode113 Nonstiff 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 Pereche Rosenbrock modificată (cu un pas), cu ordinele 2 şi 3
ode23t Stiff Regula implicită a trapezului, cu ordinele 2 şi 3
ode23tb Stiff Algoritm Runge-Kutta implicit, ordinele 2 şi 3
Pagina 2
3 EDO în MATLAB
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.
După optiuni pot să apară parametrii variabili, p1, p2, ... care sunt transmişi funcţiei fun la
fiecare apel. De exemplu
[t,y]=rezolvitor(@fun,tspan,y0,optiuni,p1,p2,...)
apelează
fun(T,Y,flag,p1,p2,...).
1.2 Exemple
Să considerăm ecuaţia scalară
𝑦 ′ (𝑡) = −𝑦(𝑡) + 5𝑒 −𝑡 cos 5𝑡, 𝑦(0) = 0.
Pagina 3
EDO în MATLAB 4
function yder=f1scal(t,y)
%F1SCAL Exemplu de EDO scalara
yder = -y+5*exp(-t).*cos(5*t);
ans =
3.8416e-004
Pagina 4
5 EDO în MATLAB
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
Pagina 5
EDO în MATLAB 6
𝑑
𝑦1 (𝑡) = 𝑦2 (𝑡)
{ 𝑑𝑡
𝑑 𝑔
𝑦1 (𝑡) = − sin 𝑦1 (𝑡)
𝑑𝑡 𝐿
Rezolvarea este data în fisierul pendul.m, dat în continuare:
%pendul
g=10; L=10;
pend = @(t,y) [y(2); -g/L*sin(y(1))];
tspan = [0,10];
yazero = [1; 1]; ybzero = [-5; 2];
yczero = [5; -2];
[ta,ya] = ode45(pend,tspan,yazero);
[tb,yb] = ode45(pend,tspan,ybzero);
[tc,yc] = ode45(pend,tspan,yczero);
[y1,y2] = meshgrid(-5:0.5:5,-3:0.5:3);
Dy1Dt = y2; Dy2Dt = -sin(y1);
quiver(y1,y2,Dy1Dt,Dy2Dt)
hold on
plot(ya(:,1),ya(:,2),yb(:,1),yb(:,2),yc(:,1),yc(:,2))
axis equal, axis([-5,5,-3,3])
xlabel y_1(t), ylabel y_2(t), hold off
Pagina 6
7 EDO în MATLAB
Ec = 0.5*yc(:,2).^2-cos(yc(:,1));
max(abs(Ec(1)-Ec))
Pentru a obţine grafice de fază vom reprezenta pe 𝑦2 (𝑡) în funcţie de 𝑦1(𝑡) . Este sugestiv să
reprezentăm pe acelaşi grafic şi câmpul de vectori cu quiver. Săgeţile generate de quiver au
direcţia gradientului [𝑦2 , − sin 𝑦1 ] şi lungimea proporţională norma euclidiană a acestui vector.
Imaginea obţinută apare în figura 2.
Pagina 7
EDO în MATLAB 8
1.3 Opţiuni
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
>> odeset
AbsTol: [ positive scalar or vector {1e-6} ]
RelTol: [ positive scalar {1e-3} ]
NormControl: [ on | {off} ]
NonNegative: [ vector of integers ]
OutputFcn: [ function_handle ]
OutputSel: [ vector of integers ]
Refine: [ positive integer ]
Stats: [ on | {off} ]
InitialStep: [ positive scalar ]
MaxStep: [ positive scalar ]
Pagina 8
9 EDO în MATLAB
BDF: [ on | {off} ]
MaxOrder: [ 1 | 2 | 3 | 4 | {5} ]
Jacobian: [ matrix | function_handle ]
JPattern: [ sparse matrix ]
Vectorized: [ on | {off} ]
Mass: [ matrix | function_handle ]
MStateDependence: [ none | {weak} | strong ]
MvPattern: [ sparse matrix ]
MassSingular: [ yes | no | {maybe} ]
InitialSlope: [ vector ]
Events: [ function_handle ]
1.4 Tratarea evenimentelor
În multe situaţii, determinarea ultimei valori 𝑡𝑓𝑖𝑛𝑎𝑙 a lui tspan este un aspect important al
problemei. Un exemplu este căderea unui corp asupra căruia acţionează forţa gravitaţională şi
rezistenţa aerului. Când atinge el pământul?
Un alt exemplu este problema celor două corpuri, adică determinarea orbitei unui corp supus
atracţiei gravitaţionale a unui corp mult mai greu. Care este perioada orbitei? Facilitatea de
prelucrare a evenimentelor a rezolvitorilor din MATLAB furnizează răspunsuri la astfel de întrebări.
Detecţia evenimentelor în MATLAB presupune două funcţii 𝑓(𝑡, 𝑦) şi 𝑔(𝑡, 𝑦) şi o condiţie iniţială
(𝑡0 , 𝑦0 ). Problema este de a găsi o funcţie 𝑦(𝑡) şi o valoare finală 𝑡 ∗ astfel încât
𝑦 ′ = 𝑓(𝑡, 𝑦)
𝑦(𝑡0 ) = 𝑦0
Pagina 9
EDO în MATLAB 10
𝑔(𝑡 ∗ , 𝑦(𝑡 ∗ )) = 0.
Un model simplu al unui corp în cădere este
𝑦 ′′ = −1 + 𝑦′2
cu o condiţie iniţială care dă valori pentru 𝑦(0) şi 𝑦′(0). Problema este pentru ce valori ale lui t
avem 𝑦(𝑡) = 0? Rezolvarea este în fişierul falling_body.m.
function falling_body(y0)
opts = odeset('events',@g);
[t,y,tfinal] = ode45(@f,[0,Inf],y0,opts);
tfinal
plot(t,y(:,1),'-',[0,tfinal],[1,0],'o')
axis([-0.1, tfinal+0.1, -0.1, max(y(:,1)+0.1)]);
xlabel t
ylabel y
title('Corp in cadere')
text(tfinal-0.8, 0, ['tfinal = ' num2str(tfinal)])
%-----
function ydot=f(t,y)
ydot = [y(2); -1+y(2)^2];
%-----
function [gstop,isterminal,direction] = g(t,y)
gstop = y(1);
isterminal = 1;
direction = 0; %[];
Pagina 10
11 EDO în MATLAB
Pagina 11
EDO în MATLAB 12
Detecţia evenimentelor este utilă în probleme ce presupun fenomene periodice. Problema celor
două corpuri este un exemplu bun. Ea descrie orbita unui corp asupra căruia acţionează forţa
gravitaţională a unui corp mult mai greu. Utilizând coordonate carteziene, 𝑢(𝑡) şi 𝑣(𝑡) cu originea în
corpul mai greu, ecuaţiile sunt:
𝑢(𝑡)
𝑢′′ (𝑡) = − ,
𝑟(𝑡)3
𝑣(𝑡)
𝑣 ′′ (𝑡) = − .
𝑟(𝑡)3
unde 𝑟(𝑡) = √𝑢(𝑡)2 + 𝑣(𝑡)2 . Întreaga rezolvare este conţinută într-un singur fişier de tip funcţie,
orbit.m (sursaMATLAB 10.6). Parametrul de intrare, reltol, este eroarea (precizia) relativă
dorită. Codificarea problemei twobody şi funcţia de tratare a evenimentelor gstop sunt date prin
subfuncţii (ele pot fi păstrate la fel de bine în fişiere separate). Calculul orbitei se realizează cu
ode45. Argumentul de intrare y0 este un vector cu 4 elemente, care dă poziţia iniţială şi viteza.
Corpul uşor porneşte din poziţia (1, 0) şi are viteza iniţială (0, 0.3), care este perpendiculară pe
vectorul poziţiei iniţiale. Argumentul opts este o structură creată cu odeset, care specifică
eroarea relativă (egală cu reltol) şi funcţia de tratare a evenimentelor gstop. Ultimul argument
al lui ode45 este o copie y0, transmisă atât lui twobody cât şi lui gstop. Vectorul bidimensional d
din gstop este diferenţa dintre poziţia curentă şi punctul de pornire. Viteza în poziţia curentă este
dată de vectorul bidimensional v, iar cantitatea val este produsul scalar al lui d şi v. Expresia
funcţiei de oprire este
𝑔(𝑡) = 𝑑′ (𝑡)𝑇 𝑑(𝑡),
unde
Pagina 12
13 EDO în MATLAB
%----------
%--------
Pagina 13
EDO în MATLAB 14
dir = 1;
Punctele în care 𝑔(𝑡, 𝑦(𝑡)) = 0 sunt extreme locale ale lui 𝑑(𝑡). Punând dir = 1, vom indica
că zerourile lui 𝑔(𝑡, 𝑦)sunt atinse de sus, ceea ce corespunde minimelor. Setând isterm= 1, vom
indica faptul că procesul de calcul trebuie oprit la întâlnirea primului minim. Dacă orbita este
periodică, atunci orice minim al lui 𝑑 apare când corpul se întoarce în punctul iniţial.
Apelând orbit cu o precizie mică
>> orbit(2e-3)
se obţine
tfinal =
2.350871977621059
yfinal =
0.981076599012211 -0.000125191385552
şi graficul din figura 10.14(a). Se poate observa din valoarea lui yfinal şi din grafic o abatere de la
periodicitate. Avem nevoie de o precizie mai bună. Cu comanda
>> orbit(1e-6)
se obţine
tfinal =
2.380258461718048
yfinal =
0.999985939055227 0.000000000322400
Valoarea yfinal este acum suficient de apropiată de y0, iar graficul arată mult mai bine (figura
10.14(b)).
Pagina 14
15 EDO în MATLAB
Pagina 15
EDO în MATLAB 16
frontieră sunt mult mai dificil de rezolvat numeric decât problemele cu valori iniţiale. bvp4c
necesită o soluţie iniţială de pornire. Soluţia iniţială şi cea finală se păstrează în structuri.
Vom începe cu o problemă scalară care descrie secţiunea transversală a unei picături de apă pe o
suprafaţă plană:
3
2 2
𝑑2 𝑑
ℎ (𝑥 ) + (1 − ℎ (𝑥 ) ) (1 + ( ℎ(𝑥 )) ) = 0, ℎ(−1) = ℎ(1) = 0.
𝑑𝑥 2 𝑑𝑥
ℎ(𝑥) semnifică înalţimea picăturii în punctul 𝑥. Punem 𝑦1 (𝑥 ) = ℎ(𝑥), 𝑦2 (𝑥 ) = 𝑑ℎ(𝑥)/𝑑𝑥 şi
rescriem ecuaţia sub forma unui sistem de două ecuaţii de ordinul I
𝑑
𝑦 (𝑥 ) = 𝑦2 (𝑥 )
𝑑𝑥 1
3
𝑑 2
𝑦2 (𝑥 ) = (𝑦1 (𝑥 ) − 1)(1 + 𝑦22 (𝑥 ))
𝑑𝑥
Acest sistem se reprezintă prin funcţia
function yprime=drop(x,y)
%DROP ODE/BVP picatura de apa
%apel yprime=drop(x,y)
Pagina 16
17 EDO în MATLAB
solinit = bvpinit(linspace(-1,1,20),@dropinit);
sol = bvp4c(@drop, @dropbc, solinit);
fill(sol.x, sol.y(1,:),[0.7, 0.7, 0.7])
axis([-1, 1, 0, 1])
xlabel('x', 'Fontsize',16)
ylabel('y','Rotation',0,'FontSize',16)
Pagina 17
EDO în MATLAB 18
0.9
0.8
0.7
0.6
y 0.5
0.4
0.3
0.2
0.1
0
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
x Figura 41
Funcţia odefun descrie ecuaţia diferenţială, iar bcfun dă reziduurile pentru condiţiile iniţiale. Ele
returnează vectori coloană. Forma generală a lui odefun este
yprime = odefun(x,y)
iar a lui bcfun
res=bcfun(ya,yb).
Pagina 18
19 EDO în MATLAB
Structura pentru soluţia iniţială, solinit, are două câmpuri solinit.x şi solinit.y.
Valorile solinit.x dau abscisele soluţiei iniţiale, solinit.x(1) şi solinit.x(end)
conţinând a şi respectiv b. Corespunzător, solinit.y(:,i) dă soluţia iniţială în
solinit.x(i). Funcţia auxiliară bvpinit crează o structură pentru soluţia iniţială. Celelalte
argumente ale lui bvp4c sunt opţionale. Structura options pemite specificarea diverşilor
parametrii ai algoritmului de colocaţie, cum ar fi toleranţele, valori iniţiale, numărul maxim de
puncte. Ea poate fi creată cu bvpset, similară cu odeset. (vezi doc bvpset).
Parametrul de ieşire sol este o structură.
sol.x(i)abscisa,
sol.y(:,i) ordonata,
sol.yp(:,i) aproximarea derivatei
function lcrun
%LCRUN Liquid crystal BVP.
% Solves the liquid crystal BVP for four different lambda values.
Pagina 19
EDO în MATLAB 20
solinit = bvpinit(linspace(-1,1,20),@lcinit);
lambda = lambda_vals(1); sola = bvp4c(@lc,@lcbc,solinit);
lambda = lambda_vals(2); solb = bvp4c(@lc,@lcbc,sola);
lambda = lambda_vals(3); solc = bvp4c(@lc,@lcbc,solb);
lambda = lambda_vals(4); sold = bvp4c(@lc,@lcbc,solc);
plot(sola.x,sola.y(1,:),'-', 'LineWidth',4), hold on
plot(solb.x,solb.y(1,:),'--','LineWidth',2)
plot(solc.x,solc.y(1,:),'--','LineWidth',4)
plot(sold.x,sold.y(1,:),'--','LineWidth',6), hold off
legend([repmat('\lambda = ',4,1) num2str(lambda_vals')])
xlabel('x','FontSize',16)
ylabel('\theta','Rotation',0,'FontSize',16)
ylim([-0.1 1.5])
end
Pagina 20
21 EDO în MATLAB
Pagina 21
EDO în MATLAB 22
1.5
= 10
= 3
= 2.5
= 2.4
1
0.5
Pagina 22
23 EDO în MATLAB
Ultimul exemplu este o problemă de valori proprii referitoare la o problemă cu valori pe frontieră.
Ecuaţia diferenţială este
𝑑2 𝑦(𝑥)
+ 𝜇𝑦(𝑥 ) = 0,
𝑑𝑥 2
cu condiţiile
𝑦(0) = 0, 𝑦 ′ (0) = 0, 𝑦(1) + 𝑦 ′ (1) = 0.
Această ecuaţie modelează deplasarea unei frânghii fixate în 𝑥 = 0, cu suport elastic în 𝑥 = 1 şi se
roteşte cu viteză unghiulară uniformă în jurul poziţiei de echilibru de pe axa Ox. Problema este o
problemă de valori proprii deoarece trebuie să găsim o valoare a parametrului 𝜇 pentru care există o
soluţie. Putem privi cele două condiţii în 𝑥 = 0 ca definid o problemă cu valori iniţiale şi să
încercăm să determinăm valorile lui 𝜇 pentru care soluţia verifică condiţia în 𝑥 = 1. Problema se
rescrie sub forma unui sistem de două EDO de ordinul I, iar soluţiile de pornire sunt 𝑦1 (𝑥 ) =
sin 𝑥, 𝑦2 (𝑥 ) = cos 𝑥 . Valorea de pornire 𝜇 = 5 se specifică ca parametru suplimentar în bvpinit.
solinit = bvpinit(linspace(0,1,10),@skipinit,5);
sol = bvp4c(@skip,@skipbc,solinit);
plot(sol.x,sol.y(1,:),'-', sol.x,sol.yp(1,:),'--', 'LineWidth',4)
xlabel('x','FontSize',12)
legend('y_1','y_2')
Pagina 23
EDO în MATLAB 24
skiprun
ans =
struct with fields:
solver: 'bvp4c'
Pagina 24
25 EDO în MATLAB
Pagina 25