Lotka-Volterra方程:错误的解决方案

时间:2018-11-02 15:17:17

标签: python python-2.7 ode

我写了一段代码来在Python上使用四阶Runge-Kutta求解Lotka-Volterra方程,但是由于某种原因它不起作用,因此解决方案是完全错误的。老实说,我不知道我在做什么错。

import numpy
from pylab import plot, show


def rk(f, x, h):
    f_1 = f(x)
    f_2 = f(x+1./2*h*f_1)
    f_3 = f(x+1./2*h*f_2)
    f_4 = f(x+h*f_3)
    return x+1./6*h*(f_1+2*f_2+2*f_3+f_4)


def lv(x):
    alpha = 1.
    return numpy.array([alpha*x[0]-x[0]*x[1], x[0]*x[1]-x[1]], float)


a = 0.
b = 10.
m = 100
T = numpy.linspace(a, b, m)
H = (b-a)/m
X = numpy.zeros((m, 2))
X[0, :] = [1., 30.]

for i in range(1, m):
    X[i, :] = rk(lv, X[i-1, :], H)

plot(T, X)
show()

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

将积分间隔延长到100,并相应增加步骤数以观察溶液的周期性行为,我得到的周期约为34.6,具有相当小的峰。

enter image description here

从生态角度考虑,您有30个捕食者种群和1个捕食者种群,并且捕食能力明显。当然,猎物会迅速减少到接近零,然后捕食者也会饿死为零,并且从那以后,猎物种群会慢慢恢复,直到其指数增长触发捕食者呈指数增长,然后循环才重新开始。


请注意,时间离散化的步骤是(b-a)/(m-1),请对照T[1]-T[0]进行检查。要获得步长为m的{​​{1}}个间隔,您需要H=(b-a)/m并相应地增加x数组和积分循环。