我有一个运动函数文件的方程式,我将其输入ode45。必要时,函数文件的输出变量是ydot。
在我的运动函数方程中,我从状态向量y计算许多对象来规定力。
ode45完成后,我希望每次都能访问这些对象,以便计算能量。
不是在每个时间步骤重新计算它们,而是将它们从Runge-Kutta过程中拉出来,当它们被计算为中间步骤时会更快。
是否可以这样做?
答案 0 :(得分:0)
无法保证右侧的ODE功能甚至在输出点处被调用,因为它们通常是从自适应步长算法计算的点进行插值。
我经常看到但需要搜索引用的一个技巧是让函数返回所需的所有值,并将返回列表缩减为ODE45调用中的派生。模数适当的语法
function [ydot, extra] = odefunc(t,y,params)
然后使用
sol = ode45(@(t,y): odefunc(t,y,params)(1),...)
然后对odefunc
中的点运行sol
以提取额外信息。
也许选择输出的想法只适用于python。然后定义一个显式包装器
function ydot = odewrapper(t,y)
[ydot,~] = odefunc(t,y,params)
end
然后您通常会在ode45
中调用。