数学模型——基于差分方程的减肥模型(基于python)
背景
目前,比较标准的评测体重的标准就是BMI指数,它等于体重除以身高的平方。我国的参考标准认为,BMI指数小于18.5即为偏瘦,在18.5至23.9为正常,在24至27.9之间为超重,大于28即为肥胖。
在正常情况下,人体通过食物摄入的热量与代谢和运动消耗的热量大致上是平衡的,于是体重基本保持不变,而当能量守恒被打破时就会引起体重变化。
减肥计划以减少摄入热量,增加运动量的方法进行考虑
模型假设
1.体重增加正比于吸收的热量,平均每8000kcal增加体重1kg
2.身体正常代谢引起的体重减少正比于体重,每周每千克体重消耗热量一般在200kcal至320kcal之间,且因人而异,这相当于体重70kg的人每天消耗2000kcal至3200kcal
3.运动引起的体重减少正比于体重,且与运动形式和运动时间有关
4.为了安全与健康,每周吸收热量最好不要小于10000kcal,且每周减少量不要超过1000kcal,每周体重减少不要超过1.5kg
运动 | foot | run | dance | pingpang | bicycle | swim |
---|---|---|---|---|---|---|
热量消耗 | 3.1 | 7.0 | 3.0 | 4.4 | 2.5 | 7.0 |
注:数据仅供参考
基本模型
记第k周(初)体重为w(k)(kg),第k周吸收热量为c(k)(kcal),k=1,2...。设热量转换系数为α。深体代谢消耗系数为β,根据模型假设,正常情况下(不考虑运动)体重变化的基本方程为(只要能表示这段方程,主体部分基本就完事,使用一个while循环或者for循环即可)
根据假设1,,当确定一个人的代谢消耗系数β后,就可按照上述式子由每周吸收的热量c(k)推到ta体重w(k)的变化,增加运动时,需要更改消耗系数β值,具体会在下面给出
实例
某人身高1米7,体重100kg,BMI高达34.6,已知每周吸收20000kcal热量,体重长期未变,目标是需要将ta体重降至75kg,并维持下去。
此时设置一个两阶段计划,第一阶段将吸收热量由20000kcal减至10000kcal;第二阶段保持吸收热量,直至达到减肥目标(亦或者为了加快进程增加运动)
故,根据上述信息,可以得出以下信息:
根据第一阶段要求,吸收热量要降至10000,故得出c(k)
此时,带入基本模型,就可以得到关于体重的差分方程
以w(1)=100kg为初始值,按照以上式子进行编程,得出11周初体重为93.616kg
代码实现
定义一个loseplan函数,用于制定计划,以及显示每周的体重变化,当然,首先判定BMI指数是否过大。参数为体重,身高,摄入热量,每周默认减少热量为1000kcal,设置了sport,即运动下的第二阶段体重变化
def losePlan(weight,height,c,lose=1000,sport=False,category='跳舞'):bmi = round(weight/height**2)if bmi > 26:goalw = 26 * height ** 2print('您目前体重指数为{},属于超重范围,正在为您计算第一阶段减食计划所用时间'.format(bmi))print('您的目标体重为{}'.format(round(goalw, 2)))
其次,α是给定已知且不会变化的,β是根据每个人的不同有差异的
a = 1 / 8000 # 热量转换系数
beta = a * c / weight # 代谢消耗系数
接下来进入差分方程的阶段,我使用的是while循环进行差分,使用for循环的话,我认为需要先算出时间,再进行,whlie循环不会。故定义一个time获取一共需要多少周才能完成第一阶段
time = 0
while c != 10000:c = c - losetime += 1weight = weight * (1 - beta) + a * (20000 - 1000 * time)print('第{}周减少摄入热量为{},此时体重{}'.format(time,c,round(weight, 3)))
print('第一阶段减食所需时间为{}周'.format(time))
此时将参数写上,运行代码,可以获得第一阶段每一周体重的变化,如下图
第二阶段
不运动的情况下,要求每周热量标尺下限10000kcal,故此时方程为
当体重减至75.14kg或以下时,第二阶段结束
若想加快进程,需要增加运动,根据前面运动消耗表,记热量消耗为γ,每周运动t小时,则基本模型中β改为β+αγt,此时方程为
设运动方式为跑步,每周8小时(实际上谁跑那么久呀。。。)
if sport:sport_cate = {'foot': 3.1, 'run': 7.0, 'dance': 3.0,'pq': 4.4, 'bicycle': 2.5, 'swim': 7.9}for i in sport_cate.keys():if category == i:s = sport_cate[category]while weight > 75:weight = weight + a * c - weight * (beta + a * s * 8)time += 1print("第{}周的体重为{}".format(time, round(weight, 3)))# 假设不运动
else:while weight >= 75:a = 1 / 8000weight = weight * 0.975 + a * ctime += 1print("第{}周的体重为{}".format(time, round(weight, 3)))
当不运动时,有代码得出结果,还需要22周才能达到目标体重,若是进行运动,则需要15周。
完整代码
def losePlan(weight,height,c,lose=1000,sport=False,category='跳舞'):bmi = round(weight/height**2)if bmi > 26:goalw = 26 * height ** 2print('您目前体重指数为{},属于超重范围,正在为您计算第一阶段减食计划所用时间'.format(bmi))print('您的目标体重为{}'.format(round(goalw, 2)))a = 1 / 8000 # 热量转换系数beta = a * c / weight # 代谢消耗系数time = 0while c != 10000:c = c - losetime += 1weight = weight * (1 - beta) + a * (20000 - 1000 * time)print('第{}周减少摄入热量为{},此时体重{}'.format(time,c,round(weight, 3)))print('第一阶段减食所需时间为{}周'.format(time))if sport:sport_cate = {'foot': 3.1, 'run': 7.0, 'dance': 3.0, 'pq': 4.4, 'bicycle': 2.5, 'swim': 7.9}for i in sport_cate.keys():if category == i:s = sport_cate[category]while weight > 75:# weight = weight + a * c - weight * (beta + a * s * 8)weight = 0.97*weight + 1.25time += 1print("第{}周的体重为{}".format(time, round(weight, 3)))# 假设不运动else:while weight >= 75:a = 1 / 8000weight = weight * 0.975 + a * ctime += 1print("第{}周的体重为{}".format(time, round(weight, 3)))else:print('您的体重指数为{},体重正常'.format(bmi))if __name__ == '__main__':weight = 100height = 1.7c = 20000name = 'run'losePlan(weight,height,c,sport=True,category=name)
总结
代码不是很长,但是足够用。后期我在进行整理时,发现若是从第一阶段开始运动,会更好,而原书中也是这样表达,我没注意到,所以代码部分,只有第二阶段不运动的情况下是比较正确的。
若是小伙伴们对代码有什么疑惑,可以私信或评论区发表意见哈
参考书目:姜启源 谢金星 叶俊.数学模型(第五版)
数学模型——基于差分方程的减肥模型(基于python)相关推荐
- WIF基本原理(2)基于声明的标识模型
WIF基本原理(2)基于声明的标识模型 基于声明的标识模型,简单来讲,就是将用户信息作为声明条件,向应用程序来提供用户标识.一个声明以是用户名,也可能是电子邮件地址.现在的想法是配置外部标识系统,为应 ...
- 3D图形学(5):BRDF经验模型和基于物理的BRDF模型
内容引自<Real Time Rendering 3rd> 一.BRDF 双向反射分布函数 在计算机图形学中,BRDF(Bidirectional Reflectance Distribu ...
- python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线
python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线 目录 python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线
- [附源码]计算机毕业设计Python+uniapp基于Android的减肥菜谱APPn0n19(程序+源码+LW+远程部署)
[附源码]计算机毕业设计Python+uniapp基于Android的减肥菜谱APPn0n19(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环 ...
- 基于C++的PyTorch模型部署
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 PyTorch作为一款端到端的深度学习框架,在1.0版本之后 ...
- 使用opencv训练目标检测模型基于cascade模型
使用opencv训练目标检测模型基于cascade模型 基于Haar特征的cascade分类器(classifiers) 是Paul Viola和 Michael Jone在2001年,论文" ...
- 【机器学习】基于GBDT的数据回归及python实现
[机器学习]基于GBDT的数据回归及python实现 一.Boosting技术 二.GBDT原理与应用 2.1.GBDT思想 2.2.基于GBDT的数据回归 2.3.基于GBDT的数据分类 三.基于G ...
- matlab加热模型,基于MATLAB钢丝感应加热模型及其温度场特性的研究
<工业加热>第 卷 年第 期 11 热能工程 前 言 自 20 世纪 30 年代,感应加热技术大量应用于工业生产以来,由于感应加热自身的优点和感应加热理论和技术的不断进步,迄今已成为一项节 ...
- 基于hadoop的商品推荐系统_[零基础入门推荐系统(1)]基于用户和基于物品的协同过滤方法(python代码实现)...
1. 前言: 为什么会有该系列? 最近,打算写<零基础入门推荐系统>系列,为了系统地介绍推荐系统知识,以及加强基础的实践能力. 该系列将结合一些书籍,比如项亮的<推荐系统实践> ...
- 基于树结构的机器学习模型
基于树结构的机器学习模型 在深度学习被广泛应用之前,基于树形结构的机器学习模型,比如说决策树,随机森林,GBDT,Xgboost等等被广泛的应用到分类等常见场景中,下面总结一下常见一个一些树形结构的机 ...
最新文章
- 中国治理蝗灾是生物防治的成就,根本不是靠鸡靠鸭靠吃货换来的!
- 贾扬清、Alex Smola、Julia创始人等大咖齐聚,WAIC开发者日共话AI未来
- jsonp获取服务器数据的方式
- c++17(26)-数组、二维数组的指针、指向数组的指针、指向数组的指针的指针
- Understanding Quaternions 中文翻译《理解四元数》
- 如何避免Java线程中的死锁?
- 在Web浏览器中显示Spring应用程序启动的进度
- Python GUI
- BZOJ 2956 模积和
- 将Windows日志转换为Syslog
- 自动化无法定位的原因_Appium Android 自动化测试 -- 元素定位
- python图层_Python叠加矩形框图层2种方法及效果
- futuretask java_Java并发编程一(FutureTask)
- php 用header()下载文件在firefox下没有后缀名
- spring-第二篇ApplicationContext国际化及事件机制
- 用QT实现一个简单的桌面宠物
- 旺旺的计算机无法打开,电脑任务栏中点击阿里旺旺图标无法打开界面的解决方法...
- 网络安全防护体系建设
- 阿里云OSS上传图片慢的处理方案
- Windows 禁用U盘的程序,不用注册表方式。