最小二乘法曲线拟合_原理及matlab实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

曲线拟合(curve-fitting ):工程实践中,用测量到的一些离散的数据

},...2,1,0),,{(m i y x i i =求一个近似的函数)(x ϕ来拟合这组数据,要求所得的拟合曲

线能最好的反映数据的基本趋势(即使)(x ϕ最好地逼近()x f ,而不必满足插值原则。因此没必要取)(i x ϕ=i y ,只要使i i i y x -=)(ϕδ尽可能地小)。

原理:

给定数据点},...2,1,0),,{(m i y x i i =。求近似曲线)(x ϕ。并且使得近似曲线与()x f 的偏差最小。近似曲线在该点处的偏差i i i y x -=)(ϕδ,i=1,2,...,m 。

常见的曲线拟合方法:

1.使偏差绝对值之和最小

2.使偏差绝对值最大的最小

3.使偏差平方和最小

最小二乘法:

按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。

推导过程:

1. 设拟合多项式为:

k

k x a x a a x +++=...)(10ϕ

2. 各点到这条曲线的距离之和,即偏差平方和如下:

3. 问题转化为求待定系数0a ...k a 对等式右边求i a 偏导数,因而我们得到了:

.......

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得出误差估计Y DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则Y DELTA将至少包含50%的预测值。

如下给定数据的拟合曲线:

x=[,,,,,],

y=[,,,,,]。

解:MATLAB程序如下:

x=[,,,,,];

y=[,,,,,];

p=polyfit(x,y,2)

x1=::;

y1=polyval(p,x1);

plot(x,y,'*r',x1,y1,'-b')

运行结果如图1

计算结果为:

p =

即所得多项式为y=^2++

0.51 1.52 2.53

图1 最小二乘法曲线拟合示例

对比检验拟合的有效性:

例:在[0,π]区间上对正弦函数进行拟合,然后在[0,2π]区间画出图形,比较拟合区间和非拟合区间的图形,考察拟合的有效性。

在MATLAB中输入如下代码:

clear

x=0::pi;

y=sin(x);

[p,mu]=polyfit(x,y,9)

x1=0::2*pi;

y1=sin(x1);%实际曲线

y2=polyval(p,x1);%根据由区间0到pi上进行拟合得到的多项式计算0到2pi上的函数值,

%需要注意的是polyval()返回的函数值在pi到2pi上并没有进行拟合

plot(x1,y2,'k*',x1,y1,'k-')

运行结果:

p =

mu =

R: [10x10 double]

df: 22

normr:

MATLAB的最优化工具箱还提供了lsqcurvefit()函数命令进行最小二乘曲线拟合(Solve nonlinear curve-fitting (data-fitting) 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为满足关系ydata=F(x, xdata)的数据;

lb、ub为解向量的下界和上界,若没有指定界,则lb=[ ],ub=[ ];

相关文档
最新文档