【问题标题】:Lotka-Volterra equations: wrong solutionLotka-Volterra 方程:错误解
【发布时间】:2018-11-02 15:17:17
【问题描述】:

我在 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()

非常感谢您的帮助。

【问题讨论】:

标签: python python-2.7 ode


【解决方案1】:

将积分间隔扩大到 100 并相应地增加步数以观察解的周期性行为,我得到的周期约为 34.6,峰值相当小。

从生态的角度考虑,捕食者数量为 30,猎物数量为 1,具有明显的捕食性。当然,猎物迅速减少到接近零,然后捕食者也饿到零,然后猎物种群慢慢恢复,直到其指数增长触发捕食者指数增长,循环重新开始。


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

【讨论】:

  • 我也得到了奇怪的结果,间隔扩大到 10 并且猎物数量不同,所以我怀疑我的解决方案是否正确。甚至没有想过简单地给它更多的时间。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2023-03-13
  • 2019-07-05
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多