数学生物学-1-指数增长与衰退(Exponential Growth and Decay)

news2024/11/27 18:38:56

我们注意到数学专业的学生往往没有生物学系统的思维,而生物专业的学生则常常对数学感到恐惧。许多生物专业的学生可能一直对科学感兴趣,部分原因是他们认为生物学是一个不需要任何数学技能或背景就可以研究的科学领域。我认为这是不对的思维。

虽然大多数生物学本科课程中可能包含统计学,但通常不包括微积分及以上的数学内容。我们认为,生物学教育中普遍存在的情况至少在一定程度上忽视了数学。因此,学生在研究生阶段以及学术或其他研究工作中学到的数学知识很少。

因此,本专栏的目标是以一种不会让生物学本科生过度恐惧的方式,介绍这个跨学科领域,并强调通过应用基于数学的方法可以了解生物学系统的内容。

本专栏参考An Invitation to Mathematical Biology


目录

1.简介

2.指数增长与衰退

(1)指数增长

[1]例一:理想指数增长模型

[2]例2:承载能力模拟模型

(2)指数衰退

[1]例1:理想指数衰减模型

[2]感染康复模型


1.简介

用数学去解释生物问题往往可以从宏观的和整体角度解决,可以有解析解与数值解解法,在计算生物学中,我们通常开发新算法然后应用到计算机软件中,对一些问题的数值解进行计算,快速浏览几本数学生物学期刊,你会发现研究论文通常以计算方法为主。

数学与生物学之间加强联系的重要性在NSF赞助的题为“数学与生物学:接口、挑战与机遇”的研讨会上得到了清晰的阐述,作者们描述了数学有可能像牛顿微积分对物理学那样彻底改变生物学(Levin 1992)。这种互动将使双方受益:正如过去动力学系统和混沌理论在很大程度上是为了解决生物问题而发展起来的一样,这种互动也将丰富数学。

2.指数增长与衰退

许多物理现象遵循(近似)指数增长或指数衰减的规律,显然生物现象也不例外,正如我们接下来将要看到的。这种增长和衰减情况的典型例子相当精确,如细菌生长、传染病康复和放射性衰减

(1)指数增长

[1]例一:理想指数增长模型

在合适营养环境中,细菌在一定的时间间隔Δt内体积会增加。假设我们在培养基中放置了60个大肠杆菌细胞,每个细胞每20分钟分裂成两个。那么在第一个20分钟后,就有120个细胞,再过20分钟就有240个细胞,然后在60分钟后有480个细胞,依此类推,只要培养基中有食物供应,细胞数量就会持续翻倍。如果在180分钟内(即9个20分钟的时间段),培养基中的食物充足,那么最终会有60×2^9=30,720个细胞。

如果说时间趋向∞,那么细胞数目也就会趋向∞,这时我们考虑到培养基营养不是无限的及细胞寿命不是无限的,因此会有衰减的情况,这样想是对的,但是我更偏向于模型是一步一步完善的,我们先考虑最简单的模型。

这种增长模式可以用离散时间方程来表示,即:

N_{t+1} = N_{t}+kN_{t}

为了计算每分钟的增长率,我们需要将20分钟内的翻倍效应转换为每分钟的增长率:

k = 2^{\frac{1}{20}}-1

具体来说,2^{1/20} 表示每分钟的增长因子,它告诉我们每分钟细胞数量相对于前一分钟增加了多少。然后,我们从这个增长因子中减去1,得到的实际增长率 k 就是每分钟细胞数量相对于前一分钟的净增长比例。

我们通过python可视化看一下:

import matplotlib.pyplot as plt

# 定义初始细胞数量和时间间隔(分钟)
N0 = 60
interval = 20

# 定义时间点(分钟)
time_points = [i*interval for i in range(10)]  # 从0到180分钟,每20分钟一个点

# 计算每个时间点的细胞数量(指数增长)
cell_counts = [N0 * 2**(i/interval) for i in time_points]

