3

odeintNumpyでのシミュレーション中に中間変数を保存する最も簡単な方法は何ですか?

例えば:

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です。

4

1 に答える 1

7

odeint をハックする便利な方法は、いくつかの注意事項がありますが、odeint の呼び出しを別のメソッドとしてクラス内のメソッドでラップし、引数として関数にdy渡すことです。例えば、selfdy

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ベクトルからの各時間値のデータを格納します。あなたの特定のアプリケーションは、他のクレイジーな問題につながる可能性があります。アプリケーションでこの方法を十分に検証してください。

于 2013-06-04T15:38:00.590 に答える