matlab中的最小二乘法拟合指数函数(人口问题)
matlab曲线拟合人口增长模型及其数量预测

实验目的[1] 学习由实际问题去建立数学模型的全过程;[2] 训练综合应用数学模型、微分方程、函数拟合和预测的知识分析和解决实际问题; [3] 应用matlab 软件求解微分方程、作图、函数拟合等功能,设计matlab 程序来求解其中的数学模型;[4] 提高论文写作、文字处理、排版等方面的能力;通过完成该实验,学习和实践由简单到复杂,逐步求精的建模思想,学习如何建立反映人口增长规律的数学模型,学习在求解最小二乘拟合问题不收敛时,如何调整初值,变换函数和数据使优化迭代过程收敛。
应用实验(或综合实验)一、实验内容从1790—1980年间美国每隔10年的人口记录如表综2.1所示:表综2.1年 份 1790 1800 1810 1820 1830 1840 1850 人口(×106)3.9 5.3 7.2 9.6 12.9 17.1 23.2 年 份 1860 1870 1880 1890 1900 1910 1920 人口(×106)31.4 38.6 50.2 62.9 76.0 92.0 106.5 年 份 193019401950196019701980人口(×106)123.2 131.7 150.7 179.3 204.0 226.5用以上数据检验马尔萨斯(Malthus)人口指数增长模型,根据检验结果进一步讨论马尔萨斯人口模型的改进,并利用至少两种模型来预测美国2010年的人口数量。
二、问题分析1:Malthus 模型的基本假设是:人口的增长率为常数,记为 r 。
记时刻t 的人口为x (t ),(即x (t )为模型的状态变量)且初始时刻的人口为x 0,于是得到如下微分方程:⎪⎩⎪⎨⎧==0)0(d d x x rxtx2:阻滞增长模型(或Logistic 模型) 由于资源、环境等因素对人口增长的阻滞作用,人口增长到一定数量后,增长率会下降,假设人口的增长率为x 的减函数,如设r(x)=r(1-x/x m ),其中r 为固有增长率(x 很小时),x m 为人口容量(资源、环境能容纳的最大数量),于是得到如下微分方程:⎪⎩⎪⎨⎧=-=0)0()1(d d xx x x rx t xm三、数学模型的建立与求解根据Malthus 模型的基本假设,和Logistic 模型,我们可以分别求得微分方程的解析解,y1=x0*exp(r*x);y2= xm/(1+x0*exp(-r*x))对于1790—1980年间美国每隔10年的人口记录,分别用matlab 工具箱中非线性拟合函数的命令作一般的最小二乘曲线拟合,可利用已有程序lsqcurvefit 进行拟合,检验结果进一步讨论模型的改进,预测美国2010年的人口数量。
matlab最小二乘法数据拟合函数详解

matlab最⼩⼆乘法数据拟合函数详解定义:最⼩⼆乘法(⼜称最⼩平⽅法)是⼀种数学优化技术。
它通过最⼩化误差的平⽅和寻找数据的最佳函数匹配。
利⽤最⼩⼆乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平⽅和为最⼩。
最⼩⼆乘法还可⽤于曲线拟合。
其他⼀些优化问题也可通过最⼩化能量或最⼤化熵⽤最⼩⼆乘法来表达。
最⼩⼆乘法原理:在我们研究两个变量(x,y)之间的相互关系时,通常可以得到⼀系列成对的数据(x1,y1.x2,y2... xm,ym);将这些数据描绘在x -y直⾓坐标系中,若发现这些点在⼀条直线附近,可以令这条直线⽅程如(式1-1)。
Yj= a0 + a1 X (式1-1),其中:a0、a1 是任意实数。
matlab中⽤最⼩⼆乘拟合的常⽤函数有polyfit(多项式拟合)、nlinfit(⾮线性拟合)以及regress(多元线性回归)。
⾃变量有2个或以上时,应变量⼀个,可以使⽤的有nlinfit和regress,线性时⽤regress,⾮线性时⽤nlinfit。
对于进阶matlab使⽤者还有更多的选择,如拟合⼯具箱、fit函数、interp系列插值拟合等等。
MATLAB中关于最⼩⼆乘法的函数主要有:help polyfit -- POLYFIT Fit polynomial to data.help lsqcurvefit -- LSQCURVEFIT solves non-linear least squares problems.help lsqnonlin -- LSQNONLIN solves non-linear least squares problems.help nlinfit -- NLINFIT Nonlinear least-squares regression.help regress -- REGRESS Multiple linear regression using least squares.help meshgrid -- MESHGRID X and Y arrays for 3-D plots.本⽂主要讲解的函数:polyfit,lsqcurvefit,lsqnonlin,regress1.多项式曲线拟合:polyfit1.1 常见拟合曲线直线: y=a0X+a1多项式:,⼀般次数不易过⾼2,3双曲线: y=a0/x+a1指数曲线: y=a*e^b1.2 matlab中函数P=polyfit(x,y,n)[P S mu]=polyfit(x,y,n)polyval(P,t):返回n次多项式在t处的值注:其中x y已知数据点向量分别表⽰横纵坐标,n为拟合多项式的次数,结果返回:P-返回n次拟合多项式系数从⾼到低依次存放于向量P中,S-包含三个值其中normr是残差平⽅和,mu-包含两个值 mean(x)均值,std(x)标准差。
Matlab最小二乘法拟合笔记

最小二乘法拟合在科学实验的统计方法研究中,往往要从一组实验数据中寻找出自变量x 和因变量y之间的函数关系y=f(x) 。
由于观测数据往往不够准确,因此并不要求y=f(x)经过所有的点,而只要求在给定点上误差按照某种标准达到最小,通常采用欧氏范数作为误差量度的标准。
这就是所谓的最小二乘法。
在MATLAB中实现最小二乘法拟合通常采用polyfit函数进行。
函数polyfit是指用一个多项式函数来对已知数据进行拟合,我们以下列数据为例介绍这个函数的用法:>> x=0:0.1:1;>> y=[ -0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2 ]为了使用polyfit,首先必须指定我们希望以多少阶多项式对以上数据进行拟合,如果我们指定一阶多项式,结果为线性近似,通常称为线性回归。
我们选择二阶多项式进行拟合。
>> P= polyfit (x, y, 2)P=-9.8108 20.1293 -0.0317函数返回的是一个多项式系数的行向量,写成多项式形式为:为了比较拟合结果,我们绘制两者的图形:>> xi=linspace (0, 1, 100); %绘图的X-轴数据。
>> Z=polyval (p, xi); %得到多项式在数据点处的值。
当然,我们也可以选择更高幂次的多项式进行拟合,如10阶:>> p=polyfit (x, y, 10);>> xi=linspace (0, 1,100);>> z=ployval (p, xi);读者可以上机绘图进行比较,曲线在数据点附近更加接近数据点的测量值了,但从整体上来说,曲线波动比较大,并不一定适合实际使用的需要,所以在进行高阶曲线拟合时,“越高越好”的观点不一定对的。
Matlab最小二乘法曲线拟合

之阳早格格创做最小两乘法正在直线拟合中比较一致.拟合的模型主要有1.直线型2.多项式型3.分数函数型4.指数函数型5.对付数线性型6.下斯函数型......普遍对付于LS问题,常常利用反斜杠运算“\”、fminsearch或者劣化工具箱提供的极小化函数供解.正在Matlab中,直线拟合工具箱也提供了直线拟合的图形界里支配.正在下令提示符后键进:cftool,即可根据数据,采用适合的拟合模型.“\”下令1.假设要拟合的多项式是:y=a+b*x+c*x^2.最先修坐安排矩阵X:X=[ones(size(x)) x x^2];实止:para=X\ypara中包罗了三个参数:para(1)=a;para(2)=b;para(3)=c;那种要领对付于系数是线性的模型也符合.2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2)安排矩阵X为X=[ones(size(x)) exp(x) x.*exp(x.^2)];para=X\y3.多沉返回(乘积返回)设要拟合:y=a+b*x+c*t,其中x战t是预测变量,y是赞同变量.安排矩阵为X=[ones(size(x)) x t] %注意x,t大小相等!para=X\y polyfit函数polyfit函数没有需要输进安排矩阵,正在参数预计中,polyfit会根据输进的数据死成安排矩阵.1.假设要拟合的多项式是:y=a+b*x+c*x^2p=polyfit(x,y,2)而后不妨使用polyval正在t 处预测:y_hat=polyval(p,t)polyfit函数不妨给出置疑区间.[p S]=polyfit(x,y,2) %S中包罗了尺度好[y_fit,delta] = polyval(p,t,S) %依照拟合模型正在t处预测正在每个t处的95%CI为:(y_fit-1.96*delta, y_fit+1.96*delta)2.指数模型也符合假设要拟合:y = a+b*exp(x)+c*exp(x.?2)p=polyfit(x,log(y),2)fminsearch函数fminsearch是劣化工具箱的极小化函数.LS问题的基础思维便是残好的仄圆战(一种范数,由此,LS爆收了许多应用)最小,果此不妨利用fminsearch函数举止直线拟合.假设要拟合:y = a+b*exp(x)+c*exp(x.?2)最先修坐函数,不妨通过m文献或者函数句柄修坐:x=[......]';y=[......]';f=@(p,x) p(1)+p(2)*exp(x)+p(3)*exp(x.?2) %注理念量化:p(1)=a;p(2)=b;p(3)=c;%不妨根据需要采用是可劣化参数%opt=options()p0=ones(3,1);%初值para=fminsearch(@(p) (y-f(p,x)).^2,p0) %不妨输出Hessian矩阵res=y-f(para,x)%拟合残好直线拟合工具箱提供了很多拟合函数,对付大样本场合比较灵验!非线性拟合nlinfit函数clear all;x1=[0.4292 0.4269 0.381 0.4015 0.4117 0.3017]';x2=[0.00014 0.00059 0.0126 0.0061 0.00425 0.0443]';x=[x1 x2];y=[0.517 0.509 0.44 0.466 0.479 0.309]';f=@(p,x) 2.350176*p(1)*(1-1/p(2))*(1-(1-x(:,1).^(1/p(2))).^p(2)).^2.*(x(:,1).^(-1/p(2))-1).^(-p(2)).*x(:,1).^(-1/p(2)-0.5).*x(:,2);p0=[80.5]';opt=optimset('TolFun',1e-3,'TolX',1e-3);%[pR]=nlinfit(x,y,f,p0,opt) 例子例子例子例子例子例子例子例子例子例子例子例子例子例子例子例子直线型例子的一个例子1900-2000年的总人心情况的直线拟合clear all;close all;%cftool提供了可视化的直线拟合!t=[1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000]';y=[75.995 91.972 105.711 123.203 131.669 150.697 179.323 203.212 226.505 249.633 281.4220]';%t太大,以t的幂动做基函数会引导安排矩阵尺度太好,列变量险些线性相依.变更为[-1 1]上s=(t-1950)/50;%plot(s,y,'ro');%返回线:y=a+bxmx=mean(s);my=mean(y);sx=std(s);sy=std(y);r=corr(s,y );b=r*sy/sx;a=my-b*mx;rline=a+b.*s;figure;subplot(3,2,[1 2])plot(s,y,'ro',s,rline,'k');%title('多项式拟合');set(gca,'XTick',s,'XTickLabel',sprintf('%d|',t));%holdon;n=4;PreYear=[2010 2015 2020];%预测年份tPreYear=(PreYear-1950)/50;Y=zeros(length(t),n);res=zeros(size(Y));delta=zeros(si ze(Y));PrePo=zeros(length(PreYear),n);Predelta=zeros(size(Pre Po));for i=1:n [p S(i)]=polyfit(s,y,i); [Y(:,i) delta(:,i)]=polyval(p,s,S(i));%拟合的Y [PrePo(:,i) Predelta(:,i)]=polyval(p,tPreYear,S(i));%预测res(:,i)=y-Y(:,i);%残好end% plot(s,Y);%2009a自动增加分歧颜色% legend('data','regression line','1st poly','2nd poly','3rd poly','4th poly',2)% plot(tPreYear,PrePo,'>');% hold off% plot(Y,res,'o');%残好图r=corr(s,Y).^2 %R^2%拟合缺点预计CIYearAdd=[t;PreYear'];tYearAdd=[s;tPreYear'];CFtit={'一阶拟合','两阶拟合','三阶拟合','四阶拟合'};for col=1:n subplot(3,2,col+2); plot(s,y,'ro',s,Y(:,col),'g-');%本初数据战拟合数据legend('Original','Fitted',2); hold on; plot(s,Y(:,col)+2*delta(:,col),'r:');%95% CI plot(s,Y(:,col)-2*delta(:,col),'r:'); plot(tPreYear,PrePo(:,col),'>');%预测值plot(tPreYear,PrePo(:,col)+2*Predelta(:,col));%预测95% CI plot(tPreYear,PrePo(:,col)-2*Predelta(:,col)); axis([-1.2 1.8 0 400]); set(gca,'XTick',tYearAdd,'XTickLabel',sprintf('%d|',Ye arAdd)); title(CFtit{col}); hold off;endfigure;%残好图for col=1:n subplot(2,2,col); plot(Y(:,i),res(:,i),'o');end一个非线性的应用例子(多元情况)正在百度知讲中,要拟合y=a*x1^n1+b*x2^n2+c*x3^n3%注:不过动做应用,模型纷歧定精确!!!%x2=x3!!!y=[1080.94 1083.03 1162.80 1155.61 1092.82 1099.26 1161.06 1258.05 1299.03 1298.30 1440.22 1641.30 1672.21 1612.73 1658.64 1752.42 1837.99 2099.29 2675.47 2786.33 2881.07]'; x1=[1 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 1.8 1.85 1.9 1.95 2]'; x2=[1 1.025 1.05 1.075 1.1 1.125 1.15 1.175 1.2 1.225 1.250 1.275 1.3 1.325 1.350 1.375 1.4 1.425 1.45 1.475 1.5]'; x3=[1 1.025 1.05 1.075 1.1 1.125 1.15 1.175 1.2 1.225 1.250 1.275 1.3 1.325 1.350 1.375 1.4 1.425 1.45 1.475 1.5]'; x=[x1 x2 x3]; f=@(p,x) p(1)*x(:,1).^p(2)+p(3)*x(:,2).^p(4)+p(5)*x(:,3).^p(6);p0=ones(6,1); p=fminsearch(@(p)sum(y-f(p,x)).^2,p0) res=y-f(p,x); res2=res.^2 %波折的模型。
Matlab最小二乘法曲线拟合

