Python数学建模学习-莱斯利(Leslie)种群模型

2024-04-09 07:44

本文主要是介绍Python数学建模学习-莱斯利(Leslie)种群模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Leslie模型是一种用于离散时间的生物种群增长模型,经常用于描述年龄结构对种群增长的影响。在1945年,人口生态学家Patrick H. Leslie(莱斯利)为了研究具有离散年龄结构的种群,特别是对于有不同年龄阶段的生物,如昆虫、鱼类、鸟类等,提出了Leslie模型。

Leslie模型的基本思想是,将种群划分为不同年龄阶段(类别),然后根据不同年龄阶段的生存率和繁殖率来预测未来的种群变化。模型中的年龄结构是离散的,通常划分为几个年龄组。这个模型对于研究种群的年龄结构和生命周期变化非常有用。

模型建立

  • 在某动物种群中,仅考查雌性动物的年龄和数量;
  • 设雌性动物的最大生存年龄为L(单位:年);
  • \left [ 0,L \right ]等分为n个年龄组,每一年龄组的长度为L/n
  • n个年龄组分别为(从第1组到第n组)

  • 设第i个年龄组的生育率为a_i{_{}},存活率为b_i{_{}}(i=1,2,⋯,n),a_i{_{}}b_i{_{}}均为常数,且 

 a_i{_{}}\geqslant 0,0< b_i{}\leqslant 1(i=1,2,3,\cdot \cdot \cdot,n )

  • 设至少有一个a_i{_{}}>0 (1≤in);
  • 即至少有一个年龄组的雌性动物具有生育能力.
  • 由统计资料可获得基年(t=0)该种群在各年龄组的雌性动物数量.
  • x^{(0)_{}^{}}_i{} (i=1,2,⋯,n)为t=0时第i年龄组雌性动物的数量.
  • 初始时刻各年龄组种群数量分布向量

  • 若以年龄组的间隔\frac{L}{n}作为时间单位,记 

  • t_k{}时各年龄组种群数量分布向量 

  • 随着时间的变化,由于出生、死亡以及年龄的增长,该种群中每一个年龄组的雌性动物数量都将发生变化.
  • t_k{}时刻,种群中第1个年龄组的雌性动物数量应等于在t_k{}{}_-{}{}_1t_k{}之间出生的所有雌性幼体的总和,即

  • 同时,在t_k{}时刻,第i+1个年龄组(i=1,2,⋯,n-1)中雌性动物的数量应等于在t_k{}{}_-{}{}_1时刻第i个年龄组中雌性动物数量x_{i}^{(k-1)}乘存活率b_i{},即

  • 由式(2-3)可得在t_k{}t_k{}{}_-{}{}_1时刻各年龄组中雌性动物数量间的关系:

  • 记矩阵

  • 式(3)可写成

  • L莱斯利矩阵(Leslie).
  • 由式(5),可得

  •  一般地

  • 若已知初始时各年龄组种群数量分布向量x^{(0)},则可推算任一时刻t_k{}该种群数量分布向量.

    以上是相关理论介绍,下面举例说明

示例

  • 某种动物雌性的最大生存年龄为15年,
  • 以5年为一间隔,把这一动物种群分为3个年龄组[0,5),[5,10),[10,15],
  • 利用统计统计资料,已知生育率和存活率分别为:

  • 在初始时刻t=0时,3个年龄组的雌性动物个数分别为500,1000,500
  • 初始种群数量分布向量和莱斯利矩阵为:

  • 于是

  • 为了分析当k\rightarrow \infty时,该动物种群数量分布向量的特点,先求出矩阵L的特征值与特征向量.
  • 计算L的特征多项式

  • 由此可得L的特征值

  • \lambda _1{}是矩阵L的唯一正特征值,且

  • L有3个互异特征值,因此矩阵L可相似对角化.
  • 设矩阵L属于特征值\lambda _i{} (i=1,2,3)的特征向量为\alpha _i{}.
  • 计算L属于特征值\lambda _1{}=\frac{3}{2}的特征向量为

  • 记矩阵

  • 因此L^{k}=P\Lambda ^{k}P^{-1}.
  • 矩阵对角化可参考矩阵对角化(Diagonalizing a Matrix)-CSDN博客
  • 于是有:

  • 因为\left | \frac{_{\lambda _{2}}}{\lambda _{1}} \right |<1,\left | \frac{_{\lambda _{3}}}{\lambda _{1}} \right |<1,所以:

  • 记列向量P^{-1}X^{(0)}的第一个元素为 c(常数),则式(6)可化为

  •  当k充分大时,近似地成立

其中c=\frac{250}{19}.

  • 当时间充分长,这种动物中雌性的年龄分布将趋于稳定,即3个年龄组的数量比为18:6:1.
  • 可近似得到在t_{k}时刻种群中雌性动物的总量,从而对整个种群的总量进行估计.
  • 莱斯利模型在分析动物种群的年龄分布和总量增长方面有广泛应用,也可应用于人口增长的年龄分布问题.

【提示:以上涉及高数内容对很多伙伴包括我很困难,大家可以结合后面的编程内容,交互学习,能看懂算出结果比推导公式明白原理更重要】 

Python编程计算代码如下:

