当步长 (h) 大于 1 时,ODE 系统不起作用

ODE System doesn't work when step size (h) is bigger than 1

我是 Python 的初学者。目前我正在编写代码,用于为具有初始值的非线性 ODE 系统开发一个简单的求解器。系统方程为as follow.

先对myu的函数求值得到myu的值,然后在dX/dt、dS/dt、dDO/dt中使用。在下一步中,再次评估 myu 以根据 S 和 DO 的新值获得其新值。

我正在使用 J. C. Butcher 提出的一般线性方法 (GLM) 作为我的方法。该方法使用一个转移矩阵,其值和大小取决于我们使用的数值方法。在这种情况下,我使用 Runge Kutta Cash-Karp。

虽然你可能会发现方程式中D也是一个函数,但这里我将D的值设置为常数。

初始化时先设置h的值,得到步数。我创建了一个名为 'initValue' 的向量,它有 8 列和 4 行,由每个方程的 k 值(第 1 到 6 行)、Runge Kutta 四阶的初始值(第 7 行)组成。我将它设置为0,因为它只是作为一个 'predictor'),以及每个方程的初始值(第 8 行)。

过渡矩阵是基于GLM创建的,其中的值来自Runge Kutta Cash-Karp的阶段方程(求k1到k6的值)和阶梯方程(求解)的常数.

在循环中,第一次,我只是将初始值添加到名为 'result' 的数组中。第一步,我简单地将转换矩阵与向量 'initValue' 相乘。在下一步直到最后一步,我根据上一步的结果初始化 'initValue'。

我正在寻找的解决方案应该类似于 this。 如果 h 小于 1,我的代码就可以工作。我将我的结果与 scipy.integrate.odeint 的结果进行比较。但是当我将 h 设置为大于 1 时,它显示的结果与应有的结果不同。比如在代码中,我设置了h = 100,也就是说它只会显示初值和终值(time = 100时)。虽然 X 和 S 应该向上,DO 和 Xr 应该向下,但我的恰恰相反。当 h 设置为大于 1 时,odeint 的结果显示与预期解决方案相同的结果。

我需要帮助来修复我的代码,以便它可以显示任何 h 值的预期解决方案。

谢谢。

为什么您期望对于大得离谱的步长会产生任何类型的合理结果?

最简单的演示就是y'=-y和显式欧拉法。如果您使用较小的步长 1,您将获得定性正确的解决方案。对于小于 0.1 的步长,您将开始获得定量上正确的步长。

但是,如果使用步长 h=10,则迭代

y[k+1]= y[k] - h*y[k] = -9*y[k]

会爆炸。同样的情况也发生在高阶方法中,足够小的步长给出定量上正确的结果,中等步长仍然可以给出定性上正确的图片,大步长导致的错误很快就会大于解决方案的值。