最小二乘法在曲线拟合中比较普遍。
拟合的模型主要有1.直线型2.多项式型3.分数函数型4.指数函数型5.对数线性型6.高斯函数型......一般对于LS问题,通常利用反斜杠运算“\”、fminsearch或优化工具箱提供的极小化函数求解。
在Matlab中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。
在命令提示符后键入:cftool,即可根据数据,选择适当的拟合模型。
“\”命令1.假设要拟合的多项式是:y=a+b*x+c*x^2.首先建立设计矩阵X:X=[ones(size(x)) x x^2];执行:para=X\ypara中包含了三个参数:para(1)=a;para(2)=b;para(3)=c;这种方法对于系数是线性的模型也适应。
2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2)设计矩阵X为X=[ones(size(x)) exp(x) x.*exp(x.^2)];para=X\y3.多重回归(乘积回归)设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。
设计矩阵为X=[ones(size(x)) x t] %注意x,t大小相等!para=X\ypolyfit函数polyfit函数不需要输入设计矩阵,在参数估计中,polyfit会根据输入的数据生成设计矩阵。
1.假设要拟合的多项式是:y=a+b*x+c*x^2p=polyfit(x,y,2)然后可以使用polyval在t处预测:y_hat=polyval(p,t)polyfit函数可以给出置信区间。
[p S]=polyfit(x,y,2) %S中包含了标准差[y_fit,delta] = polyval(p,t,S) %按照拟合模型在t处预测在每个t处的95%CI为:(y_fit-1.96*delta, y_fit+1.96*delta)2.指数模型也适应假设要拟合:y = a+b*exp(x)+c*exp(x.?2)p=polyfit(x,log(y),2)fminsearch函数fminsearch是优化工具箱的极小化函数。
matlab拟合最小二乘法

