在我的脚本中,我调用了ODE解算器ode15s,它解决了一个9 ODE的系统。代码的简化结构:
[t, x] = ode15s(@odefun,tini:tend,options)
...
function dx = odefun(t,x)
r1=... %rate equation 1, dependent on x(1) and x(3) for example
r2=... %rate equation 2
...
dx(1) = r1+r2-...
dx(2) = ...
...
dx(9) = ...
end
在审查结果时,我很好奇为什么一个状态变量的轮廓在一定范围内增加。为了研究这个,我在ode函数中使用了条件调试,所以我可以检查所有的速率和所有的dx(i)/ dt方程。
令我惊讶的是,我发现递减状态变量的微分方程是正的。所以,我用F5调试函数模拟了多轮,并注意到状态变量确实一直在减少,而dx(i)/ dt总是保持正数。
有谁能解释一下这是怎么回事?
答案 0 :(得分:0)
不建议将积分暂停在中间,并检查状态和衍生物。 ode15s
并不像简单的ODE解算器那样简单地完成解决方案。它使用半随机状态对ODE函数进行一系列调用,以便计算高阶导数。这些状态不是系统的解决方案,而是由ode15s
在内部使用,以便以后获得更准确的解决方案。
如果您想在特定时间获得系统的衍生物,请首先计算整个解决方案,然后在您感兴趣的时候使用该解决方案的片段调用您的ODE函数。