在Numpy中使用odeint
进行模拟期间保存中间变量的最简单方法是什么?
例如:
def dy(y,t)
x = np.rand(3,1)
return y + x.sum()
sim = odeint(dy,0,np.arange(0,1,0.1))
在模拟过程中保存x
中存储的数据的最简单方法是什么?理想情况下,在传递给t
的{{1}}参数中指定的点。
答案 0 :(得分:6)
通过一些警告来解决odeint的一种方便方法是将调用包含在类中的方法中,并使用dy
作为另一种方法,并将self
作为参数传递给{ {1}}功能。例如,
dy
要明确的是,这是一个容易陷入困境的黑客攻击。例如,除非odeint执行Euler步进,否则dy将被调用的次数多于您指定的时间步数。为了确保每个class WrapODE(object):
def __init__(self):
self.y_0 = 0.
self.L_x = []
self.timestep = 0
self.times = np.arange(0., 1., 0.1)
def run(self):
self.L_y = odeint(
self.dy,
self.y_0, self.times,
args=(self,))
@staticmethod
def dy(y, t, self):
""""
Discretized application of dudt
Watch out! Because this is a staticmethod, as required by odeint, self
is the third argument
"""
x = np.random.rand(3,1)
if t >= self.times[self.timestep]:
self.timestep += 1
self.L_x.append(x)
else:
self.L_x[-1] = x
return y + x.sum()
获得一个x
,y
块中的猴子业务会在数组中选取一个位置,用于存储来自if t >= self.times[self.timestep]:
的每个时间值的数据向量。您的特定应用可能会导致其他疯狂的问题。请务必为您的应用程序彻底验证此方法。