2

我昨天刚开始使用 Python,使用scipy.integrate.odeint.

我定义了一个函数

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

它接受numpy.array对象x,tM; 和标量浮动beta, gamma, 和mu.

M(60,60)大小,但我认为这并不重要。

x并且t都是非单例的,有x.shape存在(180,)t.shape存在(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]]

即使SIR刚刚返回x,我也会收到此错误,并且如果我将所有参数从中剥离x出来t

def SIR(x, t):
    return x;

如您所见,导致错误的行是

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

编辑 :

我被要求添加该SIR方法的完整代码。因为它相对较长,所以我将完整的 .py 脚本放在了一个 pastebin 中:http: //pastebin.com/RphJbCHN

再次感谢。

4

2 回答 2

3

我可以通过多种方式重现您的错误。

y0如果参数或tto 的参数odeint不是一维数组,则会立即发生错误。在 pastebin 上发布的代码示例中(在评论中提到),t被改写如下:

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

删除改变形状的线tt必须是一维数组,而不是形状为 (len(t), 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(第二个参数)是否是一numpy 数组(不是形状为 (1, 180) 或 (180, 1) 的二维数组)。

I also get the 'object too deep...' error if SIR returns an array with the wrong shape. It must return a 1-D array, with the same shape as its first argument. Make sure it is truly 1-D, and not 2-D with shape (1, 180) or (180, 1).

于 2013-03-29T20:30:38.910 回答
-1

从本教程看来,第一个参数 tointegrate.odeint()需要是一个要操作的函数(在您的情况下)x0t. 由于您的SIR()函数只接受一个参数,因此操作失败。从返回的结果的大小和/或形状可能SIR()相对于其余参数很重要。

于 2013-03-29T19:25:30.493 回答