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

标签 python arrays python-3.x numpy ode

为了更轻松地检查我的一些结果,我使用 Excel 工作表制作了一些图表。然而,我注意到一些非常尴尬的事情。

编辑:

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

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 代表“评估”。这意味着在每个内部积分步骤中,ODE 函数都会被调用两次。您获得的内部步骤可能比输入时间列表的条目少,输出数组是从内部时间步骤插入的,以便每个内部步骤可以有多个输出值。但另一个极端也是可能的,即为了达到所要求的容差,内部步长非常小,以至于一个输出时间步需要多个内部步。

如果问题更加困难,则会定期进行更多调用,以进行雅可比行列式的数值近似,并且可能会在类牛顿校正器步骤的每一步进行多次调用,或者只是多个简单的校正步骤,然后将其称为PE(CE)d

<小时/>

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

关于python - 在 Python 中求解 ODE 时,如何获得比 linspace 更多的变量值? (编辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54304236/

相关文章:

python - 在Python中一行获取多个变量

python - 与python蜘蛛中的Scrapy中的规则混淆

python - 将自纪元以来的时间字符串存储到 μ 中

python - 暂时忽略特定的日志行

php - 从多个嵌套数组中获取所有组合

html - 用 BeautifulSoup 在 iframe 内部抓取

python-3.x - 如何在Python中传递给类类型的类方法参数?

python - ansible 动态库存错误

c - 重新分配指向 char 的指针数组

java - 如何访问对象内部的元素