python - scipy.integrate.odeint 是否可以输出内部计算

标签 python scipy

我需要通过调用 odeint 传递内部计算。我通常在完成积分后再次重新计算这些值,但我更愿意在 odeint 的调用函数中进行所有计算。

我的问题计算量不大,因此在 ode 求解器内部进行计算时承受一点额外的性能损失是可以接受的。

from scipy.integrate import odeint
import numpy as np

def eom(y, t):
    internal_calc = y/(t+1)
    xdot = y

    return xdot, internal_calc

if __name__ == '__main__':

    t = np.linspace(0, 5, 100)
    y0 = 1.0  # the initial condition

    output, internal_calc = odeint(eom, y0, t)

这段代码无法运行,但希望能展示我所追求的内容。我想在每次通过积分器时从 eom 函数中获取“internal_calc”值。

我四处寻找选项,但我认识的最好的 Python 程序员之一告诉我编写自己的集成器,这样我就可以做我想做的事情。

在我这样做之前,我想问问其他人是否有从 odeint 求解器中获取值的方法。

最佳答案

有可能,只是您不能使用 eom 函数的返回值。因此,您需要一些其他方式从 eom 走私数据。有很多很多不同的方法可以做到这一点。最简单的可能是只使用全局变量:

import scipy.integrate as spi

count = 0

def pend(t, y):
    global count

    theta, omega = y
    dydt = [omega, -.25*omega - 5*np.sin(theta)]

    count += 1
    return dydt

sol = spi.solve_ivp(pend, [0, 10], [np.pi - 0.1, 0.0])
print(count)

输出:

182

另外,请注意,我在上面的代码中使用了 solve_ivp 而不是 odeintodeint docs假设在编写新代码时,您现在应该使用 solve_ivp 而不是旧的 odeint

如果是我自己的代码,我可能会通过将累加器对象传递到我的函数的部分版本中来完成任务:

class Acc:
    def __init__(self):
        self.x = 0

    def __str__(self):
        return str(self.x)

def pend_partial(acc):
    def pend(t, y):
        theta, omega = y
        dydt = [omega, -.25*omega - 5*np.sin(theta)]

        acc.x += 1
        return dydt
    return pend

count = Acc()
sol = spi.solve_ivp(pend_partial(count), [0, 10], [np.pi - 0.1, 0.0])
print(count)

输出:

182

但是,如果您只是编写一个简短的脚本或其他内容,您可能应该使用更简单的global 方法。这是一个非常好的用例。

关于python - scipy.integrate.odeint 是否可以输出内部计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698969/

相关文章:

python - 如何按同时包含数字和字符串的列对 Pandas 数据框进行排序?

python - 有问题的 DataFrame 切片?

python - 具有完全向量化的 Numpy 有序元素减法

python - 如何使用 python 使用位移运算符找出以 2 为基数的数字的某个数字?

python - 颜色条中的结束刻度 - matplotlib

python - 在 NumPy 中向量化向量矩阵乘法

python - 从用户定义的分布中快速采样

python - 为两个不规则网格之间的多个插值加速 scipy griddata

python - scipy 优化 fmin 语法

python - 是否有 Python 3.x 发布生命周期的官方指南?