Я пытаюсь реализовать метод runge-kutta для решения системы Lotka-Volterra, но код (ниже) работает неправильно. Я следовал рекомендациям, которые я нашел в других темах StackOverflow, но результаты не сходятся со встроенным методом Runge-Kutta, например, с использованием метода rk4, доступного в Pylab. Кто-то может мне помочь?Код Рунге-Кутта не сходится со встроенным методом
import matplotlib.pyplot as plt
import numpy as np
from pylab import *
def meurk4(f, x0, t):
n = len(t)
x = np.array([ x0 ] * n)
for i in range(n - 1):
h = t[i+1] - t[i]
k1 = h * f(x[i], t[i])
k2 = h * f(x[i] + 0.5 * h * k1, t[i] + 0.5 * h)
k3 = h * f(x[i] + 0.5 * h * k2, t[i] + 0.5 * h)
k4 = h * f(x[i] + h * k3, t[i] + h)
x[i+1] = x[i] + (k1 + 2 * (k2 + k3) + k4) * 6**-1
return x
def model(state,t):
x,y = state
a = 0.8
b = 0.02
c = 0.2
d = 0.004
k = 600
return np.array([ x*(a*(1-x*k**-1)-b*y) , -y*(c - d*x) ]) # corresponds to [dx/dt, dy/dt]
# initial conditions for the system
x0 = 500
y0 = 200
# vector of time
t = np.linspace(0, 50, 100)
result = meurk4(model, [x0,y0], t)
print result
plt.plot(t,result)
plt.xlabel('Time')
plt.ylabel('Population Size')
plt.legend(('x (prey)','y (predator)'))
plt.title('Lotka-Volterra Model')
plt.show()
Я просто обновил код следующие замечания. Таким образом, функция meurk4
:
def meurk4(f, x0, t):
n = len(t)
x = np.array([ x0 ] * n)
for i in range(n - 1):
h = t[i+1] - t[i]
k1 = h * f(x[i], t[i])
k2 = h * f(x[i] + 0.5 * h * k1, t[i] + 0.5 * h)
k3 = h * f(x[i] + 0.5 * h * k2, t[i] + 0.5 * h)
k4 = h * f(x[i] + h * k3, t[i] + h)
x[i+1] = x[i] + (k1 + 2 * (k2 + k3) + k4) * 6**-1
return x
теперь становится (исправлено):
def meurk4(f, x0, t):
n = len(t)
x = np.array([ x0 ] * n)
for i in range(n - 1):
h = t[i+1] - t[i]
k1 = f(x[i], t[i])
k2 = f(x[i] + 0.5 * h * k1, t[i] + 0.5 * h)
k3 = f(x[i] + 0.5 * h * k2, t[i] + 0.5 * h)
k4 = f(x[i] + h * k3, t[i] + h)
x[i+1] = x[i] + (k1 + 2 * (k2 + k3) + k4) * (h/6)
return x
Тем не менее, результаты заключается в следующем:
В то время как метод buitin RK4 (от Pylab):
Так что, конечно, мой код по-прежнему неверен, поскольку его результаты не совпадают с встроенным методом rk4. Пожалуйста, кто-нибудь может мне помочь?
с этой модификацией, вариант 1, вам необходимо изменить коэффициент в 'x [i + 1]' to '(h/6)'. – LutzL
Вы правы, моя ошибка. Тем не менее, я только что реализовал это и все еще не согласен с методом встроенного Pylab. – user3369932
Вы абсолютно уверены, что константы и начальные значения одинаковы? – LutzL