文章目录

  • 线性最小二乘法
  • 函数解释
  • 实现思路


线性最小二乘法

Logistic 人口python logistic人口模型参数求解_数学建模

Logistic 人口python logistic人口模型参数求解_最小二乘法_02

记1790,1800,···,2000分别用k=1,2···,22表示,利用向前差分,得到差分方程

Logistic 人口python logistic人口模型参数求解_数学建模_03

其中步长Logistic 人口python logistic人口模型参数求解_数学建模_04,下面对其中给的参数r和s进行拟合(这里因为是线性最小二乘法)

所以我们使用前面介绍过的numpy的linalg方法来进行参数的拟合):

import numpy as np
d=np.loadtxt("Pdata8_10_2.txt")  #加载文件中的数据
t0=d[0]; x0=d[1]  #提取年代数据及对应的人口数据
#我们这里只取二十一个数据来进行拟合
b=np.diff(x0)/10/x0[:-1]  #构造线性方程组的常数项列
a=np.vstack([np.ones(len(x0)-1),-x0[:-1]]).T #构造线性方程组系数矩阵
rs=np.linalg.pinv(a)@b;  r=rs[0]; xm=r/rs[1]
print("人口增长率r和人口最大值xm的拟合值分别为", np.round([r,xm],4))
xhat=xm/(1+(xm/3.9-1)*np.exp(-r*(2010-1790)))  #求预测值
print("2010年的预测值为:",round(xhat,4))

函数解释

Numpy.linalg模块的pinv()求其广义逆矩阵

np.round(对给定的数组进行四舍五入,可以指定精度)

x0[:-1]就是除去了最后一个值剩下的部分

np.diff numpy.diff(a, n=1,axis=-1) 沿着指定轴计算第N维的离散差值
参数:
a:输入矩阵
n:可选,代表要执行几次差值
axis:默认是最后一个

实际就是沿着指定的轴执行后一个元素减前一个元素

@ 用于对两个numpy数组实现矩阵乘法

实现思路

函数的实现思路就是把线性组合ax+r=b 化成矩阵相乘 np.dot(a,rx) 的形式

这样就变成了一个AX=b的线性方程组 再用逆矩阵求解出X 也就得到了rank为1的参数数组

这对于一元线性组合是很有用的也是很取巧的一种办法