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

时间:2018-12-10 03:05:29

标签: python scipy

我需要将内部计算从调用传递给odeint。我通常在完成积分后再次重新计算值,但是我更喜欢在odeint的调用函数中进行所有计算。

我的问题在计算上并不繁琐,因此可以在ode求解器内部进行计算时获得一些额外的性能损失。

qp = QPainterPathStroker()
qp.setWidth(12)
qp.setCapStyle(Qt.SquareCap)
return qp.createStroke(self.path())

此代码无法运行,但希望能显示出我的追求。我想通过集成器的每次传递从eom函数中获取“ internal_calc”值。

我一直在寻找选项,但是我认识的最好的python程序员之一告诉我写自己的集成器,这样我就可以做我想做的事。

在此之前,我想问一下是否有人可以从odeint求解器中获取值。

1 个答案:

答案 0 :(得分: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而不是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方法。这是一个很好的用例。