odeint
Numpyでのシミュレーション中に中間変数を保存する最も簡単な方法は何ですか?
例えば:
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
に渡される引数で指定されたポイントが理想的odeint
です。
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 がオイラー ステップを行っていない限り、dy は指定したタイムステップ数よりも多く呼び出されます。x
各 に対して確実に 1 つを取得するためy
に、ブロック内のモンキー ビジネスはif t >= self.times[self.timestep]:
配列内のスポットを選択して、times
ベクトルからの各時間値のデータを格納します。あなたの特定のアプリケーションは、他のクレイジーな問題につながる可能性があります。アプリケーションでこの方法を十分に検証してください。