preparing symbolic ODE for ode45
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Clemens Herrmann
le 11 Nov 2021
Commenté : Star Strider
le 12 Nov 2021
Consider the following symbolic ODE:
syms gamma(t)
C1 = 2.4
C2 = 3.1
ode = diff(gamma, t, 2) == C1 * sin(gamma) + C2 * cos(diff(gamma))
Now, I want to convert the above expression to the function odefun which I can use with ode45:
function res = odefun(t, gamma)
res = [gamma(2);
2.4*sin(gamma(1)) + 3.1*cos(gamma(2))]
end
Are there ways to automate (parts of) this process? The above ode is only a simple example to illustrate my problem. The ode I'm really trying to solve has way more terms with coefficients.
Thanks
0 commentaires
Réponse acceptée
Star Strider
le 11 Nov 2021
Try something like this —
syms gamma(t) T Y
C1 = 2.4
C2 = 3.1
ode = diff(gamma, t, 2) == C1 * sin(gamma) + C2 * cos(diff(gamma))
[VF,Subs] = odeToVectorField(ode)
odefun = matlabFunction(VF, 'Vars',{T,Y})
ic = [0 1];
tspan = [0 10];
[t,omega] = ode45(odefun, tspan, ic);
figure
plot(t, omega)
grid
legend(string(Subs), 'Location','best')
The constants do not have to be specified in the original equations. They can be included as parameters, so for example —
syms gamma(t) T Y C1 C2
ode = diff(gamma, t, 2) == C1 * sin(gamma) + C2 * cos(diff(gamma))
odefun = matlabFunction(VF, 'Vars',{T,Y, [C1,C2]})
ic = [0 1];
tspan = [0 10];
CV = rand(1,2)
[t,omega] = ode45(@(t,omega)odefun(t,omega,CV), tspan, ic);
Now they can be changed in the numeric code (for example in a loop or nested loops) without having to re-derive them each time in the original symbolic code.
.
2 commentaires
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Symbolic Math Toolbox dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!