我是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行,由每个等式(第1行到第6行)的k值,Runge Kutta的第四阶的初始值(第7行)组成。将其设置为0,因为它只是作为预测器'),以及每个方程的初始值(第8行)。
基于GLM创建转移矩阵,其中的值来自阶段方程的常数(以找到k1到k6的值)和步骤方程(找到解决方案)的Runge Kutta Cash-Karp。 / p>
在循环中,在第一次,我只是将初始值添加到名为' result'的数组中。在第一步,我简单地使用向量" initValue'多个转换矩阵。在接下来的最后一步,我初始化了'initValue'基于上一步的结果。
我正在寻找的解决方案应该是this。 如果h小于1,我的代码可以工作。我将结果与scipy.integrate.odeint的结果进行比较。但是当我将h设置为大于1时,它显示的结果与应该的结果不同。例如,在代码中,我设置h = 100,这意味着它只显示初始值和最终值(当时间= 100时)。虽然X和S应该向上,DO和Xr向下,但是我的反面是它们。当h设置为大于1时,odeint的结果显示与预期解决方案相同的结果。
我需要帮助来修复我的代码,以便它可以显示任何h值的预期解决方案。
谢谢。
答案 0 :(得分:0)
为什么你认为任何类型的合理结果都是可笑的大步长?
最简单的演示是y'=-y
和显式的Euler方法。如果您使用小于1
的步长,您将获得质量正确的解决方案。对于小于0.1的步长,您将开始定量地校正步长。
但是,如果您使用步长h=10
,那么迭代
y[k+1]= y[k] - h*y[k] = -9*y[k]
会爆炸。对于更高阶的方法也会出现同样的情况,足够小的步长可以提供定量正确的结果,中等步长仍然可以提供定性正确的图像,大步长导致的误差非常快于解决方案值。