我需要将内部计算从调用传递给odeint。我通常在完成积分后再次重新计算值,但是我更喜欢在odeint的调用函数中进行所有计算。
我的问题在计算上并不繁琐,因此可以在ode求解器内部进行计算时获得一些额外的性能损失。
qp = QPainterPathStroker()
qp.setWidth(12)
qp.setCapStyle(Qt.SquareCap)
return qp.createStroke(self.path())
此代码无法运行,但希望能显示出我的追求。我想通过集成器的每次传递从eom函数中获取“ internal_calc”值。
我一直在寻找选项,但是我认识的最好的python程序员之一告诉我写自己的集成器,这样我就可以做我想做的事。
在此之前,我想问一下是否有人可以从odeint求解器中获取值。
答案 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
而不是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
方法。这是一个很好的用例。