2013-03-29 3 views
2

Я только что начал с Python вчера, и я получаю сообщение об ошибке, используя scipy.integrate.odeint.Объект слишком глубокий для желаемого массива - scipy.integrate.odeint

Я определил функцию

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

, который принимает на numpy.array объекты x, t и M; и скалярные поплавки 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)); 

EDIT:

Меня попросили добавить полный код для метода SIR. Поскольку он относительно длинный, я уронил полный сценарий .py в pastebin: http://pastebin.com/RphJbCHN

Еще раз спасибо.

+1

Добро пожаловать на python! Большинство этих точек с запятой не нужны в вашем коде. – askewchan

+0

Спасибо. Я знаю, что они не нужны - я просто думаю, что с ними выглядит чище :) Спасибо за редактирование выше. – Quentin

+0

Из [документации] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html) 'SIR' должен возвращать' dx/dt' в 't'. Это то, что делает «SIR»? – askewchan

ответ

3

Я могу воспроизвести вашу ошибку несколькими способами.

Ошибка возникает немедленно, если аргумент y0 или аргумент t для odeint не является 1-мерным массивом. В примере кода размещен на Pastebin (именуемый в комментарии), t будет реорганизован следующим образом:

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

Удалите строку, которая перестраивает t. t должен быть одномерным массивом, а не 2-мерным массивом с формой (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 (второй аргумент) является 1-D NumPy массив (не 2-D массив с формой (1, 180) или (180, 1)).

Я также получаю ошибку «объект слишком глубокий ...», если SIRвозвращает массив с неправильной формой. Он должен вернуть массив 1-D с той же формой, что и его первый аргумент. Убедитесь, что он действительно 1-D, а не 2-D с формой (1, 180) или (180, 1).

+0

Спасибо - однако, я проверил это. 'SIR' возвращает массив numpy' (180,) 'в размере, а аргумент' y0' для 'odeint' также является' (180,) 'в форме. – Quentin

+0

@Quentin: Если вы можете, добавьте свой код для SIR на вопрос, а также автономный способ его запуска, чтобы мы могли воспроизвести полученную вами ошибку. –

+0

Уоррен: сделано. Быстрая ссылка: http://pastebin.com/RphJbCHN – Quentin

-1

С tutorial это выглядит как первый аргумент integrate.odeint() должен быть функцией для работы на (в вашем случае) x0 и t. Поскольку ваша функция SIR() принимает только один аргумент, операция не работает. Возможно, что размер и/или форма результатов, возвращаемых с SIR(), важны по отношению к остальным аргументам.

+0

Извините, возможно, я не был ясен. Я разделил это только на то, чтобы увидеть, была ли проблема функцией 'SIR'. Это не так. Я получил ту же ошибку, что, когда 'SIR' взял пять аргументов: определения функции SIR (х, т, бета, гамма, мю):' ' возврат х;' и был назван использованием 'х = интегрируют .odeint (SIR, x0, t, args = (бета, гамма, му)); ' – Quentin