所谓多项式拟合,主要是采用多项式函数形式来进行拟合、逼近数据所呈现的趋势.多项式的系数可以采取最小二乘法进行计算.为此大家首先需要了解一下最小二乘的基本原理.
给定历史数据点为(xi,yi),i=0,1,2,…,N,Φ 为所有次数不超过n(n≤N)的多项式构成的函数类.现设某一多项式,可以充分表现数据的趋势,那么它应该满足以下条件:
满足上式的pn(x)称为最小二乘拟合多项式.特别地,当n=1时称为线性拟合或直线拟合.显然R是系数a0,a1,…,an的多元函数,因此上述多项式拟合问题即为求R的极值问题.由多元函数求极值的必要条件,得到如下方程组:
可以证明,由上面方程形成的方程组存在唯一解.从中可以解得多项式的系数aj,j=0,1,2,…,n,从而可得拟合多项式pn(x).R称为最小二乘拟合多项式pn(x)的平方误差,可以作为拟合好坏的一个参数.
多项式拟合的一般步骤可归纳为以下几步:
1.通过已知数据画出数据散点图,确定拟合多项式的次数n;
2.计算;
3.建立多项式系数方程组,求解多项式系数;
4.得到拟合多项式.
例3-2 中国人口预测问题
人类社会进入20世纪以来,在科学技术和生产力飞速发展的同时,世界人口也以空前的规模增长,统计数据如表3-2所示.
表3-2 世界人口统计数据
可以看出,人口每增长10亿的时间,由100年缩短为十几年.大家赖以生存的地球,已经携带着它的60亿子民踏入21世纪.
长期以来,人类的繁殖一直在自发地进行着.只是由于人口数量的迅速膨胀和环境质量的急剧恶化,人们才猛然醒悟,开始研究人类和自然的关系、人口数量的变化规律,以及如何进行人口控制等问题.我国是世界第一人口大国,地球上每9个人中就有1个中国人,表3-3显示了中国人口的统计数据.
表3-3 中国人口统计数据
有效地控制我国人口的增长,不仅是我国全面进入小康社会、到21世纪中叶建成富强民主文明的社会主义国家的需要,而且对于整个人类社会的美好理想来说,也是义不容辞的责任.认识人口数量的变化规律,建立人口模型,作出较准确的预报,是有效控制人口增长的前提.长期以来人们在这方面做了不少工作,下面介绍最基本的人口预测模型.
【解题思路】
首先,使用Matlab软件画出历史数据的散点,如图3-2所示,以便观察数据的增长趋势,确定数据的拟合次数.从图中观测,数据呈现类似二次函数形式的增长趋势.因此针对数据做二次拟合,将得到的拟合曲线与真实数据相比,较如图3-3所示.
图3-2 中国人口散点图
图3-3 中国人口拟合曲线与真实数据图
得到拟合方程式如下所示,其中自变量x表示年份,因变量Y 表示人口数,单位是亿人.
该二次拟合的平方误差为0.56306.无论从图形还是从数据中,都可以发现拟合效果都是比较好的.如果需要预测2001—2010年中国人口的变化,只需要将自变量x以2001—2010代入,即可求出各年的人口预测数据,如下表3-4所示.
表3-4 2001—2010年中国人口预测数据
从例3-2可以发现,通过历史数据呈现的散点图确定拟合多项式的次数对于多项式拟合模型的建立是至关重要的.不同的拟合次数将会得到不同的拟合结果和不同的拟合误差.通过散点图如何确定拟合次数,拟合次数对于拟合结果会造成多大的影响,下面就通过一个题例加以论述.在下例中通过两种不同次数的多项式拟合讨论拟合次数对于结果的影响.
例3-3 城镇化趋势预测问题——CUMCM2007
中国是一个人口大国,人口问题始终是制约我国发展的关键因素之一.根据已有数据,运用数学建模的方法,对中国人口作出分析和预测是一个重要问题.近年来中国的人口发展出现了一些新的特点,例如,老龄化进程加速、出生人口性别比持续升高,以及乡村人口城镇化等因素,这些都影响着中国人口的增长.2007年年初发布的《国家人口发展战略研究报告》还作出了进一步的分析.表3-5列出了1995—2005年间的城镇化比例(数据来自国家统计局人口统计年鉴),试根据以上数据,预测2005年后国家城镇化比例.
表3-5 1995—2005年城镇化趋势数据
【解题思路】
首先,使用Matlab软件画出历史数据的散点,如图3-4所示.
图3-4 城镇化历史数据散点图
针对历史数据采用多项式拟合进行拟合,得到拟合曲线与实际数据如图3-5与图3-6所示.
图3-5 城镇化趋势线性拟合图
图3-6 城镇化趋势二次拟合图
大家可以思考上述两幅图像是否相同,虽然两者看起来很像,都是描述城镇化变化趋势,但是两者的内容截然不同.
●第一幅采用线性函数对城镇化历史数据进行拟合,得到如下拟合方程:
Y=1.4x-2765.7
在上述方程中,自变量x表示年份,因变量Y 表示城镇化比例.函数形式暗示着城镇化比例呈现增加态势,且增长速度稳定.线性拟合的平方误差为0.40665.将需要预测的年份2006—2010年代入,可以预测出该年的城镇化比例,如表3-6所示.
表3-6 2006—2010年城镇化趋势预测数据
●第二幅采用二次函数对城镇化历史数据进行拟合,得到如下拟合方程:
Y=-0.009x2+37x-38663
在上述方程中,自变量x表示年份,因变量Y 表示城镇化比例.二次拟合的平方误差为0.31026.将需要预测的年份2006—2010年代入,可以预测出该年的城镇化比例,如表3-7所示.
表3-7 2006—2010年城镇化趋势预测数据
由此产生了一个疑问:两种不同的拟合方式得到了两种不同的结果.究竟哪一个才是正确的呢?前面已经提到过,在数学建模的世界里没有标准答案.两种拟合方式是否合理,主要取决于平方误差R因子,平方误差越小说明拟合效果越好.但需要注意的是:并不是拟合次数越高,平方误差越小,这是不成正比的.拟合次数过高会形成拟合过度的问题,曾经也有全国大学生数学建模竞赛组委会的老师专门讲到过这个问题.
通过前面两个例题,大家是不是感到很神奇呢?这么容易就解决了预测问题.似乎没有解复杂的系数方程组的过程,这里都是通过数学软件来完成的.可以试想一下如果真手工解系数方程组,那这将是多么复杂的工作啊.
下面就通过几个例题来熟悉建立多项式拟合模型的过程.不同的是在例子中所有的计算都由数学软件Matlab完成,因为求解多项式系数对于软件而言,是一件很轻松的事情.这给建模带来了很大的便利,下面介绍Matlab进行多项式拟合的程序.在Matlab中完成多项式拟合,有两种形式:
1.采用Polyfit,Polyval等命令,编写程序完成拟合工作.
2.在M-file中输入拟合数据,画点图、采用Basic-fitting工具箱进行多项式拟合.
对于想学习Matlab的同学,推荐采用第一种形式,因为在第一种形式中,能够熟悉Matlab的编程风格,以便编写非多项式拟合程序.因为在Basic-fitting中只能做多项式拟合,面对非多项式拟合就束手无策了.在明白预测原理以及过程以后,通过一道例题来演示怎样通过数学Matlab软件进行预测.
Matlab是美国MathWorks公司在20世纪80年代中期推出的数学软件,优秀的数值计算能力和卓越的数据可视化能力使其很快在数学软件中脱颖而出.到目前为止,其最高版本2008版已经推出.随着版本的不断升级,它在数值计算及符号计算功能上得到了进一步完善.Matlab已经发展成为多学科、多种工作平台的功能强大的大型软件.在欧美等高校,Matlab已经成为线性代数、自动控制理论、概率论及数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学工具,是攻读学位的大学生、硕士生、博士生必须掌握的基本技能.
Matlab的主要特点是:有高性能数值计算的高级算法,特别适合矩阵代数领域;有大量事先定义的数学函数,并且有很强的用户自定义函数的能力;有强大的绘图功能以及具有教育、科学和艺术学的图解和可视化的二维、三维图.本书提供了使用Matlab的实践性指导,它基于Matlab2008版,特别是本书对每一条命令的使用格式都作了详细而又简单明了的说明,因此对于初学者自学是很有帮助的.
例3-4 世界人口预测问题
人类社会进入20世纪以来,在科学技术和生产力飞速发展的同时,世界人口也以空前的规模增长,统计数据如表3-8所示.
表3-8 世界人口统计数据
可以看出,人口每增长10亿的时间,由100年缩短为十几年.大家赖以生存的地球,已经携带着它的60亿子民踏入21世纪.长期以来,人类的繁殖一直在自发地进行着.只是由于人口数量的迅速膨胀和环境质量的急剧恶化,人们才猛然醒悟,开始研究人类和自然的关系、人口数量的变化规律,以及如何进行人口控制等问题.根据1625—1999年世界人口数量,预测2000年以后的世界人口发展趋势!
【解题思路】
Matlab三次拟合源程序如下所示:
Year=[1625,1830,1930,1960,1974,1987,1999];%输入自变量——年份
Population=[5,10,20,30,40,50,60];%输入因变量——人口数量
Year1=1625∶2020;%输入需要检验的年份——1625—2020年
Year2=2000∶2020;%输入需要预测的年份
[P2,S2]=polyfit(Year,Population,3)%P2为系数,S2为残差
Population1=polyval(P2,Year1);%计算拟合结果
Population2=polyval(P2,Year2);%计算拟合结果
plot(Year,Population,′*′,Year2,Population2,′X′,Year1,Population1);%画图
legend(′实际数据′,′拟合数据′)
xlabel(′年份′);ylabel(′人口数量(亿人)′)
图3-7 世界人口三次拟合趋势图
在大家进行Matlab上机训练时需要注意一点:Matlab中的标点符号需要在英文输入法下输入,如果在中文输入法下输入将会发生编译错误.这是许多新手容易犯的错误.
上述程序首先输入历史数据,然后调用Polyfit命令,命令中第一个参数表示待拟合数据的自变量,第二个参数表示待拟合数据的因变量,最后一个数字参数表示拟合次数.命令返回的第一个参数P2表示拟合多项式的系数,第二个参数S2表示拟合多项式所产生的误差.执行上述程序后,可以得到三次拟合结果如图3-7所示.
得到相应的三次拟合函数式如下所示,其中自变量x表示年份,因变量Y 表示世界人口数量,单位是亿人.三次拟合的平方误差为2.3274.
将需要预测的年份2001—2020年作为自变量代入上述函数中,便可得到相应年份的预测数据,如表3-9所示.
表3-9 2001—2020年世界人口预测数据
当需要进行二次拟合时,只需将程序稍作修改便可满足要求.
Matlab二次拟合源程序如下所示:
Year=[1625,1830,1930,1960,1974,1987,1999];%输入自变量——年份
Population=[5,10,20,30,40,50,60];%输入因变量——人口数量
Year1=1625∶2020;%输入需要检验的年份——1625—2020年
Year2=2000∶2020;%输入需要预测的年份
[P2,S2]=polyfit(Year,Population,2)%P2为系数,S2为残差
Population1=polyval(P2,Year1);%计算拟合结果
Population2=polyval(P2,Year2);%计算拟合结果
plot(Year,Population,′*′,Year2,Population2,′X′,Year1,Population1);%画图
legend(′实际数据′,′拟合数据′)
xlabel(′年份′);ylabel(′人口数量(亿人)′)
图3-8 世界人口二次拟合趋势图
两者在程序上的改变不大,只是将Polyfit命令的第三个参数由3改为2,但是两者在结果上有着明显的差异,采用二次拟合程序得到的拟合趋势如图3-8所示.
但是在二次趋势拟合图中发现在1700—1750年出现了负人口数的状况,这是与实际不符的.因此在拟合的过程中,需要注意拟合的合理性.上述介绍了通过Polyfit命令拟合的过程,接下来大家看下通过Basic-fitting完成拟合功能的过程.
在Basic-fitting中首先画出历史数据的散点图,分析其所呈现的趋势,程序如下所示:
Year=[1625,1830,1930,1960,1974,1987,1999];%输入自变量——年份
Population=[5,10,20,30,40,50,60];%输入因变量——人口数量
plot(Year,Population,′X′);%画出拟合数据点图
xlabel(′年份′);ylabel(′人口数量(亿人)′)运行程序后,可以得到历史数据散点如图3-9所示.
图3-9 世界人口历史数据散点图
通过Matlab得到历史数据散点图后,在形成的图像窗口菜单栏中有“Tools”栏,点击该栏,在下拉菜单中选择“Basic-fitting”功能,如图3-10所示.在“Basic-fitting”工具栏中有许多多项式拟合以及插值的复选框.选中不同的复选框,在图像中会出项相应的图形.当点击“Show Equation”复选框时会出现相应多项式拟合的函数式,如图3-11所示.
图3-10 Basic-fitting工具箱
图3-11 Basic-fitting工具箱拟合图
在此工具箱中,还可以查看各种不同拟合所形成的不同误差,只需点击相应的复选框即可,如图3-12所示.
图3-12 Basic-fitting不同拟合误差分析图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。