没有错,博主最近放假了,终于终于~~~
那么也就开始继续我的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百万。
一个学生物的编程爱好者~~~