在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中的数据的最简单方法是什么?理想情况下,位于传递给odeint的t参数中指定的点。
发布于 2013-06-04 23:38:01
破解odeint的一个简便方法是将对odeint的调用包装在一个类的方法中,将dy作为另一个方法,并将self作为参数传递给您的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()需要明确的是,这是一个容易陷入陷阱的黑客攻击。例如,除非odeint正在执行Euler单步执行,否则dy的调用次数将超过您指定的时间步数。为了确保每个y都有一个x,if t >= self.times[self.timestep]:块中的猴子业务在一个数组中挑选一个点,用于存储times向量中每个时间值的数据。您的特定应用程序可能会导致其他疯狂的问题。请确保为您的应用程序彻底验证此方法。
https://stackoverflow.com/questions/16904202
复制相似问题