preparing symbolic ODE for ode45
7 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Star Strider
2021-11-11
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.
.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Symbolic Math Toolbox 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!