# 创建图表
plt.figure(figsize=(10, 6))
plt.plot(time_points, cell_counts, marker='o', linestyle='-')

# 添加标题和标签
plt.title('Escherichia coli Cell Growth Over Time (Exponential)')
plt.xlabel('Time (min)')
plt.ylabel('Number of Cells')

# 显示网格
plt.grid(True)

# 显示图表
plt.show()

这个例子中,如果时间低于一个小时,那还是比较可信的,但是如果用于估计长时间的问题就变得离谱了。

[2]例2:承载能力模拟模型

前面的指数增长例子似乎表明细胞数量会无限增加。然而,我们可以想象,对于许多实际的生物种群,存在许多限制因素阻止了无限制的增长。在这里,我们将考虑在实验室条件下生长的细菌种群。数据由内华达大学拉斯维加斯分校化学与生物化学系的Ernesto Abel-Santos提供。实验测量了某种培养基中炭疽杆菌在不同小时数的生长情况。从表中可以看出,最初有一个快速增长(如上面例子所示),但在大约10小时后,增长放缓,最终趋于平稳,接近所谓的培养基的“承载能力”。这种模式有时被称为S曲线或逻辑曲线

我们可以用一条遵循逻辑函数的曲线来拟合这组数据。在这种情况下,我们使用一个函数,该函数最小化了数据点和拟合曲线之间的误差,这种方法被称为非线性最小二乘法。拟合曲线似乎合理地近似了实际观测到的数据。曲线拟合过程还为我们提供了两个重要参数的估计:一个增长率和一个承载能力。我们通过R语言进行拟合,分别使用二次多项式拟合和非线性最小二乘法拟合

# 准备数据
time <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
population <- c(0.0031, 0.0046, 0.0094, 0.0218, 0.0469, 0.0759, 0.0989, 0.1172, 0.1310, 0.1407, 0.1481, 0.1532, 0.1551, 0.1575, 0.1580, 0.1590)

# 使用多项式回归进行拟合,这里以二次多项式为例
fit <- lm(population ~ poly(time, 2), data = data.frame(time, population))

# 打印模型的系数
coefficients(fit)

# 绘制原始数据和拟合曲线
plot(time, population, type = "b", col = "blue", main = "Population Size Over Time")
lines(time, fitted(fit), col = "red", lwd = 2)
legend("topright", legend = c("Observed", "Fitted"), col = c("blue", "red"), lty = 1)

# 使用nls()函数进行非线性最小二乘拟合
# 假设初始参数K=0.16, r=0.5, t0=5
model <- nls(population ~ K / (1 + exp(-r * (time - t0))), 
             start = list(K = 0.16, r = 0.5, t0 = 5))

# 查看拟合结果
summary(model)

# 获取拟合参数
params <- coef(model)
K_fit <- params['K']
r_fit <- params['r']
t0_fit <- params['t0']

# 绘制原始数据和拟合曲线
plot(time, population, type = "b", col = "blue", main = "Population Size Over Time")
curve(K_fit / (1 + exp(-r_fit * (x - t0_fit))), add = TRUE, col = "red", lwd = 2)
legend("topleft", legend = c("Observed", "Fitted"), col = c("blue", "red"), lty = 1)

这是二次多项式拟合的结果,其实还能接受,但是不准确,我们看看非线性最小二乘拟合:

这个是已知结果去求方程,也就是数值拟合!这对于我们理解表观数据很有用,另外,我们可以先定义模型,然后用模型求解,看是否符合数据,这是数值模拟的思维,我们用python实现:

我们关注到这是一个logistics模型:

# 导入所需的库
import numpy as np  # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于绘图

# 定义模型参数
r = 4.41708  # 增长率
K = 0.15618  # 环境承载量
steps = 15  # 模拟的步数

