2016-12-20 6 views
0

Я пытаюсь передать массив в ODE, а затем разрешить это ODE, используя функцию ODEINT. Тем не менее, я получаю следующее сообщение об ошибке:Входной массив для функции ODEINT в SciPy

RuntimeError: The size of the array returned by func (50) does not match the size of y0 (1)

Вот мой пример кода:

from scipy.integrate import odeint 
import numpy as np 
import matplotlib.pyplot as plt 


#First ODE 
def eq1 (x,t): 
    return (0.5*(x)+2*x**2) 

#Second ODE 
def eq2 (y,t,m): 
    p = np.sqrt(y)+m*y**2 
    return p 

t = np.linspace(0,1,50) 
IC = [2] # Initial Condition 
m = [0.1]*len(t) # A random variable 

#Solver for the first ODE 
one = odeint(eq1,IC,t) 
plt.plot (t,one) 

#Solver for the Second ODE 
two = odeint (eq2,IC,t,(m,)) 
plt.plot (t,two) 

Первый решатель работает отлично, но второй один выдает ошибку. Основываясь на сообщении об ошибке, я понимаю, что размер IC не такой же, как у переменной m. Следовательно, если я прокомментирую строки, относящиеся к решателю первого ODE и измените IC как IC = [2]*len(m), сообщение об ошибке исчезнет. How3ever, two.shape есть (50,50). Я не знаю, какой размер решения (два) является фактическим ответом.

Я бы очень признателен за руководство. Спасибо!

+0

Пожалуйста, объясните математическое дифференциальное уравнение, которое вы пытаетесь решить. Я подозреваю, что вы не перевели его правильно в код python. В частности, что означает 'm' в' eq2() '? Вы создали 'm' последовательность с длиной' len (t) ', содержащую только значение 0.1, но комментарий говорит« случайная величина ». В каком смысле вы имеете в виду «случайный»? –

+0

Оба уравнения полностью произвольны - я составил уравнения. Я просто хотел узнать, как реализовать ODEINT, когда одной из переменных является массив. Для exp. 'M' может быть синусоидальным сигналом, представляющим пульсирующий капиллярный кровоток, вместо массива, содержащего только значение 0,1. Я думаю, что я хотел сказать «произвольный сигнал» вместо «случайной величины» - я использовал неправильное слово. – bluetooth

+0

* «Для exp.« M »может быть синусоидальным сигналом, представляющим пульсирующий капиллярный кровоток» * В этом случае 'm' должно быть функцией времени' t', а не массивом. Тогда ваш код в 'eq2' будет чем-то вроде' p = np.sqrt (y) + m (t) * y ** 2', и вы должны определить 'm (t)' (функцию, возвращающую скаляр) в другом месте. –

ответ

0

Насколько я знаю, нет способа передать массив в качестве параметра для функции ODE в Python. Как ни странно, я думаю, что это возможно в Matlab. Единственный способ решить вашу проблему (но неэффективно) - использовать цикл FOR.