在 Python 中求解 ODE 时,如何获得比 linspace 更多的变量值? (编辑)

How may I get more values of a variable than my linspace while solving ODE in Python? (EDIT)

为了更容易地检查我的一些结果,我使用 Excel sheet 制作了一些图表。但是,我注意到了一些非常尴尬的事情。

编辑:

让我们以另一种方式呈现问题,我在我的代码中发现了一些代表我不理解的东西。

import numpy as np
from scipy.integrate import odeint

A = []


def F(y, z):
    global A
    a = y[0]
    b = y[1]

    A.append(a)

    return [a, b]


y0 = [1, 1]
z = np.linspace(0, 1, 101)
y = odeint(F, y0, z)
print(len(z), len(A))

问题是为什么z和A的长度不同(比如101和55)?

对我来说,在求解过程中,a 应该变化 len(z) 次,因此 A。所以看起来 linspace 没有对方程的求解做任何事情。又或者是我没看懂Python.

中linspace的用法

通过 odeint 的解决方案使用具有自适应内部时间步长的隐式线性多步法。这是通过 PECE 预测校正器方案实现的。那里的 E 代表 "evaluation"。这意味着在每个内部积分步骤中,都会调用 ODE 函数两次。您获得的内部步骤可能少于输入时间列表的条目,输出数组是从内部时间步骤插值的,因此每个内部步骤可以有多个输出值。但另一个极端也是可能的,即为了达到要求的公差,内部步长非常小,以至于一个输出时间步需要多个内部步。

如果问题更加僵硬,将会有更多的调用,周期性地对雅可比行列式的数值逼近,并且可能在类牛顿校正步骤的每一步调用多次,或者只是多个简单的校正步骤,这是然后调用 PE(CE)d.


对比,看显式RK4方法。每个时间步都有 4 次 ODE 函数评估。 ode45 的 Dormand-Prince 方法每个时间步长有 6+1 次评估,但是内部时间步长不需要对应于传递给该方法的时间样本列表,请求的输出样本是从内部步骤插值的。