MATLAB最小二乘法拟合预测人口

❆❁❅❃✽✺❉❂✸✻✹ 2024-06-10 16:35:02 阅读 100

已知进九年温州市人口,预测2024年温州市人口总量。

我们建立logistic人口模型,通过非线性最小二乘拟合,得到温州市人口的拟合曲线,进而求出下一年预测人口数量。

我们可以通过lsqcurvefit函数进行求解,由于此函数的工作原理是基于迭代法求最优解,因此对初始解十分敏感,为了求得较好的初始解,我们通过for循环不断改变初始参数值并记录残差平方和,最后寻找最小值的索引来求得较好的初始参数

(增长率函数中的r参数必须大于0,Xm必须大于往年的人口总量,并且根据常识一定不能超过现有人口的十倍,在此基础上拟合求参数)

求初始参数的程序如下:

clc,clear,close allp = [911.7,917.5,921.5,925,930,957.29,964.5,967.9,976.1];t = [2015:2023];tt = [0:8];fun = @(x,tt)x(1)./(1+(x(1)/911.7-1).*exp(-x(2).*tt));for i=1:200 for j =1:300options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');[xishu,rnorm,r,exitflag] = lsqcurvefit(fun,[900+j,i],tt,p,[900,0],[9000,inf],[],[],[],[],[],options);pr = fun(xishu,9);rr(i,j)=rnorm;endendminvalue = min(rr(:));[row,col] = find(rr==minvalue);

最终求得r初始点为15,Xm初始点为1084时拟合效果最好,因此我们使用这两个参数作为初始参数进行拟合预测

代码如下:

clc,clear,close allp = [911.7,917.5,921.5,925,930,957.29,964.5,967.9,976.1];t = [2015:2023];tt = [0:8];plot(t,p);xlabel('年份');ylabel('人口');fun = @(x,tt)x(1)./(1+(x(1)/911.7-1).*exp(-x(2).*tt));options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');[xishu,rnorm,r,exitflag] = lsqcurvefit(fun,[1084,15],tt,p,[900,0],[9000,inf],[],[],[],[],[],options);pr = fun(xishu,9);format_pr = num2str(pr,'%.4f');fprintf('预测2024年温州市总人口数量为%s',format_pr);plot(t,p,'rx',t,fun(xishu,tt),'g-',2024,pr,'ko');xlabel('年份')ylabel('人口')xlim([2015,2024])legend('往年人口','拟合曲线','预测人口')

最终预测2024年温州市人口总量为982.5960万人,环境容纳量Xm约为5009万人,求得的拟合曲线以及往年和预测数据如图:

a302bedf3af944269dda632b0c4b0df7.png

最后,对于Xm的上界应当取什么范围,我直接根据常识取了十倍,其结果未必可靠,上界到底应当确定在什么范围还应查阅权威资料确定...

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。