数值分析
课程设计报告
学生姓名 学生学号 所在班级 指导教师
成绩评定
一、课程设计名称
函数逼近与曲线拟合
二、课程设计目的及要求
实验目的:
⑴学会用最小二乘法求拟合数据的多项式,并应用算法于实际问题。 ⑵学会基本的矩阵运算,注意点乘和叉乘的区别。 实验要求:
⑴编写程序用最小二乘法求拟合数据的多项式,并求平方误差,做出离散函数(𝑥𝑖,𝑦𝑖)和拟合函数的图形;
⑵用MATLAB的内部函数polyfit求解上面最小二乘法曲线拟合多项式的系数及平方误差,并用MATLAB的内部函数plot作出其图形,并与(1)结果进行比较。
三、课程设计中的算法描述
用最小二乘法多项式曲线拟合,根据给定的数据点,并不要求这条曲线精确的经过这些点,而是拟合曲线无限逼近离散点所形成的数据曲线。
(xi,yi)误差思路分析:从整体上考虑近似函数p(x)同所给数据点
rip(xi)yi的大小,常用的方法有三种:一是误差rip(xi)yi绝对值的最大
值maxri,即误差向量的无穷范数;二是误差绝对值的和ri,即误差向量的1
0imi0m范数;三是误差平方和ri2的算术平方根,即类似于误差向量的2范数。前两
i0m种方法简单、自然,但不便于微分运算,后一种方法相当于考虑2范数的平方,此次采用第三种误差分析方案。 算法的具体推导过程: 1.设拟合多项式为:
y=𝑎0+𝑎1𝑥+𝑎2𝑥1+⋯+𝑎𝑘𝑥𝑘
2.给点到这条曲线的距离之和,即偏差平方和:
𝑛
𝑅2=∑[𝑦𝑖−(𝑎0+𝑎1𝑥+⋯+𝑎𝑘𝑥𝑖𝑘)]
𝑖=1
2
3.为了求得到符合条件的a的值,对等式右边求𝑎𝑖偏导数,因而我们得到了:
𝑛
−2∑[𝑦−(𝑎0+𝑎1𝑥+⋯+𝑎𝑘𝑥𝑖𝑘)]𝑥=0
𝑖=1𝑛
−2∑[𝑦−(𝑎0+𝑎1𝑥+⋯+𝑎𝑘𝑥𝑖𝑘)]=0
𝑖=1
⋯⋯
𝑛
−2∑[𝑦−(𝑎0+𝑎1𝑥+⋯+𝑎𝑘𝑥𝑖𝑘)]𝑥𝑘=0
𝑖=1
4.将等式左边进行一次简化,然后应该可以得到下面的等式
𝑛
𝑛
𝑎0𝑛+𝑎1∑𝑥𝑖+⋯+𝑎𝑘∑𝑥𝑖𝑘
𝑖=1
𝑛
𝑛
𝑖=1𝑛
𝑎0∑𝑥𝑖+𝑎1∑𝑥𝑖2+⋯+∑𝑥𝑖𝑘+1
𝑖=1𝑛
𝑖=1𝑛
𝑖=1
𝑛
𝑎0∑𝑥𝑖𝑘+𝑎1∑𝑥𝑖𝑘+1+⋯+𝑎𝑘∑𝑥𝑖2𝑘
𝑖=1
𝑖=1
𝑖=1
5.把这些等式表示成矩阵的形式,就可以得到下面的矩阵:
nnxii1nxiki1xxi1i1nni2ixi1nk1inxyii11a0innxik1a1yi i1i1nan2kkyixii1i1kin6. 将这个范德蒙得矩阵化简后得到
1x11x21xnx1ka0y1ykax212 kaxnkyn7.因为X*AY,那么AY/X,计算得到系数矩阵,同时就得到了拟合曲线。
四、课程设计内容
⑴实验环境:MATLAB2010
⑵实验内容:给定的数据点(𝑥𝑖,𝑦𝑖) 𝑥𝑖 𝑦𝑖 0 1 0.5 1.75 0.6 1.96 0.7 2.19 0.8 2.44 0.9 2.71 1.0 3.00 1) 用最小二乘法求拟合数据的多项式; 2) 用MATLAB内部函数polyfit函数进行拟合。 ⑶实验步骤
1)首先根据表格中给定的数据,用MATLAB软件画出数据的散点图(图1)。 2)观察散点图的变化趋势,近似于二次函数。则用二次多项式进行拟合,取一组基函数𝑥0,𝑥1,𝑥2,并令f(x)=𝑎1𝑥2+𝑎2𝑥+𝑎3,其中𝑎𝑘是待定系数(k=1,2,3)。 3)用MATLAB程序作线性最小二乘法的多项式拟合,求待定系数。 算法实现代码如下:
x=[0 0.5 0.6 0.7 0.8 0.9 1.0]; y=[1 1.75 1.96 2.19 2.44 2.71 3.00]; R=[(x.^2)' x' ones(7,1)]; A=R\\y'
4) 用MATLAB程序计算平均误差。 算法实现代码如下:
y1=[1 1.75 1.96 2.19 2.44 2.71 3.00]; x=[0 0.5 0.6 0.7 0.8 0.9 1.0]; y=x.^2+x+1; z=(y-y1).^2; sum(z)
5) 作出拟合曲线和数据图形(图2)。
6) 用MATLAB的内部函数polyfit求解上面最小二乘法曲线拟合多项式的系数及平方误差。
算法实现代码如下:
x=[0 0.5 0.6 0.7 0.8 0.9 1.0];
y=[1 1.75 1.96 2.19 2.44 2.71 3.00]; A=polyfit(x,y,2);%二次多形式拟合% z=polyval(A,x); A
d=sum((z-y).^2)
7)绘制使用polyfit函数实现的拟合图形。(图3)
五、程序流程图
输入初始数据点 根据原始数据绘制散点图 分析数据点变化趋势,确定拟合多项式 用最小二乘法求系数矩阵,确定多项式 用所求的多项式,计算误差 绘制拟合曲线 图5-1 用最小二乘法求多项式拟合曲线流程图
输入初始数据点 调用polyfit函数,确定多形式的系数 调用polyval函数,进行多项式求值 调用plot函数进行绘图
图5-2 用polyfit函数求多项式拟合曲线流程图
六、实验结果
图6-1 表中数据的散点图
图6-2. 最小二乘法实现的拟合曲线
第1问 系数为
A = 1.0000 1.0000 1.0000 则多项式的方程为y=𝑥2+𝑥+1 平方误差和为 ans =1.9722e-031
图6-3. polyfit函数实现的拟合函数
第2问 系数为
A = 1.0000 1.0000 1.0000 则多项式的方程为y=𝑥2+𝑥+1 平方误差和为 ans = 1.9722e-031
七、实验结果分析
编写程序用最小二乘法求拟合曲线的多项式的过程中,求出的数据和拟合函数的平方误差很小,达到了很高的精度要求,以及通过散点求得的拟合曲线比较
光滑。而用MATLAB的内部函数求polyfit求解的曲线拟合多项式和平方误差与程序求得的相同,还有就是虽然求解过程简单了,但用MATLAB的内部函数做出的图形由明显的尖点,不够光滑。
此次实验数据较少,而且数据基本都是可靠数据。但是在应用实际问题中,数据会很庞杂,此时对于最小为乘法的算法就需要进一步的细化。例如在进行数据采集时,由于数据采集器(各种传感器)或机器自身的原因及其外部各种因素的制约,导致数据偶尔会有大幅度的波动,及产生一些偏差极大的数据,不能真实反映数据的可靠性,所以会对数据进行筛选或修正。而此时就可应用曲线拟合的最小二乘法的进行处理。
八、实验心得体会
在日常的学习和生活中,我们可能会遇到各种方面的跟数据有关的问题,并不是所有的数据都是有用,必须对数据进行适当的处理,然后找出数据之间的关系,然后进行分析得出结果。此次实验结果基本没有大的区别,可是MATLAB提供给我们一个特别简洁的办法,应用一个函数即可实现相同的结果。虽然很方便,但是对于初学者来说,我觉得打好基础才是关键,对于一个知识点,应该掌握其最基本的原理,然后在将它应用于实际。
通过这个实验我也理解到了,数值分析是一个工具学科,它教给了我们分析和解决数值计算问题得方法,使我从中得到很多关于算法的思想,从中受益匪浅。
附录:源代码
散点图:
x=[0 0.5 0.6 0.7 0.8 0.9 1.0]; y=[1 1.75 1.96 2.19 2.44 2.71 3.00]; plot(x,y,'r*')
title('实验数据点的散点图'); legend('数据点(xi,yi)'); xlable('x'); ylable('y'); 最小二乘拟合:
x=[0 0.5 0.6 0.7 0.8 0.9 1.0]; y=[1 1.75 1.96 2.19 2.44 2.71 3.00]; R=[(x.^2)' x' ones(7,1)]; A=R\\y'
x1=[0 0.5 0.6 0.7 0.8 0.9 1.0]; y1=[1 1.75 1.96 2.19 2.44 2.71 3.00]; x=[0 0.5 0.6 0.7 0.8 0.9 1.0]; y=x.^2+x+1;
plot(x1,y1,'k+',x,y,'r')
title('实验数据点的散点图及拟合曲线'); z=(y-y1).^2; sum(z)
Polyfit函数拟合:
x=[0 0.5 0.6 0.7 0.8 0.9 1.0]; y=[1 1.75 1.96 2.19 2.44 2.71 3.00]; A=polyfit(x,y,2);%二次多形式拟合% z=polyval(A,x); A
d=sum((z-y).^2)
plot(x,y,'k+')
title('实验数据点的散点图及拟合曲线'); hold on plot(x,z,'r')
因篇幅问题不能全部显示,请点此查看更多更全内容