Ja31 = 49967500*a1 + 1089000*a2 + 25300*a3 + 660*a4 - 27131/100000
Ja41 = 1089000*a1 + 25300*a2 + 660*a3 + 24*a4 - 3987/500000 解线性方程组 Ja11 =0,Ja21 =0,Ja31 =0,Ja41 =0,输入下列程序 >> A=[117186437500, 2386725000,49967500,1089000; 2386725000, 49967500, 1089000,25300; 49967500,1089000,25300, 660; 1089000, 25300, 660,24]; B=[274377591928296252150123/576460752303423488000,31331074233255294718193/28823 03761517117440000,7819978335372091569501/28823037615171174400000, 2298349019433749545307/288230376151711744000000]; C=B/A, f=poly2sym(C) 运行即可得 C= 1.0e-004 * 0.0000 -0.0052 0.2634 0.0178
J= 58593218750*a1^2 + 2386725000*a1*a2 + 49967500*a1*a3 + 1089000*a1*a4 (274377591928296252150123*a1)/576460752303423488000 + 24983750*a2^2 + 1089000*a2*a3 + 25300*a2*a4 - (31331074233255294718193*a2)/2882303761517117440000 + 12650*a3^2 + 660*a3*a4 - (7819978335372091569501*a3)/28823037615171174400000 + 12*a4^2 (2298349019433749545307*a4)/288230376151711744000000 + 520374483464852566590953249225508026224249/33230699894622896822595176507008614 4000000000000 四、求 a1、a2、a3、a4 使 J 达到最小,分别对 a1、a2、a3、a4 求偏导数,使之等于 0 程序如下 syms a1 a2 a3 a4 J=58593218750*a1^2+2386725000*a1*a2+49967500*a1*a3+1089000*a1*a4-(2743775919282 96252150123*a1)/576460752303423488000+24983750*a2^2+1089000*a2*a3 + 25300*a2*a4 (31331074233255294718193*a2)/2882303761517117440000+12650*a3^2+660*a3*a4-(781997 8335372091569501*a3)/28823037615171174400000+12*a4^2-(2298349019433749545307*a4) /288230376151711744000000+520374483464852566590953249225508026224249/332306998 946228968225951765070086144000000000000 Ja1=diff(J,a1); Ja2=diff(J,a2); Ja3=diff(J,a3); Ja4=diff(J,a4); Ja11=simple(Ja1), Ja21=simple(Ja2), Ja31=simple(Ja3), Ja41=simple(Ja4) 运行得
用MATLAB求解人口模型问题

