Matlab ode15s:正 dx/dt,递减 x(t)

Matlab ode15s: postive dx/dt, decreasing x(t)

在我的脚本中,我将 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 始终保持正值。

谁能解释一下这是怎么可能的?

不建议像这样在中间暂停积分并检查状态和导数。 ode15s 不像简单的 ODE 求解器那样简单地逐步求解。它对具有半随机状态的 ODE 函数进行一系列调用,以计算高阶导数。这些状态不是系统的解决方案,但被 ode15s 内部使用,以便稍后获得更准确的解决方案。

如果您想在特定时间获得系统的导数,请先计算整个解决方案,然后在您感兴趣的时间使用该解决方案的切片调用 ODE 函数。