首页 文章

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

提问于
浏览
1

我需要从调用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求解器中获取值 .

1 回答

  • 0

    有可能,您无法使用 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 而不是 odeint . odeint 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 方法 . 这是一个非常好的用例 .

相关问题