如何用obeint库求解23年美赛A题基础模型

本文介绍了如何使用Python的`scipy.integrate.solve_ivp`函数求解生物学竞赛中的人口理论模型(LogisticGrowthModel)和两个物种间的竞争模型的微分方程。通过实例展示了如何编写和绘制这些模型的函数图像。
摘要由CSDN通过智能技术生成

在这里我们求解的是23年美赛的A题中的两个基本模型为例子,用obeint函数来求解改题里面的的微分方程和偏微分方程。在这一年的美赛里面的最基本的模型是人口理论模型:
d N d t = r ∗ N ∗ ( 1 − N K ) \frac{dN}{dt} = r*N*(1-\frac{N}{K}) \\ dtdN=rN(1KN)
N N N表示人口数量, t t t表示时间, K K K表示物种的环境容纳量。我们尝试用python求解这个微分方程,并且画出函数图像。代码如下:

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

# 定义微分方程
def logistic_growth(t, N, r, K):
    return r * N * (1 - N / K)

# 参数
r = 0.1  # 固有增长率
K = 100  # 环境承载量
N0 = 10  # 初始种群大小

# 时间跨度
t_span = (0, 100)
t_eval = np.linspace(*t_span, 1000)

# 解微分方程
sol = solve_ivp(logistic_growth, t_span, [N0], args=(r, K), t_eval=t_eval)

# 绘图
plt.plot(sol.t, sol.y[0], label=f'Logistic Growth\nr={r}, K={K}, N0={N0}')
plt.xlabel('Time')
plt.ylabel('Population Size')
plt.legend()
plt.title('Logistic Growth Model')
plt.show()

最后画出来的函数图像如下图:
在这里插入图片描述

​当考虑到两个物种的情况时,模型公式如下:
d N 1 d t = r 1 ∗ N 1 ∗ ( 1 − N 1 K 1 − δ 12 N 2 K 2 ) d N 2 d t = r 2 ∗ N 2 ∗ ( 1 − N 2 K 2 − δ 21 N 1 K 1 ) \frac{dN_1}{dt} = r_1*N_1*(1-\frac{N_1}{K_1}-\delta_{12}\frac{N_2}{K_2}) \\ \frac{dN_2}{dt} = r_2*N_2*(1-\frac{N_2}{K_2}-\delta_{21}\frac{N_1}{K_1}) \\ dtdN1=r1N1(1K1N1δ12K2N2)dtdN2=r2N2(1K2N2δ21K1N1)
N 1 , N 2 N_1,N_2 N1N2:表示物种的种群数量
K 1 , K 2 K_1,K_2 K1K2:物种的环境容纳量
r 1 , r 2 r_1,r_2 r1r2:物种的种群增长率s
求解的代码如下:

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

# 定义微分方程组
def competition_model(t, N, params):
    N1, N2 = N
    r1, K1, delta12, r2, K2, delta21 = params
    dN1dt = r1 * N1 * (1 - N1 / K1 - delta12 * N2 / K2)
    dN2dt = r2 * N2 * (1 - N2 / K2 - delta21 * N1 / K1)
    return [dN1dt, dN2dt]

# 参数
r1, K1, delta12 = 0.1, 100, 0.02  # 物种1的参数
r2, K2, delta21 = 0.1, 90, 0.02  # 物种2的参数
params = (r1, K1, delta12, r2, K2, delta21)
N0 = [10, 10]  # 初始种群大小

# 时间跨度
t_span = (0, 300)
t_eval = np.linspace(*t_span, 300)

# 解微分方程组
sol = solve_ivp(competition_model, t_span, N0, args=(params,), t_eval=t_eval, method='RK45')

# 绘图
plt.plot(sol.t, sol.y[0], label='Species 1')
plt.plot(sol.t, sol.y[1], label='Species 2')
plt.xlabel('Time')
plt.ylabel('Population Size')
plt.legend()
plt.title('Two-Species Competition Model')
plt.show()

画出来的函数图像为:
在这里插入图片描述

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值