用MATLAB 或Excel通过曲线拟合估计模型参数目的:(1)掌握利用Matlab估计模型参数的一些方法;(2)掌握利用Excel估计模型参数的一些方法。
方法:(1)在Matlab中,最小二乘曲线拟合(lsqcurvefit函数)、多项式拟合(polyfit函数)、曲线拟合攻击(cftool)。
(2)在Excel中,插入图表并添加趋势线。
练习题目:请用Matlab或Excel完成以下模型的参数估计问题,将相关命令、程序代码及运行结果(截图)粘贴在相应题目下方。
练习1:估计人口增长模型中的参数。
下表为美国1790-1990年人口数据(单位:百万)。
年1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890人口 3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9年1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000人口76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 281.4(模型1)指数增长模型:(模型2)阻滞增长模型:x txxxemm rt ()()=+--11(1)用1790~1900年数据估计模型(1)中参数;运行上述代码,得r=0.2743;lnx0=-1.1580,即x0=3.1836.所以1790年到1890年的拟合函数为线性函数ln(x(t))=0.2743t+1.1580 即: x(t)=3.1836e^(0.2743t);(2)用1790~2000年数据估计模型(1)中参数;>> t=[1:22];>> y=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 281.4];>> y=log(y);>> k=polyfit(t,y,1)得r=0.2022;lnx0=1.5970,即x0=4.9382;所以1790年到2000年的拟合函数为线性函数ln(x(t))=0.2022t+1.5970;即: x(t)=4.9382e^(0.2022t);clc;clear;t=[1:22];x(t)=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 281.4];x1=4.9382*exp(0.2022*t);plot(t,x(t),'o',t,x1,'r')legend ('实验数据','拟合曲线');(3)用1790~2000年数据估计模型(2)中参数。
MATLAB人口数量预测

