Любой способ решить систему связанных дифференциальных уравнений в питоне?
Я работал с sympy и scipy, но не могу найти или выяснить, как решить систему связанных дифференциальных уравнений (нелинейных, первого порядка).
Итак, есть ли способ решить связанные дифференциальные уравнения?
Уравнения имеют вид:
V11'(s) = -12*v12(s)**2
v22'(s) = 12*v12(s)**2
v12'(s) = 6*v11(s)*v12(s) - 6*v12(s)*v22(s) - 36*v12(s)
с начальными условиями для v11 (s), v22 (s), v12 (s).
Ответы
Ответ 1
Для численного решения ODE с помощью scipy см. scipy.integrate.solve_ivp
, scipy.integrate.odeint
или scipy.integrate.ode.
Некоторые примеры приведены в Поваренной книге SciPy (прокрутите вниз до раздела "Обыкновенные дифференциальные уравнения").
Ответ 2
В дополнение к SciPy методов odeint
и ode
, которые уже были упомянуты, теперь он имеет solve_ivp
который новее и часто более удобно. Полный пример кодирования [v11, v22, v12]
в виде массива v
:
from scipy.integrate import solve_ivp
def rhs(s, v):
return [-12*v[2]**2, 12*v[2]**2, 6*v[0]*v[2] - 6*v[2]*v[1] - 36*v[2]]
res = solve_ivp(rhs, (0, 0.1), [2, 3, 4])
Это решает систему на интервале (0, 0.1)
с начальным значением [2, 3, 4]
. Результат имеет независимую переменную (s в вашей записи) как res.t
:
array([ 0. , 0.01410735, 0.03114023, 0.04650042, 0.06204205,
0.07758368, 0.0931253 , 0.1 ])
Эти значения были выбраны автоматически. Можно предоставить t_eval
для оценки решения в нужных точках: например, t_eval=np.linspace(0, 0.1)
.
Зависимая переменная (функция, которую мы ищем) находится в res.y
:
array([[ 2. , 0.54560138, 0.2400736 , 0.20555144, 0.2006393 ,
0.19995753, 0.1998629 , 0.1998538 ],
[ 3. , 4.45439862, 4.7599264 , 4.79444856, 4.7993607 ,
4.80004247, 4.8001371 , 4.8001462 ],
[ 4. , 1.89500744, 0.65818761, 0.24868116, 0.09268216,
0.0345318 , 0.01286543, 0.00830872]])
С Matplotlib это решение строится как plt.plot(res.t, res.yT)
(график был бы более плавным, если бы я t_eval
как упомянуто).
![plot of solution]()
Наконец, если бы система включала уравнения порядка выше 1, нужно было бы использовать редукцию к системе 1-го порядка.