美国人口的模型预测——非线性最小二乘法

在这里插入图片描述

没有错,博主最近放假了,终于终于~~~

那么也就开始继续我的python二级备考之旅,因为自己的原因没有参加上2020年的python二级考,有点可惜,但是这样也是给了我更多的备考时间

话不多说,开始今天的博客内容,之前我是写过一个草履虫的逻辑斯蒂增长的曲线拟合的一个博客,因为自己的知识不够的原因,当时没有写完,现在补上,但是并不是哪一个课题了,换了一个教科书上的案例:“美国人口的预测增长”

上案例,我之前一直以为这个是属于插值与优化的内容,哈哈,没想到竟然是属于微分方程的具体应用,在了解完logistic模型的相关知识之后我才理解的更加清楚~

https://baike.baidu.com/item/Logistic%E5%87%BD%E6%95%B0/3520384(生长曲线/logistic模型相关知识)

以下是这个案例用到的数据文件。

1790	1800	1810	1820	1830	1840	1850	1860
3.9	5.3	7.2	9.6	12.9	17.1	23.2	31.4
1870	1880	1890	1900	1910	1920	1930	1940
38.6	50.2	62.9	76.0	92.0	106.5	123.2	131.7
1950	1960	1970	1980	1990	2000		
150.7	179.3	204.0	226.5	251.4	281.4		

应该复制粘贴就能用

然后上源代码

'''
author:SUMPLUSS
date:2021,1,16
name:curve_fit_demo.py
'''

import numpy as np
from scipy.optimize import curve_fit
a=[]; b=[];
with open("Pdata8_10_1.txt") as f:    #打开文件并绑定对象f,文件名是自己创建的那个文件的名字,记得加上txt!
    s=f.read().splitlines()  #返回每一行的数据
for i in range(0, len(s),2):  #读入奇数行数据
    d1=s[i].split("\t")
    for j in range(len(d1)):
        if d1[j]!="": a.append(eval(d1[j]))  #把非空的字符串转换为年代数据
for i in range(1, len(s), 2):  #读入偶数行数据
    d2=s[i].split("\t")
    for j in range(len(d2)):
        if d2[j] != "": b.append(eval(d2[j])) #把非空的字符串转换为人口数据
c=np.vstack((a,b))  #构造两行的数组
np.savetxt("Pdata8_10_2.txt", c)  #把数据保存起来供下面使用,同理上下两个文件名是一样的
x=lambda t, r, xm: xm/(1+(xm/3.9-1)*np.exp(-r*(t-1790)))
bd=((0, 200), (0.1,1000))  #约束两个参数的下界和上界
popt, pcov=curve_fit(x, a[1:], b[1:], bounds=bd)
print(popt); print("2010年的预测值为:", x(2010, *popt))


这个方法是非线性最小二乘法求值

最后求得r = 0.0274 , xm = 342.4419 , 2010 年的人口预测值为282.6798百万。

一个学生物的编程爱好者~~~

  • 17
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终是蝶衣梦晓楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值