Gewone differentiaalvergelijkingen: Scheiden van variabelen
Exacte oplossingen van een GDV met MATLAB
MATLAB is primair een software omgeving voor numerieke berekeningen, maar het heeft het computer algebra pakket MuPAD aan boord om exacte berekeningen te kunnen doen. Een paar voorbeelden geven een idee hoe het werkt.
Algemene oplossing We bekijken de differentiaalvergelijking \[\frac{\dd y}{\dd t} = t\,y\] Via de methode van scheiden van variabelen vind je als algemene oplossing \[y(t)=c\cdot e^{\frac{1}{2}t^2}\] voor zekere constante \(c\). MATLAB kan deze oplossing ook bepalen via de dsolve
functie:
>> syms y(t) % maak een symbolische functie y(t)
>> % gebruik == als symbool voor een vergelijking en diff voor afgeleide
>> GDV = diff(y,t) == t*y
GDV(t) =
diff(y(t), t) == t*y(t)
>> yopl = dsolve(GDV) % los GDV exact op
yopl =
C1*exp(t^2/2)
Beginwaardeprobleem Je kunt aan het dsolve
commando ook de beginwaarde als vergelijking opgeven. We nemen als voorbeeld het beginwaardeprobleem \[\frac{\dd y}{\dd t} = y^2,\quad y(0)=1\] Via de methode van scheiden van variabelen vind je als algemene oplossing \[y(t)=\frac{1}{c-t}\] voor zekere constante \(c\). Uit \(y(0)=1\) volgt dat \(c=1\). MATLAB kan deze oplossing ook bepalen via de dsolve
functie:
>> syms y(t)
>> GDV = diff(y,t) == y^2
GDV(t) =
diff(y(t), t) == y(t)^2
>> cond = y(0) == 1;
>> yopl = dsolve(GDV, cond)
yopl =
-1/(t - 1)
GDV van orde 2 We nemen als voorbeeld het beginwaardeprobleem \[\frac{\dd^2y}{\dd t^2} -3\frac{\dd y}{\dd t}+2y=0,\quad y(0)=-1,\quad \frac{\dd y}{\dd t}(0) = -3\] In een volgende sectie zullen we leren hoe dit probleem op te lossen, maar de oplossing is \[y(t)=e^t - 2e^{2t}\]
>> syms y(t)
>> Dy = diff(y,t)
Dy(t) =
diff(y(t), t)
>> GDV = diff(y,t,2) - 3*diff(y,t) + 2*y == 0
GDV(t) =
2*y(t) - 3*diff(y(t), t) + diff(y(t), t, t) == 0
>> cond = [y(0)==-1, Dy(0)==-3];
>> yopl = dsolve(GDV, cond)
yopl =
exp(t) - 2*exp(2*t)
We zetten dit voorbeeld door om te laten zien hoe je met de symbolische oplossing verder kunt rekenen in numerieke zin. Zo maar waarden voor \(t\) invullen werkt niet omdat yopl
een symbolische uitdrukking of beter gezegd een string is. Gebruik eval
om het string commando ook echt uit te voeren. Als je snel in MATLAB wilt kunnen rekenen en van vectorisatie gebruik wilt maken, dan moet je dit expliciet aangeven.
>> t = [0,1,2]
t =
0 1 2
>> yopl(t)
Subscript indices must either be real positive integers or logicals.
Error in sym/subsref (line 841)
R_tilde = builtin('subsref',L_tilde,Idx);
>> yopl % dit is eigenlijk een string object
yopl =
exp(t) - 2*exp(2*t)
>> eval(yopl) % voer string commando uit
ans =
-1.0000 -12.0598 -101.8072
>> eval(vectorize(yopl)) % gebruik vectorisatie
ans =
-1.0000 -12.0598 -101.8072