import numpy as np  # 导入NumPy库,并简化为np  
import sympy as sp  # 导入SymPy库,并简化为sp  # 定义初始向量X0  
X0 = np.array([500, 1000, 500])  # 定义矩阵L  
L = np.array([[0, 4, 3], [0.5, 0, 0], [0, 0.25, 0]])  # 矩阵乘法计算X1和X2  
X1 = L @ X0; X2 = L @ X1  # @表示矩阵乘法  
X3 = L @ X2  # 定义符号矩阵Ls  
Ls = sp.Matrix([[0, 4, 3], [sp.Rational(1,2), 0, 0],  [0, sp.Rational(1,4), 0]])  # 使用Rational来确保精确计算  # 定义符号变量lamda  
sp.var('lamda')  # 计算特征多项式  
p = Ls.charpoly(lamda)  # 计算特征根  
w1 = sp.roots(p)  # 直接计算特征值  
w2 = Ls.eigenvals()  # 直接计算特征向量  
v = Ls.eigenvects()  # 打印特征值和特征向量  
print("特征值为:", w2)  
print("特征向量为:\n", v)  # 相似对角化  
P, D = Ls.diagonalize()  # 求逆矩阵  
Pinv = P.inv()  # 简化逆矩阵  
Pinv = sp.simplify(Pinv)  # 将逆矩阵应用于初始向量X0  
cc = Pinv @ X0  # 打印变换矩阵P和变换后的系数c  
print('P=\n', P)  
print('c=', cc[0])

结果输出:

特征值为: {3/2: 1, -3/4 - sqrt(5)/4: 1, -3/4 + sqrt(5)/4: 1}
特征向量为:
 [(3/2, 1, [Matrix([
[18],
[ 6],
[ 1]])]), (-3/4 - sqrt(5)/4, 1, [Matrix([
[3*sqrt(5) + 7],
[ -3 - sqrt(5)],
[            1]])]), (-3/4 + sqrt(5)/4, 1, [Matrix([
[7 - 3*sqrt(5)],
[ -3 + sqrt(5)],
[            1]])])]
P=
 Matrix([[18, 3*sqrt(5) + 7, 7 - 3*sqrt(5)], [6, -3 - sqrt(5), -3 + sqrt(5)], [1, 1, 1]])
c= 2250/19

  • 如要计算第k=2个时期的种群数量,代码如下:
# 导入numpy库,用于数组操作
import numpy as np
# 导入sympy库,用于符号计算
import sympy as sp# 定义一个初始种群向量X0,包含三个年龄段的种群数量
X0 = np.array([500, 1000, 500])# 定义Leslie矩阵L,描述了不同年龄段种群的转化关系
L = np.array([[0, 4, 3], [0.5, 0, 0], [0, 0.25, 0]])# 计算第一年的种群向量X1,即L乘以初始种群向量X0
X1 = L @ X0
# 计算第二年的种群向量X2,即L乘以第一年的种群向量X1
X2 = L @ X1
# 计算第三年的种群向量X3,即L乘以第二年的种群向量X2
X3 = L @ X2# 定义符号矩阵Ls,这里使用了Rational来确保计算中的分数是精确的
Ls = sp.Matrix([[0, 4, 3], [sp.Rational(1, 2), 0, 0], [0, sp.Rational(1, 4), 0]])# 定义符号变量lamda,用于特征多项式的计算
lamda = sp.var('lamda')# 计算矩阵Ls的特征多项式
p = Ls.charpoly(lamda)# 注释掉了计算特征值和特征向量的代码,因为在后面有重新计算
# w11 = Ls.eigenvals()
# w22 = Ls.eigenvects()# 计算特征多项式的根,即特征值
w1 = sp.roots(p)# 直接计算矩阵Ls的特征值
w2 = Ls.eigenvals()# 直接计算矩阵Ls的特征向量
v = Ls.eigenvects()# 注释掉了打印特征值和特征向量的代码
# print("特征值", w2)
# print(w1)
# print('特征向量', v)# 对矩阵Ls进行相似对角化,得到变换矩阵P和对角矩阵D
P, D = Ls.diagonalize()# 计算变换矩阵P的逆矩阵
Pinv = P.inv()# 简化逆矩阵Pinv
Pinv = sp.simplify(Pinv)# 将逆矩阵Pinv应用于初始种群向量X0,得到变换后的系数cc
cc = Pinv @ X0# 注释掉了打印变换矩阵P和系数cc的代码
# print(P)
# print(cc[0])
# print(w1)
# print(v)# 定义符号变量k,表示时期数,且k为正整数
k = sp.var('k', positive=True, integer=True)# 计算第k个时期的种群数量,通过相似对角化后的形式进行计算
xk = P @ (D ** k) @ Pinv @ sp.Matrix(X0)# 注释掉了打印第k个时期种群数量和特定元素的代码
# print(xk)
# print(xk[0])# 简化第k个时期的种群数量表达式
s = sp.simplify(xk[0])# 将k替换为2,并计算数值结果,即第二个时期的种群数量
print(s.subs(k, 2).n())

结果输出【中间部分代码进行了注释,大家可以根据需要打开学习】:

1750.00000000000


参考文献

[1] 司守奎,孙兆亮. Python数学建模算法与应用. 北京:国防工业出版社,2022.


本文内容来源于《Python数学建模算法与应用》教材和网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。

这篇关于Python数学建模学习-莱斯利(Leslie)种群模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/887567

相关文章

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息