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

news2024/11/25 10:49:32

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小时内删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1578938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙OS开发实战:【自动化测试框架】使用指南

概述 为支撑HarmonyOS操作系统的自动化测试活动开展&#xff0c;我们提供了支持JS/TS语言的单元及UI测试框架&#xff0c;支持开发者针对应用接口进行单元测试&#xff0c;并且可基于UI操作进行UI自动化脚本的编写。 本指南重点介绍自动化测试框架的主要功能&#xff0c;同时…

三行命令解决Ubuntu Linux联网问题

一开始我找到官方文档描述可以通过命令行连接到 WiFi 网络&#xff1a;https://cn.linux-console.net/?p10334#google_vignette 但是我的 $ ls /sys/class/net 命令无法显示无线网络接口&#xff0c;那么没有无线网卡&#xff1f; 所以我参照其他的博客在终端超级用户的权…

JUC:ScheduledThreadPoolExecutor 延迟任务线程池的使用

文章目录 ScheduledThreadPoolExecutortimer&#xff08;不建议用&#xff09;ScheduledThreadPoolExecutor处理异常应用 ScheduledThreadPoolExecutor timer&#xff08;不建议用&#xff09; timer也可以进行延迟运行&#xff0c;但是会有很多问题。 比如task1运行时间超过…

FOR循环

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 前面两种循环都要根据条件是否成立而确定循环体的执行&#xff0c;具体循环体执行多少次事先并不知道。 FOR 循环可以控制循环执行的次数&#xff0c;由循环变量控制循环体的…

学透Spring Boot — 005. 深入理解 Spring Boot Starter 依赖管理

前面的文章直观的展示了&#xff0c;使用Spring Boot 集成 Hibernate 和手动集成 Hibernate 之间差距。 一个比喻 工作中使用过Spring Boot一段时间后&#xff0c;我越来越感觉到Spring Boot Starter带来的便利性。 使用手动集成 Hibernate&#xff0c; 就像去电脑城配电脑&…

二叉树的遍历的递归与非递归算法

一.二叉树的遍历&#xff1a; 按照一定规律对二叉树的每个结点进行访问且仅访问一次&#xff1b; 这里的访问&#xff1a;可以是计算二叉树中的结点数据&#xff0c;打印该结点的信息&#xff0c;也可以是对结点进行的任何其它操作&#xff01; 为什么需要遍历二叉树&#x…

EditPlus来啦(免费使用!)

hello&#xff0c;我是小索奇 今天推荐一款编辑器&#xff0c;是索奇学习JavaSE时入手滴&#xff0c;非常好用哈&#xff0c;小索奇还是通过老杜-杜老师入手滴&#xff0c;相信很多人也是通过老杜认识嘞&#xff0c;来寻找破解版或者准备入手这个间接使用的编辑器~ EditPlus是…

在Ubuntu上搭建Prometheus + Grafana监控系统

1.Prometheus 部署 从官网下载页面找到最新的二进制文件下载 cd ~ curl -LO https://github.com/prometheus/prometheus/releases/download/v2.51.1/prometheus-2.51.1.linux-amd64.tar.gz将文件解压到指定目录 tar xf prometheus-2.51.1.linux-amd64.tar.gz -C /usr/local为…

⼿机客户端画K线图流程

优质博文&#xff1a;IT-BLOG-CN 一、什么是K线流程 K线图是一种用于展示金融市场价格走势的图表。它通常由四个关键价格点组成&#xff0c;即开盘价、收盘价、最高价和最低价。K线图的流程可以简单概括为以下几个步骤&#xff1a; 【1】收集数据&#xff1a; 首先&#xff0c…

Oracle 正则表达式

一、Oracle 正则表达式相关函数 (1) regexp_like &#xff1a;同 like 功能相似&#xff08;模糊 匹配&#xff09; (2) regexp_instr &#xff1a;同 instr 功能相似&#xff08;返回字符所在 下标&#xff09; (3) regexp_substr &#xff1a; 同 substr 功能相似&…

