2

昨日 Python を使い始めたばかりですが、scipy.integrate.odeint.

関数を定義しました

def SIR(x, t, beta, gamma, mu, M):

numpy.arrayオブジェクトxt、およびM;を取ります。およびスカラー浮動小数点数betagamma、およびmu

Mサイズです(60,60)が、問題ないと思います。

xtはどちらもシングルトンではなく、 x.shapebeing(180,)t.shapebeing(5000,)です。私はそれらがそれぞれ形状を持つように単一の次元を与えようとしました(180,1)(5000,1)、それでも同じエラーが発生します:

In [1]: run measles_age.py
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/utils/py3compat.py in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/Users/qcaudron/Documents/SIR/measles_age.py in <module>()
    111 
    112 
--> 113         x = integrate.odeint(SIR, x0, t, args=(beta, gamma, mu, M));
    114 
    115 #       plot(t, x);


/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/scipy/integrate/odepack.py in odeint(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg)
    141     output = _odepack.odeint(func, y0, t, args, Dfun, col_deriv, ml, mu,
    142                              full_output, rtol, atol, tcrit, h0, hmax, hmin,
--> 143                              ixpr, mxstep, mxhnil, mxordn, mxords)
    144     if output[-1] < 0:
    145         print _msgs[output[-1]]

SIRreturn だけの場合でもこのエラーが発生し、すべての引数をそれとxは別に削除すると、次のようになります。xt

def SIR(x, t):
    return x;

ご覧のとおり、エラーの原因となっている行は

x = integrate.odeint(SIR, x0, t, args=(beta, gamma, mu, M));

編集 :

メソッドの完全なコードを追加するように求められましたSIR。比較的長いので、完全な .py スクリプトをペーストビンにドロップしました: http://pastebin.com/RphJbCHN

再度、感謝します。

4

2 に答える 2

3

エラーをいくつかの方法で再現できます。

y0引数またはt引数 toodeintが 1 次元配列でない場合、エラーはすぐに発生します。Pastebin に投稿されたコード例 (コメントで参照) では、次のtように整形されています。

t = np.arange(0, 520, 1);
t = t.reshape(len(t),1);

変形する線を削除しtます。 t形状 (len(t), 1) の 2 次元配列ではなく、1 次元配列でなければなりません。

例えば...

In [177]: def SIR(x, t):
   .....:     return x
   .....: 

これは機能します...

In [178]: x0 = [0.1, 0.2]

In [179]: odeint(SIR, x0, t=[0, 0.5, 1])
Out[179]: 
array([[ 0.1       ,  0.2       ],
       [ 0.16487213,  0.32974426],
       [ 0.27182822,  0.54365643]])

これにより、次のエラーが発生します。

In [180]: x0 = [[0.1, 0.2]]  # wrong shape

In [181]: odeint(SIR, x0, t=[0, 0.5, 1])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-181-a37878f92395> in <module>()
----> 1 odeint(SIR, x0, t=[0, 0.5, 1])

/home/warren/anaconda/lib/python2.7/site-packages/scipy/integrate/odepack.pyc in odeint(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg)
    142     output = _odepack.odeint(func, y0, t, args, Dfun, col_deriv, ml, mu,
    143                              full_output, rtol, atol, tcrit, h0, hmax, hmin,
--> 144                              ixpr, mxstep, mxhnil, mxordn, mxords)
    145     if output[-1] < 0:
    146         print _msgs[output[-1]]

ValueError: object too deep for desired array

odeint(2 番目の引数) に与える初期条件が1 次元のnumpy 配列であることを確認してください (形状が (1, 180) または (180, 1) の 2 次元配列ではない)。

間違った形状の配列をSIR 返すと、「オブジェクトが深すぎます...」というエラーも表示されます。最初の引数と同じ形状の1 次元配列を返さなければなりません。形状が (1, 180) または (180, 1) の 2 次元ではなく、真に 1 次元であることを確認してください。

于 2013-03-29T20:30:38.910 に答える
-1

チュートリアルから、最初の引数integrate.odeint()は(あなたの場合)操作する関数である必要があるようx0に見えますt. SIR()関数は引数を 1 つしかとらないため、操作は失敗しています。から返される結果のサイズおよび/または形状がSIR()、残りの引数に関連して重要である可能性があります。

于 2013-03-29T19:25:30.493 に答える