在 Python 中求解和绘制互惠模型

计算科学 Python 数值建模
2021-12-12 00:54:41

我是编程初学者。我需要在 python 中编写两个物种的共生模型,该模型将使用以下方程求解和绘制图形:

dN1dt=N1(r1e1N1+α12N2)
dN2dt=N2(r1e1N2+α21N1)

N1是物种 1 的种群。的值是物种 1 对物种 2 的影响(反之亦然),并且会在 0-2 之间变化。同时,具有固定值。α12r1r2e1e2

我尝试编写与 Lotka-Volterra 模型类似的代码,但没有成功。

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# parameters
r1 = 1.0  #fixed
r2 = 0.5  #fixed
e1 = 1.0  #fixed
e2 = 0.75 #fixed

alpha12 = 1.5 #vary from 0-2
alpha21 = 1 #vary from 0-2

N1_0 = 1
N2_0 = 1

# store initial values in an array
X0 = [N1_0,N2_0]

# The two equations are contained in dX
def mutualism(X,t):
  N1, N2 = X
  dX = np.zeros(2)
  dX[0] = N1 * (r1 - (e1 * N1) + (alpha12 * N2)) # equation for dN1/dt
  dX[1] = N2 * (r2 - (e2 * N2) + (alpha21 * N1)) # equation for dN2/dt
  return dX

# set time length
t = np.linspace(0,100,300)

X = odeint(mutualism,X0,t)

N1 = X[:,0]; N2 = X[:,1]

plt.plot(t,N1, color='blue', lw=3)
plt.plot(t,N2, color='red', lw=3)
plt.show()

谁能告诉我我做错了什么以及如何改进代码?

1个回答

查看 scipy 上的文档,他们建议使用scipy.integrate.solve_ivp而不是scipy.integrate.odeint 在这里看到的。

因此我改变了功能并重新安排了一点。

import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# parameters
r1 = 1.0  #fixed
r2 = 0.5  #fixed
e1 = 1.0  #fixed
e2 = 0.75 #fixed

alpha12 = 1.5 #vary from 0-2
alpha21 = 1 #vary from 0-2

N1_0 = 1
N2_0 = 1

# store initial values in an array
X0 = [N1_0,N2_0]

# The two equations are contained in dX
def mutualism(t,X):
  N1, N2 = X
  dX = np.zeros(2)
  dX[0] = N1 * (r1 - (e1 * N1) + (alpha12 * N2)) # equation for dN1/dt
  dX[1] = N2 * (r2 - (e2 * N2) + (alpha21 * N1)) # equation for dN2/dt
  return dX

# set time length
t = np.linspace(0,1.6,100)

X = solve_ivp(mutualism,t[[0,-1]],X0,t_eval=t)

N1 = X.y[0]
N2 = X.y[1]
t_fin = X.t

plt.plot(t_fin,N1, color='blue', lw=3)
plt.plot(t_fin,N2, color='red', lw=3)
plt.show()

这给了我以下情节。(不确定这是否是您想要的,因为我并不真正了解共生模型。

在此处输入图像描述

如评论中所述,我们在 t~=1.5 处获得了一个趋于无穷大的奇点。因此,代码仅略高于该值。