MATLAB人口数量预测实验报告一,实验目的:1.、学会用matlab软件进行数据拟合;2、了解利用最小二乘法进行数据拟合的基本思想,掌握用数据拟合法寻找最佳拟合曲线的方法;3、了解多元函数的机制在数据拟合法中的应用;4、通过对实际问题进行分析研究,初步掌握建立数据拟合数学模型的方法。
二.问题分析及建立模型1.多项式拟合对于已知数据点,如果选用拟合基函数为幂函数类1,x,x2,x3….xm,则拟合函数为一个m次多项式函数。
y=f(x)=a m*x m+a m-1*x m-1+…a1*x+a0根据最小二乘法你和思想,问题归结为求m+1元函数Q(a0,a1,…a m)=∑(a m*x i m a m-1*x i m-1+…+a1*x+a0)2的最小值问题,同样的,利用多元可微函数求得极值的必要条件得到法方程组∂Q(a0,a1,…a m)/∂a k=0; k=0,1,2,3…m;此时,矩阵G为一范德蒙矩阵,解此方程可以求的多项式系数a=[a m,a m-1,a0]T模型假设美国的人口满足函数关系x=f(t), f(t)=e a+bt,a,b为待定常数,根据最小二乘拟合的原理,a,b是函数∑=-=niiix tfbaE12))((),(的最小值点。
其中x i是t i时刻美国的人口数。
这是第一种模型。
3.Logistic模型上述模型可以在短时间内较好地拟合实际人口数量,但也存在问题。
即人口是呈指数规律无止境地增长,此时人口的自然增长率随人口的增长而增长,这不可能。
一般说来,当人口较少时增长得越来越快,即增长率在变大;人口增长到一定数量以后,增长就会慢下来,即增长率变小。
这是因为自然资源环境条件等因素不允许人口无限制地增长,它们对人口的增长起着阻滞作用,而且随着人口的增加,阻滞作用越来越大。
而且人口最终会饱和,趋于某一个常数x,假设人口的静增长率为r(1-x(t)/x ),即人口的静增长率随着人口的增长而不断减小,当t 时,静增长率趋于零。