Я пытаюсь решить одно ОДУ первого порядка с помощью ODEINT. Ниже приведен код. Я ожидаю получить 3 значения y для 3 временных точек. Проблема, с которой я борюсь, - это возможность передать n-е значение mt и nt для вычисления dydt. Я думаю, что ODEINT передает все 3 значения mt и nt, а не только 0-е, 1-е или 2-е, в зависимости от итерации. Из-за этого я получаю такую ошибку:
RuntimeError: размер массива, возвращаемого func (4), не соответствует размеру y0 (1).
Интересно, что если я заменю начальное условие, которое является (и должно быть) одним значением как: a0 = [2] * 4, код работает, но дает мне матрицу 4X4 в качестве решения, что кажется неправильным.
mt = np.array([3,7,4,2]) # Array of constants
nt = np.array([5,1,9,3]) # Array of constants
c1,c2,c3 = [-0.3,1.4,-0.5] # co-efficients
para = [mt,nt] # Packing parameters
#Test ODE function
def test (y,t,extra):
m,n = extra
dydt = c1*c2*m - c1*y - c3*n
return dydt
a0= [2] # Initial Condition
tspan = range(len(mt)) # Define tspan
#Solving the ODE
yt= odeint(test, a0,tspan,args=(para,))
#Plotting the ODE
plt.plot(tspan,yt,'g')
plt.title('Multiple Parameters Test')
plt.xlabel('Time')
plt.ylabel('Magnitude')
Дифференциальное уравнение первого порядка:
dy/dt = c1*(c2*mt-y(t)) - c3*nt
Это уравнение представляет собой часть эндокринной системы мышей, которую я пытаюсь смоделировать. Система аналогична системе с двумя резервуарами, где первый резервуар получает определенный гормон [с неизвестной скоростью], но наш датчик определяет этот уровень (mt)
через определенные интервалы времени (1 секунда). Затем этот резервуар поступает во второй резервуар, где уровень этого гормона (y)
определяется другим датчиком. Я обозначил уровни, используя отдельные переменные, потому что датчики, определяющие уровни, не зависят друг от друга и не откалиброваны друг для друга. «c2» можно рассматривать как коэффициент, который показывает корреляцию между двумя уровнями. Кроме того, перенос этого гормона из резервуара 1 в резервуар 2 обусловлен диффузией. Этот гормон дополнительно потребляется в ходе биохимического процесса (аналогично сливному клапану для второго резервуара). На данный момент неясно, какие параметры влияют на потребление; однако другой датчик может определять количество потребляемого гормона (nt)
в определенный интервал времени (1 секунда, в этом случае тоже).
Таким образом, mt
и nt
- это концентрации / уровни гормона в определенные моменты времени. хотя в коде всего 4 элемента, в моем исследовании эти массивы намного длиннее. Все датчики сообщают о концентрациях с интервалом в 1 секунду, поэтому tspan
состоит из временных точек, разделенных 1 секундой.
Цель состоит в том, чтобы математически определить концентрацию этого гормона во втором резервуаре (y
), а затем оптимизировать значения этих коэффициентов на основе экспериментальных данных. Я смог передать эти массивы mt
и nt
в определенный ODE и решить с помощью ODE45 в MATLAB без проблем. Я столкнулся с этим RunTimeError, пытаясь воспроизвести код на Python.
m
вtest()
становитсяmt
.mt
является массивом numpy длиной 4, поэтомуc1*c2*m
также является массивом numpy длиной 4 (как иc3*n
). Тогдаdydt
- это массив длины 4. Таким образом, вы фактически возвращаете массив длиной 4 изtest()
. - person Warren Weckesser   schedule 25.01.2017test
4 раза для 4 точек вtspan
, верно? Я думал, что каждый вызовtest
со стороны ODE будет называться итерацией - нет? - person bluetooth   schedule 25.01.2017odeint
может вызывать функциюtest
много раз со значениямиt
, которые не обязательно находятся вtspan
. Вы должны реализоватьtest
как функцию произвольных значенийt
. То есть ваша функция должна обрабатыватьt=1e-3
,t=2.5
и т. Д. - person Warren Weckesser   schedule 25.01.2017a0=2
иyt
создавали массив4X1
? - person bluetooth   schedule 26.01.2017dy/dt = c1*c2*m(t) - c1*y - c3*n(t)
, но функцииm(t)
иn(t)
известны только в дискретных значениях времени t = 0, 1, 2, 3. Если это так, вы должны решить, как вы хотите для определенияm(t)
иn(t)
для произвольногоt
. Если вы не можете этого сделать, значит, у вас нет четко определенного дифференциального уравнения. Если мое понимание неверно, поясните, пожалуйста, математическую проблему, объяснив ее более подробно в вопросе. - person Warren Weckesser   schedule 30.01.2017