Я пытаюсь передать массив в 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). Я не знаю, какой размер решения (два) является фактическим ответом.
Я бы очень признателен за руководство. Спасибо!
Пожалуйста, объясните математическое дифференциальное уравнение, которое вы пытаетесь решить. Я подозреваю, что вы не перевели его правильно в код python. В частности, что означает 'm' в' eq2() '? Вы создали 'm' последовательность с длиной' len (t) ', содержащую только значение 0.1, но комментарий говорит« случайная величина ». В каком смысле вы имеете в виду «случайный»? –
Оба уравнения полностью произвольны - я составил уравнения. Я просто хотел узнать, как реализовать ODEINT, когда одной из переменных является массив. Для exp. 'M' может быть синусоидальным сигналом, представляющим пульсирующий капиллярный кровоток, вместо массива, содержащего только значение 0,1. Я думаю, что я хотел сказать «произвольный сигнал» вместо «случайной величины» - я использовал неправильное слово. – bluetooth
* «Для exp.« M »может быть синусоидальным сигналом, представляющим пульсирующий капиллярный кровоток» * В этом случае 'm' должно быть функцией времени' t', а не массивом. Тогда ваш код в 'eq2' будет чем-то вроде' p = np.sqrt (y) + m (t) * y ** 2', и вы должны определить 'm (t)' (функцию, возвращающую скаляр) в другом месте. –