Как я могу отредактировать свой код Runge Kutta 4-го порядка для оценки ODE 2-го порядка?

#python #runge-kutta

#python #рунге-кутта

Вопрос:

Вопрос Python:

У меня есть следующий код RK-4, который оценивает мой ode первого порядка, но я хочу отредактировать его так, чтобы он мог оценивать следующий ode 2-го порядка как систему ODE первого порядка: (d ^ 2y / dt ^ 2) 4 (dy / dt) 2y = 0. Я хотел бы сохранить h (размер шага тот же), а начальные условия были бы y (0) = 1 и y'(0) = 3.

Я очень новичок в python, поэтому мне трудно это делать. Заранее благодарю вас за любую помощь!

 import matplotlib.pyplot as plt 

def dydx(x, y): 
    return ((x - y)/2)

def rungeKutta(x0, y0, x, h): 
   
  n = (int)((x - x0)/h)  
  
  y = y0 
  for i in range(1, n   1): 
 
    k1 = h * dydx(x0, y) 
    k2 = h * dydx(x0   0.5 * h, y   0.5 * k1) 
    k3 = h * dydx(x0   0.5 * h, y   0.5 * k2) 
    k4 = h * dydx(x0   h, y   k3) 
    
    y = y   (1.0 / 6.0)*(k1   2 * k2   2 * k3   k4)   
    x0 = x0   h 

  return y 
  
x0 = 0
y = 1
x = 2
h = 0.2

print ('The value of y at x is:', rungeKutta(x0, y, x, h))
  

Ответ №1:

Единственное изменение, которое необходимо, — это сделать состояние векторным объектом. В python это обычно массив numpy. Итак

 y0 = np.array([1,3],dtype=float)
def dydx(x, y): 
    return np.array([y[1], -4*y[1]-2*y[0]])
  

Все остальное должно автоматически использовать соответствующие векторные операции.