# 初始化种群比例和环境承载量比例的数组
p = np.zeros(steps+1)  # 种群比例数组,多出一个元素用于存储最终结果
n = np.zeros(steps+1)  # 环境承载量比例数组,同上
p[0] = 0.0031  # 初始种群比例
n[0] = 0.0  # 初始环境承载量比例

# 进行模拟
for i in range(0, steps):
    p[i+1] = p[i] + r*p[i]*(K- p[i])  # 根据离散逻辑斯蒂模型更新种群比例
    n[i+1] = n[i] + 1.0  # 更新时间步

# 打印模拟数据
print(np.transpose([n,p]))  # 打印时间和种群比例的转置矩阵

# 绘制结果图表
plt.plot(n,p, 'b.', fillstyle='full')  # 绘制时间与种群比例的图表,点以蓝色填充
plt.xlabel('Time')  # 设置横轴标签为“Time”(时间)
plt.ylabel('p')  # 设置纵轴标签为“p”(种群比例)
plt.show()  # 显示图表

回顾之前的表格和图表,我们可以注意到承载能力的值,通过曲线拟合估计为0.1562。事实上,很自然地推断出变化Δpn= pn+1- pn与乘积pn (0.1562- pn)成正比,因为当(0.1562- pn) = 0时,Δpn大约为零。换句话说,我们推断出

其中r > 0是某个常数。实际上,前面描述的逻辑曲线拟合给出了r = 4.417的值。因此,我们得到公式:

 

可以从p0 = 0.0031数值解得p1 = 0.0052,然后从p1得到p2,依此类推。

(2)指数衰退

[1]例1:理想指数衰减模型

现实的“指数衰减”模型支配着放射性物质质量m的自发衰减(Nagy 2011;Sharon和Sharon 2021)。在这种情况下,从一个特定的初始质量m0开始,每过一段时间H,其质量就会减半。这里,H被称为物质的半衰期[每种放射性物质的一个特性,表示其质量减半所需的时间,以年为单位]。

因此,初始质量m0在时间t = H时减半至m0/2,然后在时间t = 2H时再次减半至m0/4,如此“无限循环”。实际上,这种指数衰减是相当精确的,放射性物质的半衰期可以从几千年到几百万年不等。例如,用于估计文物年龄的碳-14的半衰期约为5730年,而铀-235的半衰期约为7.1亿年!

正如你可以从之前的例子中推断出的那样,放射性物质相当精确的指数衰减过程是由以下方程推出:

当时间以年为单位表示时,我们可以通过以下方式计算放射性物质的质量衰减:

如此一来,我们也可以表示出指数衰减的离散时间方程:

k一样可以计算为:

我们使用python进行可视化模拟:
 

import matplotlib.pyplot as plt
import numpy as np

# 定义初始质量和半衰期
m0 = 100  # 初始质量
H = 5730  # 半衰期(例如,碳-14的半衰期)

# 生成时间序列(例如,接下来的10个半衰期)
t = np.arange(0, 10 * H, H)

# 计算每个时间点上的质量
m = m0 * (1/2) ** (t / H)

# 绘制指数衰减曲线
plt.plot(t, m)
plt.xlabel('Time (years)')
plt.ylabel('Mass')
plt.title('Exponential Decay Curve')
plt.show()

[2]感染康复模型

现在我们从生物学角度考虑另一个指数衰减的例子,涉及人群中感染者的康复情况。I 表示感染者的数量。在感染者群体中,每天有 1/4 的人康复,我们将这个值称为 λ = 0.25。因此,我们的时间单位是一天,我们的感染者康复模型变为:

我们使用R进行可视化:

# 设置初始参数
I0 <- 100 # 初始感染者数量
lambda <- 0.25 # 每天康复的比例
days <- 0:10 # 天数范围

# 计算每天的感染者数量
infected <- numeric(length(days))
infected[1] <- I0
for (i in 2:length(days)) {
  infected[i] <- infected[i-1] * (1 - lambda)
}

# 绘制图表
plot(days, infected, type = "l", xlab = "Days", ylab = "Number of Infected", main = "Exponential Decay of Infected Individuals", col = "blue", lwd = 2)

