我正在尝试实现四阶 Runge-Kutta 方法来解决 Python 中的一阶 ODE,即。我了解该方法的工作原理,但我正在尝试编写一种有效的算法,以最小化的次数,因为这非常昂贵。有人告诉我,可以重用之前计算的数据点,因为您在步骤中递增但看不到如何。有谁知道如何做到这一点,还是不可能?
Runge-Kutta 和重用数据点
计算科学
颂
Python
显式方法
2021-11-29 03:54:55
4个回答
如果您要从yp_1 = f(x_1, y_1)
到yp_2 = f(x_1+h, y_2)
您将需要中间点:
K1 = f(x_1+h/2, y_1+h/2*yp_1)
K2 = f(x_1+h/2, y_1+h/2*K1)
K3 = f(x_1+h, y_1+h*K2)
x_2 = x_1 + h
y_2 = y_1 + h/6*(yp_1+2*K1+2*K2+K3)
yp_2 = f(x_2, y_2)
一般来说,没有一个中间点在下一步中是有用的。因为 K1
<>K2
和K3
<> yp_2
。
一般来说,N 阶显式 Runge-Kutta 方法需要N函数评估,并且绝对没有办法避免这种情况。过去他们需要超过个函数评估。
如果你想重用过去的函数评估,你需要使用像 Adams-Bashforth 这样的多步方法。
在任何情况下,您都需要为每个策略付费。单步方法需要最大数量的函数评估,但多步方法具有最大的内存需求。
编辑:更正。我的陈述仅适用于显式方法。隐式方法的情况不太清楚,因为阶段的数量不会直接转化为函数评估的数量。
我知道您正在使用 Runge-Kutta 方法来求解 ODE,但如果您想重用 f(x,y) 的旧计算值,您可能需要考虑多步方法,例如 Adams-Bashforth 或 Adams-Moulton方法。当然,这些方法的缺点是您不能很容易地使用自适应时间步长。
请检查“嵌入式”方法:这种类型的 RK 方法的目标是有两种不同阶的方法,其中高阶方法使用与低阶方法相同的函数评估。这允许非常有效的误差估计。参见 Hairer、Norsett 和 Wanner 的“求解常微分方程 I:非刚性问题”的第 165 页及更多内容。典型的例子是 7(8) 阶的 Fehlberg 方法。
此外,如果您正在寻找在 PYTHON 中求解 ODE,请查看assimulo。我已经用这个包玩了几个星期了,我很高兴。