虚拟网络设备与Linux网络协议栈

在现代计算环境中&#xff0c;虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用&#x1f527;&#xff0c;特别是在容器化和虚拟化技术广泛应用的今天&#x1f310;。而Linux网络协议栈则是操作系统处理网络通信的核心&#x1f4bb;&#xff0c;它支持广泛的协…

点击上传文件

一、页面样式&#xff1a; &#xff08;1&#xff09;点击前&#xff1a; &#xff08;2&#xff09;点击后&#xff1a; 设计&#xff1a;①自定义elementPlus图标&#xff1b;②使用Tooltip实现鼠标悬浮按钮上出现文字提示&#xff1b;③上传与更换的切换样式&#xff1b;…

全栈开发医疗小程序 SpringBoot2.X + Vue + UniAPP 带源码

看到好多坛友都在求SpringBoot2.X Vue UniAPP&#xff0c;全栈开发医疗小程序 – 带源码课件&#xff0c;我看了一下&#xff0c;要么链接过期&#xff0c;要么课件有压缩密码。特意整理了一份分享给大家&#xff0c;个人认为还是比较全面的。希望对大家有所帮助&#xff01;…

云计算(五)—— OpenStack基础环境配置与API使用

OpenStack基础环境配置与API使用 项目实训一 【实训题目】 使用cURL命令获取实例列表 【实训目的】 理解OpenStack的身份认证和API请求流程。 【实训准备】 &#xff08;1&#xff09;复习OpenStack的认证与API请求流程的相关内容。 &#xff08;2&#xff09;熟悉cURL…

openGauss学习笔记-258 openGauss性能调优-使用Plan Hint进行调优-指定子查询不展开的Hint

文章目录 openGauss学习笔记-258 openGauss性能调优-使用Plan Hint进行调优-指定子查询不展开的Hint258.1 功能描述258.2 语法格式258.3 示例 openGauss学习笔记-258 openGauss性能调优-使用Plan Hint进行调优-指定子查询不展开的Hint 258.1 功能描述 数据库在对查询进行逻辑…

vulhub中Apache Solr Velocity 注入远程命令执行漏洞复现 (CVE-2019-17558)

Apache Solr 是一个开源的搜索服务器。 在其 5.0.0 到 8.3.1版本中&#xff0c;用户可以注入自定义模板&#xff0c;通过Velocity模板语言执行任意命令。 访问http://your-ip:8983即可查看到一个无需权限的Apache Solr服务。 1.默认情况下params.resource.loader.enabled配置…

OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理&#xff0c;该处理过程会对图像做高斯模糊化以保证图像在进行放大&#xff08;/缩小&#xff09;后尽可能保留源图像所展现的具体内容&#xff08;消除固定频率插值/采样带来的香农采样信息损失&#xff09;&#x…

7款公司电脑监控软件

7款公司电脑监控软件 研究证明&#xff0c;人们在家办公的效率比在办公室办公的效率低一半&#xff0c;其中原因是缺少监督&#xff0c;即便在公司办公&#xff0c;还存在员工偷闲的时刻&#xff0c;比如聊天、浏览无关网站、看剧、炒股等&#xff0c;企业想提高员工的工作效率…

GFS分布式 文件系统

一、GFS的概念 文件存储分为nfs、lvm、raid 对象存储分为GFS、CEPH、fastDFS&#xff08;分布式文件存储&#xff09;NAS OSS S3 switch OSS 属于阿里云 通过URL 链接 S3属于亚马逊通过URL链接 1.1 GFS简介 开源的分布式文件系统&#xff0c;由存储服务器、客户端…

工地安全监测识别摄像机

工地安全监测识别摄像机是一种在建筑工地和施工现场广泛使用的智能监控设备&#xff0c;主要用于监测施工过程中可能出现的安全隐患和违规行为&#xff0c;以确保工地人员和设备的安全。通过高清摄像头、智能算法和远程监控系统的结合&#xff0c;该摄像机可以实时监测工地各个…