最小二乘法曲线拟合原理及maab实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
曲线拟合( curve-fitting ):工程实践中,用测量到的一些离散的数据
{( X, yj,i 0,1,2,...m}求一个近似的函数(x)来拟合这组数据,要求所得的拟合曲线能最好的反映数据的基本趋势(即使(x)最好地逼近f x,而不必满足插值原则。因此没必要取(X)=y i,只要使i (X i) y i尽可能地小)。
原理:
给定数据点{( x i,y i),i 0 ,1 , 2, . . . m} 。求近似曲线( x) 。并且使得近似曲线与f x 的偏差最小。
近似曲线在该点处的偏差i(x i ) y i,i=1,2,...,m 。
常见的曲线拟合方法:
1. 使偏差绝对值之和最小
2. 使偏差绝对值最大的最小
3. 使偏差平方和最小
最小二乘法:
按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。推导过程:
1. 设拟合多项式为:
2. 各点到这条曲线的距离之和,即偏差平方和如下:
3•问题转化为求待定系数a0...a k对等式右边求q偏导数,因而我们得到了:
4、把这些等式化简并表示成矩阵的形式,就可以得到下面的矩阵:
5. 将这个范德蒙得矩阵化简后可得到:
6. 也就是说X*A=Y ,那么A = (X'*X)-1*X'*Y ,便得到了系数矩阵A ,同时,我们也就得到了拟合曲线。
MATLAB 实现:
MATLAB 提供了polyfit ()函数命令进行最小二乘曲线拟合。
调用格式:p=polyfit(x,y,n)
[p,s]= polyfit(x,y,n)
[p,s,mu]=polyfit(x,y,n)
x,y 为数据点,n 为多项式阶数,返回p 为幂次从高到低的多项式系数向量p。x 必须是单调的。矩阵s包括R (对x进行QR分解的三角元素)、df(自由度)、
normr(残差)用于生成预测值的误差估计。
[p,s,mu]=polyfit(x,y,n) 在拟合过程中,首先对x 进行数据标准化处理,以在拟合中消除量纲等影响,mu包含标准化处理过程中使用的x的均值和标准差。polyval( ) 为多项式曲线求值函数,调用格式:y=polyval(p,x)
[y,DELTA]=polyval(p,x,s)
y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值。
[y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计丫 DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则丫 DELTA 将至少包含50%的预测值。
如下给定数据的拟合曲线:x=[0.5,1.0,1.5,2.0,2.5,3.0],
y=[1.75,2.45,3.81,4.80,7.00,8.60]。解:MATLAB 程序如下:
x=[0.5,1.0,1.5,2.0,2.5,3.0];
y=[1.75,2.45,3.81,4.80,7.00,8.60];
p=polyfit(x,y,2) x1=0.5:0.05:3.0;
y1=polyval(p,x1); plot(x,y,'*r',x1,y1,'-b') 运行结果如图1 计算结果为:p =0.5614 0.8287 1.1560 即所得多项式为y=0.5614xA2+0.08287x+1.15560
图1 最小二乘法曲线拟合示例对比检验拟合的有效性:例:在[0, n区间上对正弦函数进行拟合,然后在[0,2 n区间画出图形,比较拟合区间和非拟合区间的图形,考察拟合的有效性。
在MATLAB 中输入如下代码:
clear
x=0:0.1:pi; y=sin(x);
[p,mu]=polyfit(x,y,9) x1=0:0.1:2*pi;
y1=sin(x1);% 实际曲线
y2=polyval(p,x1);%根据由区间0到pi上进行拟合得到的多项式计算0到2pi上的函数值,
%需要注意的是polyval ()返回的函数值在pi到2pi上并没有进行拟合
plot(x1,y2,'k*',x1,y1,'k-')
运行结果:
p =
0.0000 0.0000 -0.0003 0.0002 0.0080 0.0002 -0.1668 0.0000 1.0000 0.0000 mu =
R: [10x10 double]
df: 22 normr: 1.6178e-07
MATLAB 的最优化工具箱还提供了lsqcurvefit ()函数命令进行最小二乘曲线拟合(Solve non li near curve-fitti ng (data-fitti ng) problems in least-squares sense)。
调用格式:
x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
x = lsqcurvefit(problem)
[x,resnorm] = lsqcurvefit(...)
[x,resnorm,residual] = lsqcurvefit(...)
[x,resnorm,residual,exitflag] = lsqcurvefit(...)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(...) [x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(...) [x,resnorm,residual,exitflag,output,lambda,jacobian] = x0 为初始解向量;xdata ,ydata 为满