背景

目前,比较标准的评测体重的标准就是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)相关推荐

  1. WIF基本原理(2)基于声明的标识模型

    WIF基本原理(2)基于声明的标识模型 基于声明的标识模型,简单来讲,就是将用户信息作为声明条件,向应用程序来提供用户标识.一个声明以是用户名,也可能是电子邮件地址.现在的想法是配置外部标识系统,为应 ...

  2. 3D图形学(5):BRDF经验模型和基于物理的BRDF模型

    内容引自<Real Time Rendering 3rd> 一.BRDF 双向反射分布函数 在计算机图形学中,BRDF(Bidirectional Reflectance Distribu ...

  3. python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线

    python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线 目录 python基于朴素贝叶斯模型的预测概率和标签信息可视化ROC曲线

  4. [附源码]计算机毕业设计Python+uniapp基于Android的减肥菜谱APPn0n19(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android的减肥菜谱APPn0n19(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环 ...

  5. 基于C++的PyTorch模型部署

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 PyTorch作为一款端到端的深度学习框架,在1.0版本之后 ...

  6. 使用opencv训练目标检测模型基于cascade模型

    使用opencv训练目标检测模型基于cascade模型 基于Haar特征的cascade分类器(classifiers) 是Paul Viola和 Michael Jone在2001年,论文" ...

  7. 【机器学习】基于GBDT的数据回归及python实现

    [机器学习]基于GBDT的数据回归及python实现 一.Boosting技术 二.GBDT原理与应用 2.1.GBDT思想 2.2.基于GBDT的数据回归 2.3.基于GBDT的数据分类 三.基于G ...

  8. matlab加热模型,基于MATLAB钢丝感应加热模型及其温度场特性的研究

    <工业加热>第 卷 年第 期 11 热能工程 前 言 自 20 世纪 30 年代,感应加热技术大量应用于工业生产以来,由于感应加热自身的优点和感应加热理论和技术的不断进步,迄今已成为一项节 ...

  9. 基于hadoop的商品推荐系统_[零基础入门推荐系统(1)]基于用户和基于物品的协同过滤方法(python代码实现)...

    1. 前言: 为什么会有该系列? 最近,打算写<零基础入门推荐系统>系列,为了系统地介绍推荐系统知识,以及加强基础的实践能力. 该系列将结合一些书籍,比如项亮的<推荐系统实践> ...

  10. 基于树结构的机器学习模型

    基于树结构的机器学习模型 在深度学习被广泛应用之前,基于树形结构的机器学习模型,比如说决策树,随机森林,GBDT,Xgboost等等被广泛的应用到分类等常见场景中,下面总结一下常见一个一些树形结构的机 ...

最新文章

  1. 中国治理蝗灾是生物防治的成就,根本不是靠鸡靠鸭靠吃货换来的!
  2. 贾扬清、Alex Smola、Julia创始人等大咖齐聚,WAIC开发者日共话AI未来
  3. jsonp获取服务器数据的方式
  4. c++17(26)-数组、二维数组的指针、指向数组的指针、指向数组的指针的指针
  5. Understanding Quaternions 中文翻译《理解四元数》
  6. 如何避免Java线程中的死锁?
  7. 在Web浏览器中显示Spring应用程序启动的进度
  8. Python GUI
  9. BZOJ 2956 模积和
  10. 将Windows日志转换为Syslog
  11. 自动化无法定位的原因_Appium Android 自动化测试 -- 元素定位
  12. python图层_Python叠加矩形框图层2种方法及效果
  13. futuretask java_Java并发编程一(FutureTask)
  14. php 用header()下载文件在firefox下没有后缀名
  15. spring-第二篇ApplicationContext国际化及事件机制
  16. 用QT实现一个简单的桌面宠物
  17. 旺旺的计算机无法打开,电脑任务栏中点击阿里旺旺图标无法打开界面的解决方法...
  18. 网络安全防护体系建设
  19. 阿里云OSS上传图片慢的处理方案
  20. Windows 禁用U盘的程序,不用注册表方式。

热门文章

  1. 一篇文章从了解到入门shell
  2. 为什么程序员怕改需求?
  3. 蹩脚的程序员们,我们来谈谈你的未来!
  4. Dreamweaver之简单实现网站布局、图片漂浮、区域跳转、登陆注册及图片查看器
  5. php是什么水处理药剂,国内目前最主要水处理药剂分类及特点
  6. 开课吧JAVA高级架构师怎么样_开课吧JavaEE企业级高级架构师
  7. 常见距离算法-欧氏距离、杰卡德距离、余弦距离
  8. Android Device Moniter部分问题的解决办法:
  9. 谷歌浏览器翻译插件推荐——Google Chrome 插件推荐
  10. GitHub 的 Action 如何禁用