python数学建模基础教程_Python数学建模极简入门(二)差分方程
差分方程这名字大家可能不太熟悉,其实差分方程指的是下面这种:
差分方程
其实就是我们数学中数列的递推公式,在以前学数学的时候,往往要通过递推公式来求通项公式才能快速地得到某一项的值,现在借助编程的话,仅仅有递推公式就足够生成一个数组了。
所以利用差分方程建模的关键在于如何得到第n组数据与第n+1组数据之间的关系。
实例1:培养皿中酵母菌数量的增长模型
生物工程专业的同学们可能接触过这样的试验,也画过这样的曲线。下面我们给不知道的同学们科普一下:
这个模型当然比之前的弹簧伸长模型要复杂一点。不知道大家还记不记得高中生物书上有一副这样的图:
细菌培养曲线
如图所示我们用培养基培养细菌时,其数量变化通常会经历这四个时期。
而酵母菌因为生长周期长,我们经常能在小木虫或者丁香园上看见有人问:为何我的酵母菌培养了四五天还没有出现衰亡期啊??
在这个模型里面我们只针对前三个时期建一个大致的模型:调整期、对数期、稳定期。
数据分析
多说无益,我们先看数据:
时间
酵母菌数量
变化(Pn+1 – Pn)
0
9.6
8.7
1
18.3
10.7
2
29
18.2
3
47.2
23.9
4
71.1
48
5
119.1
55.5
6
174.6
82.7
7
257.3
93.4
8
350.7
90.3
9
441.0
72.3
10
513.3
46.4
11
559.7
35.1
12
594.8
34.6
13
629.4
11.4
14
640.8
10.3
15
651.1
4.8
16
655.9
3.7
17
659.6
2.2
18
661.8
—
根据以上数据我们可以很轻松的用Python画出酵母菌数量与时间和ΔP之间的关系的图形(详情请看上期推荐的matplotlib的简单教程)
import matplotlib.pyplot as plt
time = [i for i in range(0,19)]
number = [9.6,18.3,29,47.2,71.1,119.1,174.6,257.3,\
350.7,441.0,513.3,559.7,594.8,629.4,640.8,\
651.1,655.9,659.6,661.8]
plt.title('Relationship between time and number')#创建标题
plt.xlabel('time')#X轴标签
plt.ylabel('number')#Y轴标签
plt.plot(time,number)#画图
plt.show()#显示
画出来的图是这样的(这个图是自己画的,第一期的是书本上的图)
尝试建模
这个图形看起来是不是很奇怪,这个模型的变化规律是什么呢?该如何建立这个模型呢,我们接下来分析一下:
1.强行拟合
对于这种模型我们当然也可以像上一期一样直接用numpy拟合,这个图形嘛,有点点像三次函数,我们可以试着用三次函数拟合一下试试,方法跟上期一样。
import numpy as np
import matplotlib.pyplot as plt
time = [i for i in range(0,19)]
number = [9.6,18.3,29,47.2,71.1,119.1,174.6,257.3,\
350.7,441.0,513.3,559.7,594.8,629.4,640.8,\
651.1,655.9,659.6,661.8]
f = np.polyfit(time,number,3)
y = np.polyval(f,time)#根据拟合之后的函数来求函数值
plt.plot(time,y,color = 'b')#根据函数值画图并设定颜色
plt.title('Relationship between time and number')
plt.xlabel('time')
plt.ylabel('number')
plt.plot(time,number,color = 'r')
plt.show()
图形是这样的:
其中红色的原数据,蓝色是拟合之后的函数图像。
这种方法简单粗暴,在数据非常充足的时候是适用的,而在这个实例中我们要得到的是酵母菌数量随着时间变化的规律,主要拟合的话很难保证18h以后还能保持很好的拟合度。
这样拟合有个问题就是18小时之后的种群速度是会继续缓慢增长(抛物线形)还是逼近一个极限值(双曲线型)呢?
2.结合理论知识分析
数学建模即将实际问题转换为数学问题,这势必要了解实际问题的内部机理。
下面我们来对这个模型中的原理来分析一下,酵母菌培养是个很常见的实验,不了解的可以上网查查资料。
酵母菌数量增长有一个这样的规律:当某些资源只能支撑某个最大限度的种群数量,而不能支持种群数量的无限增长,当接近这个最大值时,种群数量的增长速度就会慢下来。
这个模型较为成熟的建立方式是通过差分方程来建立,我们来分析一下:
首先以两个观测点的值差Δp来表征增长速度。
Δp与目前的种群数量有关,数量越大,增长速度越快。
Δp还与剩余的未分配的资源量有关,资源越多,增长速度越快。
然后以极限总群数量与现有种群数量的差值来表征剩余资源量。
这样是不是模型是不是已经呼之欲出了(由表中猜测极限值是665,是多少都不重要)。
Δp = pn+1 – pn = k(665-pn)pn
公式中加了一个系数k,主要求出k值,这个模型就算完成了。
如何使用Python求系数k呢??
上面的式子中Δp和(665-pn)pn是不是成线性关系,我们只要根据数据求出二者的值,然后按上一期教程拟合一下,得到斜率就是我们所需要的k值了。
import numpy as np
pn = [9.6,18.3,29,47.2,71.1,119.1,174.6,\
257.3,350.7,441.0,513.3,559.7,594.8,629.4,\
640.8,651.1,655.9,659.6]
deltap = [8.7,10.7,18.2,23.9,48,55.5,\
82.7,93.4,90.3,72.3,46.4,35.1,\
34.6,11.4,10.3,4.8,3.7,2.2]
pn = np.array(pn)
factor = pn*(665-pn)
f = np.polyfit(factor,deltap,1)
print(f)
输出结果是这样的,前一个是系数,后一个是截距。
0.00081448 -0.30791574
至此,酵母菌这个模型就讲解完毕了,方程是:
Δp = pn+1 – pn = 0.00081448(665-pn)pn
拟合后的图形就不用画了吧,按前面讲的方法自己画一画,很简单的。
@乡土老农 问到这个图像怎么画,代码是这样的:
import matplotlib.pyplot as plt
p0 = 9.6
p_list = []
for i in range(20):
p_list.append(p0)
p0 = 0.00081448*(665-p0)*p0+p0
plt.plot(p_list)
plt.show()
image.png
有兴趣转行机器学习的朋友可以加群:
机器学习-菜鸡互啄群
python数学建模基础教程_Python数学建模极简入门(二)差分方程相关推荐
- python数学建模基础教程_Python 3破冰人工智能 从入门到实战 大学生数学建模竞赛数学建模算法与应用教程 机器学习深度学...
第 1章 从数学建模到人工智能1 1.1 数学建模 1 1.1.1 数学建模与人工智能 1 1.1.2 数学建模中的常见问题 4 1.2 人工智能下的数学 12 1.2.1 统计量 ...
- 3d游戏建模基础教程:3D建模应用领域和四种常用建模方法
3D建模应用领域 影视动画表现 电影行业将它们用于活动的任务.物体以及现实电影:视频游戏产业将它们作为计算机与视频游戏中的资源,通过设计稿,建模,最终完成. 游戏美术表现 多用于游戏类建模,包括:角色 ...
- python统计数据分析基础教程_Python数据分析基础教程:NumPy学习指南(第2版)
第1章 NumPy快速入门 让我们开始吧.首先,我们将介绍如何在不同的操作系统中安装NumPy和相关软件,并给出使用NumPy的简单示例代码.然后,我们将简单介绍IPython(一种交互式shell工 ...
- python基础教程博客_Python基础教程_Python入门知识
Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...
- 视频教程-快速入门Python基础教程_Python基础知识大全-Python
快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...
- 51自学网sketchup8基础教程 3dmax高级建模教程 VR产品级渲染教程 家具设计制造教程...
我要自学网平面设计 计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 我要自学网Excel函数应用教程 Excel VBA基础教程 ...
- 视频教程-快速入门Python基础教程_Python基础进阶视频-Python
快速入门Python基础教程_Python基础进阶视频 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥199.00 立 ...
- python教程是什么-Python基础教程_Python入门知识
Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...
- python基础教程是什么-Python基础教程_Python入门知识
Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...
最新文章
- WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
- 无法解析的外部符号 __imp____glutInitWithExit@12
- JDBC实现从Hive抽取数据导入Oracle
- 规模化敏捷框架何从入手?这篇文章把SAFe讲透了!
- 阿斯顿马丁宣布放弃内燃机:2026年开始只销售电动或混动车
- winform中32位转64位系统上打开
- if和else同时执行_为什么大量的if else这么不受待见?怎么“干掉”它?
- Java 输入/输出 I/O流 RandomAccessFile
- mysql驱动包放在ecplise哪里_eclipse导入mysql jdbc驱动包的具体步骤及注意事项
- 利用 MATLAB 和 DCRAW 处理数码相机 RAW 文件的完整流程
- python与plc进行串口通信,寄存器写数据 欧姆龙plc
- 关于信息墒与压缩编码基础的学习
- HDU5442 最小(大)表示法
- HDU 3903 Trigonometric Function (三角恒等式余弦定理)
- 身份证校验码程序c#
- 瞰见 | 开源,会不会变成开源创业的焦油坑?
- 持续帮助客户成功,用友YonSuite全场景SaaS服务有什么特别之处?
- python 总数 和 平方和 的计算
- Day04 - Array Cardio 指南一
- 狂赚310亿美元!安卓系统的钱究竟是怎么来的
热门文章
- 继承的综合运用《Point类派生出Circle类而且进行各种操作》
- ado.net操作数据库常用方法集锦
- sql 基础--mysql 5 (8)
- mysql (master/slave)复制原理及配置
- 基于通用权限管理系统实现的单点登录
- webapi支持session
- 【译】用图表展示未知----通向报表服务的阶梯系列(五)
- 学习-SQL查询连续号码段的巧妙解法--转载
- .NET 调用JS:WebBrowser.Document.InvokeScript 方法抛出“指定的转换无效”异常的原因
- python异常之ModuleNotFoundError: No module named ‘test01inner02‘