Runge-Kutta 和重用数据点

计算科学 Python 显式方法
2021-11-29 03:54:55

我正在尝试实现四阶 Runge-Kutta 方法来解决 Python 中的一阶 ODE,即我了解该方法的工作原理,但我正在尝试编写一种有效的算法,以最小化的次数,因为这非常昂贵。有人告诉我,可以重用之前计算的数据点,因为您在步骤中递增但看不到如何。有谁知道如何做到这一点,还是不可能?dydx=f(x,y)f(x,y)

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<>K2K3<> yp_2

一般来说,N 阶显式 Runge-Kutta 方法需要N函数评估,并且绝对没有办法避免这种情况。过去他们需要超过个函数评估。N NN=4N

如果你想重用过去的函数评估,你需要使用像 Adams-Bashforth 这样的多步方法。

在任何情况下,您都需要为每个策略付费。单步方法需要最大数量的函数评估,但多步方法具有最大的内存需求。

编辑:更正。我的陈述仅适用于显式方法。隐式方法的情况不太清楚,因为阶段的数量不会直接转化为函数评估的数量。

我知道您正在使用 Runge-Kutta 方法来求解 ODE,但如果您想重用 f(x,y) 的旧计算值,您可能需要考虑多步方法,例如 Adams-Bashforth 或 Adams-Moulton方法。当然,这些方法的缺点是您不能很容易地使用自适应时间步长。

请检查“嵌入式”方法:这种类型的 RK 方法的目标是有两种不同阶的方法,其中高阶方法使用与低阶方法相同的函数评估。这允许非常有效的误差估计。参见 Hairer、Norsett 和 Wanner 的“求解常微分方程 I:非刚性问题”的第 165 页及更多内容。典型的例子是 7(8) 阶的 Fehlberg 方法。

此外,如果您正在寻找在 PYTHON 中求解 ODE,请查看assimulo我已经用这个包玩了几个星期了,我很高兴。