在 Python 上求解 Lotka-Volterra 方程

计算科学 Python
2021-12-12 02:19:36

我正在尝试使用 Python 绘制 Lotka-Volterra 方程。当谈到 Python 时,我是一个真正的初学者。我有这两个方程:

dRdt=αRγRF
dFdt=βF+δRF
我还把这些方程改写成一个迭代公式:
R(t+Δt)=αR(t)ΔtγR(t)F(t)Δt+R(t)
F(t+Δt)=βF(t)Δt+δR(t)F(t)Δt+F(t)
我是否可以假设我可以使用这种方法来解决这个问题?如何在 python 中实现它并使用 matplotlib 绘制它?

我想使用欧拉方法,但我正在努力将迭代方程编码到 Python 中。在此先感谢您,请尝试以新手级别的方式解释任何 Python 内容。

1个回答

您要问的主要有两个问题:

  1. 我可以使用显式欧拉时间步进方法解决 Lotka-Volterra 问题吗?答:可能,但您需要采取非常小的时间步骤。它是非线性的,有时会根据参数表现出混乱的行为。所以选择Δt会很重要。我可能会使用其他时间步进器,尤其是隐式和自适应的,但我想这要么是一项任务,要么是你试图教给自己一些东西。所以我会招待你的下一个问题。

  2. 如何在 python 中实现它并绘制它?回答:

我建议你使用像 numpy 这样的东西来简化实现。这是一个python代码

import numpy as np
import matplotlib.pyplot as plt

def LotkaVolterra_EEuler(R0, F0, alpha, beta, gamma, delta, t):
# Solves Lotka-Volterra equations for one prey and one predator species using
# explicit Euler method.
#
#  R0 and F0 are inputs and are the initial populations of each species
#  alpha, beta, gamma, delta are inputs and problem parameters
#  t is an input and 1D NumPy array of t values where we approximate y values. 
#    Time step at each iteration is given by t[n+1] - t[n].

 R = np.zeros(len(t)) # Pre-allocate the memory for R
 F = np.zeros(len(t)) # Pre-allocate the memory for F

 R[0] = R0
 F[0] = F0

 for n in range(0,len(t)-1):
  dt = t[n+1] - t[n]
  R[n+1] = R[n]*(1 + alpha*dt - gamma*dt*F[n])
  F[n+1] = F[n]*(1 - beta*dt + delta*dt*R[n])
 return R,F
 
def main():
 # Main driver to organize the code better
 t = np.linspace(0,40,3201) # interval [0,40] with 3201 equispaced points
                            # as you increase the number of points the
                            # solution becomes more similar to the 
                            # reference solution on wikipedia

 # You should set the parameters below as in your problem
 # I am using the Baboon-Cheetah example from wikipedia
 alpha, beta, gamma, delta = 1.1,0.4,0.4,0.1
 R0, F0 = 10, 10

 # Actually solve the problem
 R, F = LotkaVolterra_EEuler(R0, F0, alpha, beta, gamma, delta, t)

 # Plot the solution
 plt.plot(t,R,'b.-',t,F,'r-')
 plt.legend(['Baboon','Cheetah'])
 plt.grid(True)
 plt.title("Solution of Lotka-Volterra system using explicit Euler") 
 plt.show()

main() # Call the driver to get the results

这段代码可以改进很多。例如,它只解决 Lotka-Volterra,但显式 Euler 求解器可以推广到解决其他问题。假设会有一对捕食者和猎物,但并非必须如此。我会把剩下的留给你。您可以提出更多问题,我会尽力提供帮助,但我认为这应该是一个好的开始。