Слишком глубокий объект для требуемого массива - scipy.integrate.odeint
Я только что начал с Python вчера, и я получаю сообщение об ошибке, используя 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));
РЕДАКТИРОВАТЬ:
Меня попросили добавить полный код для SIR
метод. Поскольку он относительно длинный, я поместил полный скрипт.py в каталог для вставки: http://pastebin.com/RphJbCHN
Еще раз спасибо.
2 ответа
Я могу воспроизвести вашу ошибку несколькими способами.
Ошибка возникает немедленно, если либо y0
аргумент или t
аргумент odeint
не является одномерным массивом. В примере кода, размещенном на pastebin (указан в комментарии), t
изменен так:
t = np.arange(0, 520, 1);
t = t.reshape(len(t),1);
Удалить строку, которая изменяет t
, t
должен быть одномерным массивом, а не двумерным массивом с формой (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, а не 2-D с формой (1, 180) или (180, 1).
Из учебника это выглядит как первый аргумент integrate.odeint()
должна быть функция для работы (в вашем случае) x0
а также t
, Так как ваш SIR()
Функция принимает только один аргумент, операция не выполняется. Возможно, что размер и / или форма результатов, возвращаемых из SIR()
важны по отношению к остальным аргументам.