# 添加图例
legend("topright", legend = "Infected", col = "blue", lty = 1, lwd = 2)


这些建模对于生物来说是最直观也是最简答的,但是却能很好的说明一些问题,下一篇博客见!

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

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

相关文章

Fortify相比其他扫描工具的优势在哪里?

最新发布的 Fortify 22.1.0 版本&#xff0c;不仅能高度兼容最新的软件技术&#xff0c;同时继续保持对运营环境常见的应用安全用例的广泛兼容性。经过强化的 Fortify 进一步提升了性能、准确性、可扩展性和易用性。 无论是运行 DevSecOps、开展云计算转型&#xff0c;还是确保…

Mac移动硬盘选什么格式最好 Mac怎么用ntfs移动硬盘

在使用Mac电脑的过程中&#xff0c;很多用户可能有需要扩展存储空间的需求。选择合适的移动硬盘格式对于数据传输的效率和兼容性至关重要。本文将详细介绍Mac移动硬盘选什么格式好&#xff0c;以及Mac怎么用ntfs移动硬盘&#xff0c;帮助用户优化Mac的使用体验。 一、Mac移动硬…

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框

ContentLoadingProgressBar 是 Android 中的一个控件&#xff0c;继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能&#xff0c;主要用于在加载内容时显示进度。它的一些主要特点如下&#xff1a; 自动隐藏和显示&#xff1a;ContentLoadingProgressBar 会在…

引发C++程序内存泄漏的常见原因分析与排查方法总结

目录 1、概述 2、内存泄漏与程序的位数 3、调用哪些接口去动态申请内存&#xff1f; 4、引发内存泄漏的常见原因总结 4.1、通过malloc/new等动态申请的内存&#xff0c;在使用完后&#xff0c;没有调用free/delete去释放&#xff08;也可能是调用了上面讲到的HeapAlloc或V…

计算机专业大四毕业生如何在一天内完成开题报告?一招教你解锁开题报告写作技巧

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

SQL Server数据库 创建表,和表的增删改查

打开SQL Server工具,连接服务器 右击数据库&#xff0c;创建新的数据库 新建表 填写列&#xff0c;我添加了Id,Name,Sex,Age,和class列 右键表刷新一下就有了 我又同时创建了一个Class表 点击新建查询&#xff0c;现在写代码添加数据&#xff0c;也可以操作表来对数据进行添加 …

GEC6818开发板显示BMP格式图片

1、BMP格式图片 bmp格式图片是没有经过任何压缩过的图片,缺点是为文件尺寸比较大,不适合传播;优点是文件必须要解码器可以读出来直接使用。 虽然BMP格式文件内部存储的就是RGB数据,无需任何解码,但毕竟RGB数据是纯数据,没有任何图片尺寸、色深等具体信息,因此我们需要了…

滴滴二季度GTV达963亿元 经调整EBITA盈利13亿元

8月21日&#xff0c;滴滴在其官网发布2024年二季度业绩报告。 二季度&#xff0c;包括中国出行和国际业务在内的核心平台交易量为38.75亿单&#xff0c;较去年同期增长17.4%。其中&#xff0c;中国出行总单量为30.04亿单&#xff0c;较去年同期增长12.3%&#xff1b;国际业务总…

python爬虫--pyquery解析库整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理python的爬虫解析库pyquery的语法 简洁快速的整理&#xff0c;建议有前端基础的人看 pyquery解析原理 pyquery的原理就是拿到网站的前端源码后&#xff0c;我们根据我们需求信息所在的标签进行筛选。 选…

C语言第15篇

1.阅读下面的程序 #include<stdio.h> void main() { int i,j; i010; j9; printf("%d,%d",i-j,ij); } 则程序的运行结果是________. A) 1,19 B) -1,19 C) 1,17 D) -1,17 提示&#xff1a;八进制 2.以下程序段__________. x-1; do { xx*…

