我正在尝试使用 Lotka-Volterra 方程编写一个程序来进行捕食者与猎物的相互作用。使用 ODE 求解:
dx/dt = a*x - B*x*y
dy/dt = g*x*y - s*y
使用四阶龙格-库塔法
我需要绘制一个图表,显示 x 和 y 作为从 t = 0 到 t=30 的时间的函数。
a = alpha = 1
b = beta = 0.5
g = gamma = 0.5
s = sigma = 2
初始条件 x = y = 2
到目前为止,这是我的代码,但未在图表上显示任何内容。一些帮助会很好。
#!/usr/bin/env python
from __future__ import division, print_function
import matplotlib.pyplot as plt
import numpy as np
def rk4(f, r, t, h):
""" Runge-Kutta 4 method """
k1 = h*f(r, t)
k2 = h*f(r+0.5*k1, t+0.5*h)
k3 = h*f(r+0.5*k2, t+0.5*h)
k4 = h*f(r+k3, t+h)
return (k1 + 2*k2 + 2*k3 + k4)/6
def f(r, t):
alpha = 1.0
beta = 0.5
gamma = 0.5
sigma = 2.0
x, y = r[2], r[2]
fxd = x*(alpha - beta*y)
fyd = -y*(gamma - sigma*x)
return np.array([fxd, fyd], float)
tpoints = np.linspace(0, 30, 0.1)
xpoints = []
ypoints = []
r = np.array([2, 2], float)
for t in tpoints:
xpoints += [r[2]]
ypoints += [r[2]]
r += rk4(f, r, t, h)
plt.plot(tpoints, xpoints)
plt.plot(tpoints, ypoints)
plt.xlabel("Time")
plt.ylabel("Population")
plt.title("Lotka-Volterra Model")
plt.savefig("Lotka_Volterra.png")
plt.show()