Python оценивает ODE второго порядка с помощью RK4

Ниже вставлен мой код на Python. Это метод Рунге-Кутты 4-го порядка, который оценивает ОДУ 2-го порядка: y '' + 4y '+ 2y = 0 с начальными условиями y (0) = 1, y' (0) = 3.

Мне нужна помощь, чтобы это исправить. Когда я запускаю свой код, мое аналитическое решение не соответствует моему численному решению, мой профессор сказал, что они должны быть такими же. Я пробовал отредактировать эту кучу и, похоже, не могу понять, что не так. Спасибо!

    import numpy as np
    import matplotlib.pyplot as plt

    def ode(y):
        return np.array([y[1],(-2*y[0]-4*y[1])])

    tStart=0

    tEnd=5

    h=.1

    t=np.arange(tStart,tEnd+h,h)

    y=np.zeros((len(t),2))

    y[0,:]=[1,3]

    for i in range(1,len(t)):
        k1=ode(y[i-1,:])
        k2=ode(y[i-1,:]+h*k1/2)
        k3=ode(y[i-1,:]+h*k2/2)
        k4=ode(y[i-1,:]+h*k3)
    
    y[i,:]=y[i-1,:]+(h/6)*(k1+2*k3+2*k3+k4)

    plt.plot(t,y[:,0])
    plt.plot(t,1-t)
    plt.grid()
    plt.gca().legend(('y(t)',"y'(t)"))
    plt.show()

person J Wright    schedule 25.10.2020    source источник
comment
Это, вероятно, лучше подошло бы для Computational Science SE.   -  person Tyberius    schedule 26.10.2020
comment
y[i,:]=y[i-1,:]+(h/6)*(k1+2*k3+2*k3+k4) должен быть частью цикла.   -  person Peter Meisrimel    schedule 26.10.2020


Ответы (1)


Я предполагаю, что отступ в коде, который вы запускаете, правильный, иначе численное решение выглядело бы совершенно неверно. Поэтому я предполагаю, что ваше точное решение неверно, или точное решение относится к другому уравнению, чем числовой код.

С характеристическим полиномом q^2+4q+2=(q+2)^2-2=0 точное решение есть

y(t)=exp(-2t)*(A*cosh(sqrt(2)*t)+B*sinh(sqrt(2)*t))

По начальным условиям A=1 и -2*A+sqrt(2)*B=3

Исправление отступа временной петли RK4 и добавление точного решения дает график

введите описание изображения здесь

person Lutz Lehmann    schedule 26.10.2020