本文是科学计算与MATLAB语言课程的第5章第5、6小结的学习笔记,通过查阅本文,可以轻松掌握利用MATLAB进行数据拟合了。 E n j o y y o u r r e a d i n g ! Enjoy\ your\ reading! Enjoy your reading!
欢迎大家,收藏⭐,转发,
如有问题、建议请您在评论区留言。
人口增长是当今世界上都关注的问题,对人口增长趋势进行预测是
各国普遍的做法。已知某国1790年到2010年间历次人口普查数据如
下表所示,请预测该国2020年的人口数。
年份 | 1790 | 1800 | 1810 | 1820 | 1830 | 1840 | 1850 | 1860 | 1870 | 1880 | 1890 | 1900 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
人口(百万) | 3.9 | 5.3 | 7.2 | 9.6 | 12.9 | 17.1 | 23.2 | 31.4 | 38.6 | 50.2 | 63.0 | 76.0 |
年份 | 1910 | 1920 | 1930 | 1940 | 1950 | 1960 | 1970 | 1980 | 1990 | 2000 | 2010 | |
人口(百万) | 92.0 | 105.7 | 122.8 | 131.7 | 150.7 | 179.3 | 203.2 | 226.5 | 248.7 | 281.4 | 308.7 |
解题思路:找一个函数,去逼近这些数据,然后再根据找到的函数,计算预测点的值。
x=1790:10:2010;
y=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6, 50.2,63.0,76.0,92.0,105.7,122.8,131.7,150.7,179.3,203.2,226.5,248.7,281.4,308.7];
plot(x,y,'*');
p=polyfit(x,y,3);
polyval(p,2020)
plot(x,y,'*',x,polyval(p,x));
曲线拟合的原理
与数据插值类似,曲线拟合也是一种函数逼近的方法。
x x x | x 1 x 2 . . . x k . . . x n x_1 \ x_2 \ ...x_k...\ x_n x1 x2 ...xk... xn |
---|---|
y y y | y 1 y 2 . . . y k . . . y n y_1\ y_2 \ ...y_k...\ y_n y1 y2 ...yk... yn |
y = f ( x ) y=f(x) y=f(x)
构造函数 g ( x ) g(x) g(x)去逼近未知函数 f ( x ) f(x) f(x),使得误差
δ = g ( x i ) − f ( x i ) ( i = 1 , 2 , 3 , … , n ) \delta=g(x_i)-f(x_i)(i=1,2,3,…,n) δ=g(xi)−f(xi)(i=1,2,3,…,n)在某种意义下达到最小。
两个问题:
(1)用什么类型的函数做逼近函数?
多项式函数
(2)误差最小到底怎么计算?
最小二乘法
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和来寻找数据的最佳函数匹配。
设p(x)是一个多项式函数
p ( x ) = a m x + a m − 1 x m − 1 + … + a 1 x + a o p(x)=a_mx+a_{m-1}x^{m-1}+…+a_1x+a_o p(x)=amx+am−1xm−1+…+a1x+ao,且
∑ i = 1 n ( p ( x i ) − y i ) 2 \sum\limits_{i=1}^n(p(x_i)-y_i)^2 i=1∑n(p(xi)−yi)2的值最小,
则p(x)为原函数y=f(x)的逼近函数。
MATLAB中的多项式拟合函数为polyfit(),其功能为求得最小二乘拟合多项式系数,其调用格式为:
(1)P=polyfit(X,Y,m)
(2)[P,S]=polyfit(X,Y,m)
(3)[P,S,mu]=polyfit(X,Y,m)
根据样本数据X和Y,产生一个m次多项式P及其在采样点误差数据S,mu是一个二元向量,mu(1)是mean(X),而mu(2)是std(X)。
[P,S,mu]=polyfit(X,Y,m)有什么用呢?mean(X)、std(X)又是什么意思呢?。mean函数是一个求数组平均值的函数,std函数是求标准差。
在引例中,我们已经用polyfit()函数预测了某国2020年的人口数。这个结果是否正确呢?我们无法得到2020年的数据,但是2016年的数据已经有了。所以,不妨再预测一下该国2016年的人口数。
polyval(p,2016)
ans=
327.0964
该国2016年人口数实际为323.1。
思考:相对误差1.24%,怎样才能减小?
问题分析:
据研究,一个国家的人口增长具有如下特点:
(1)发展越平稳,人口增长越有规律。
(2)当经济发展到一定水平时,人口增长率反而下降。
换言之,在不同的环境和经济发展水平,人口可能有不同的增长规律。
结论:
在人口增长数据的拟合上,应该将二战后至今这一时期的数据与此前的数据分开处理。
x=1950:10:2010;
y=[150.7,179.3,203.2,226.5,248.7,281.4,308.7];
p=polyfit(x,y,3)
p=polyfit(x,y,2);
plot(x,y,'*',x,polyval(p,x))
polyval(p,2016)
polyval(p,2020)
ans=
325.1696
ans=
336.7857%相对误差成功减小到0.64%!
结论:
(1)要对问题的背景进行详细的分析。
(2)采样点并非越多越好,适当的时候,可以减少采样点,分段进行拟合。
以下是某市家庭收入x与家庭储蓄y之间的一组调查数据(单位:万元),试建立x与y的线性函数经验公式。
x | 0.6 | 1.0 | 1.4 | 1.8 | 2.2 | 2.6 | 3.0 | 3.4 | 3.8 | 4 |
---|---|---|---|---|---|---|---|---|---|---|
y | 0.08 | 0.22 | 0.31 | 0.4 | 0.48 | 0.56 | 0.67 | 0.75 | 0.8 | 1.0 |
x=[0.6,1.0,1.4,1.8,2.2,2.6,3.0,3.4,3.8,4];
y=[0.08,0.22,0.31,0.4,0.48,0.56,0.67,0.75,0.8,1.0];
p=polyfit(x,y,1)
plot(x,y,'*',x,polyval(p,x))
p=
0.2390-0.0418 %经验公式:y=0.239x-0.0418
最后几组数据误差还是挺大的。
那么总结一下,曲线拟合有哪几种功能呢?
(1)估算数据
(2)预测趋势
(3)总结规律
数据拟合和数据插值有什么区别呢?
相同点:
(1)都属于函数逼近的方法;
(2)都可以通过离散有限的数据估算其他数据。
不同点:
(1)实现方法上,数据插值要求逼近函数经过样本点,而曲线拟合只需要每个数据点的误差平方和最小;
(2)结果形式上,数据插值往往没有统一的逼近函数,而数据拟合有统一的逼近函数;
(3)侧重点上,数据插值一般用于样本点区间内的数据计算,而曲线拟合不光可以估算区间内的数据,也可以对区间外的进行预测;
(4)应用场合上,如果样本点为精确数据,使用数据插值比较好,如果数据为统计数据,则使用曲线拟合更优。
曲线拟合和数据插值有所不同,各有侧重。奥里给,学好它,让它为我所用。最后不要忘记
点赞,收藏⭐,转发,
如有问题、建议请您在评论区留言。