Aria2安装和使用-Mac版

起因是需要网盘下载&#xff0c;无奈限速很烦&#xff0c;查找很多方案后&#xff0c;最终决定使用Aria2 Tampermonkey。 其中Aria2是一款开源轻量的下载软件&#xff0c;简单来说就是可以通过URL直接下载。 Tampermonkey则是一款插件&#xff0c;我这里是.crx结尾的谷歌插件…

WPF调用CEF插件运行时启动CefSharp.BrowserSubprocess.exe三个进程

cefsharp.browsersubprocess.exe 是CefSharp&#xff08;一个基于Chromium的开源浏览器控件&#xff09;的一部分。这个可执行文件通常在以下情况下启动&#xff1a; 渲染进程&#xff1a;CefSharp使用多进程架构&#xff0c;类似于Chrome浏览器。cefsharp.browsersubprocess.e…

【网络】HTTPS——HTTP的安全版本

1.HTTP的问题 1、使用明文通信 HTTP协议不具备给通讯内容加密的功能&#xff0c;所有使用HTTP协议通信的请求和响应的内容无法进行加密,都是使用明文发送。由于HTTP属于TCP/IP协议族的协议&#xff0c;按照TCP/IP协议族的通讯机制&#xff0c;HTTP在整个通讯线路上都存在被窃听…

商务场合的白酒艺术,助你轻松搭建人脉

在繁忙的商务世界中&#xff0c;每一次会面都可能是开启新机遇的钥匙。而在这些重要的场合中&#xff0c;白酒不仅仅是一种饮品&#xff0c;更是一种文化的载体、一种沟通的桥梁。今天&#xff0c;就让我们一起探讨如何在商务场合中&#xff0c;通过豪迈白酒&#xff08;HOMANL…

深度好文:从《黑神话:悟空》看未来游戏趋势:高互动性、个性化与全球化

引言 在数字时代的浪潮中&#xff0c;游戏产业以其独特的魅力和无限的可能性&#xff0c;成为了全球娱乐文化的重要组成部分。随着科技的飞速发展&#xff0c;特别是高性能计算和人工智能技术的突破&#xff0c;游戏的世界变得越来越真实、细腻且富有深度。而在这股技术洪流中…

从0-1建一个webpack/vue项目,熟悉一下webpack知识点

以下配置项部分优化来自于国内直连GPT/Claude 第一步 首先整个新文件夹&#xff0c;打开终端&#xff0c;然后创建一个新目录&#xff0c;或者直接在vscode里面建个新文件夹&#xff0c;并进入该目录&#xff1b; mkdir my-vue-webpack-project第二步 进入当前目录 cd my-v…

SpringBoot项目多线程实现定时任务-只需要三步

众所周知&#xff0c;项目中需要使用定时任务发布的需求时非常常见的&#xff0c;例如&#xff1a;数据同步&#xff0c;清理垃圾文件&#xff0c;清理过期用户等需求&#xff0c;可能需要我们定时去清理数据。 但是我们如果集成xxl-job&#xff0c;Quartz&#xff0c;spring …

IPC 进程间通信方式

IPC对象(共享内存) 共享内存&#xff1a; 1.是一块&#xff0c;内核预留的空间 2.最高效的通信方式 //避免了用户空间 到 内核空间的数据拷贝 用中间那个get函数&#xff0c;就可以使key与共享内存一一对应 怎么将共享内存与进程关联起来 //step1 产生key值 ftok: 功能&am…

鸿蒙内核源码分析——(自旋锁篇)

本篇说清楚自旋锁 读本篇之前建议先读系列篇 进程/线程篇. 内核中哪些地方会用到自旋锁?看图: 概述 自旋锁顾名思义&#xff0c;是一把自动旋转的锁&#xff0c;这很像厕所里的锁&#xff0c;进入前标记是绿色可用的&#xff0c;进入格子间后&#xff0c;手一带&#xff0c…