система ОДУ в матричном виде

#numpy #ode #differential-equations

Вопрос:

Я пытаюсь понять, как решить и построить систему dx/dt = Ax для матрицы 2×2 A. Я действительно не знаю, как это сделать. Код, который у меня сейчас есть, выглядит следующим образом:

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

def sys(x, t, A):
    x1, x2 = x    
    return [A @ x]

A = np.array([[1, 2], [3, 4]])


x0 = np.array([[1], [2]])

t = np.linspace(0, 100, 10000)

sol = odeint(sys, x0, t, A)

ax = plt.axes()
ax.plot(t, sol)
plt.show()
 

Сообщение об ошибке выглядит так:

 output = _odepack.odeint(func, y0, t, args, Dfun, col_deriv, ml, mu,
odepack.error: Extra arguments must be in a tuple.
 

Мы были бы очень признательны за помощь в том, как заставить этот код работать правильно. Пожалуйста, обратите внимание, что я очень новичок в кодировании, не говоря уже о кодировании дифференциальных уравнений.
Огромное спасибо.

Ответ №1:

Вы должны передать другие аргументы в кортеже. Что-то вроде этого:

 sol = odeint(sys, x0, t, args=(A,))
 

Смотрите документацию по scipy.integrate.odeint.

Комментарии:

1. Спасибо. При реализации вашего предложения дополнительная ошибка, указывающая, что начальное условие, переданное в функцию sys, должно быть одномерным. После некоторых исследований я обнаружил, что могу изменить свою функцию на def sys(x, t, A): x1, x2 = x dxdt = A @ x.reshape(2, 1) возвращает np.squeeze(np.asarray(dxdt)), который, казалось, работал просто отлично.

2. Рад быть вам полезным!

3. Обеспечение правильной args и x правильной формы-это две наиболее распространенные проблемы с использованием scipy подобных функций. Пристальное внимание к документам очень важно,