为一元线性拟合函数,它是曲线拟合最简单的形式。 对实验数据进行线性拟合,用MATLAB实现:
x=[0 1 1;1 2 1;2 3 1;2 4 1;3 5 1;3 6 1;3 7 1;0 1 2;1 2 2;2 3 2;2 4 2;3 5 2;3 6 2;3 7 2;0 1 3;1 2 3;2 3 3;2 4 3;3 5 3;3 6 3;3 7 3] y=[1 3.3 10.66 11.73 22.41 35.14 51.15 1 6.72 18.78 20.6 401.41 630.82 632 1 17 45.56 60.03 7427.24 16155.44 18270.45] [b,int]=regress(y,x) 得到结果
b =
1.0e+003 * -1.8384
24
1.3096 0.6521 int = 1.0e+003 * -7.9005 4.2237 -1.8562 4.4754 -1.2399 2.5440
故y=1000-1838.4x1+1309.6x2+652.1x3
可知线性拟合,拟合效果不好故需进行非线性拟合。 5.2.1.2非线性拟合
解决此类问题有以下几个步骤:(1)首先画出散点图,确定函数的类别;(2)根据已知数据确定待定参数的初始值,利用Matlab软件计算最佳参数;(3)根据可决系数,比较拟合效果,计算可决系数的公式为
R2?1??(yi?1ni?1ni?i)2?y?y)2其中
1ny??yini?1?(yiR2越趋近于1表明拟合效果越好。如果是多项式函数,
则称为多项式回归,此时的参数即多项式的系数;如果为指数函数、对数函数、幂函数或三角函数等,则称为非线性拟合。 最小二乘法
给定平面上的点(xi, yi),(i = 1,2,…,n),进行曲线拟合有多种方法,其中最小二乘法是解决曲线拟合最常用的方法。最小二乘法的原理是:求
f(x),使????i??[f(xi)?yi]22i?1i?1nn 达到最小。
曲线拟合的实际含义是寻求一个函数y=f(x),使f(x)在某种准则下与所有数据点最为接近,即曲线拟合得最好。最小二乘准则就是使所有散点到曲线的距离平方和最小。拟合时选用一定的拟合函数f(x) 形式,设拟合函数可由一些简单的“基函数”(例如三角函数,幂函数等等) ?0(x),?1(x),...,?m(x)来线性表示:
f(x)?c0?0(x)?c1?1(x)?...?cm?m(x)
25
现在要确定系数c0,c1,…,cm,使δ达到极小。为此,将f(x)的表达式代入δ中,δ就成为c0,c1,…,cm的函数,求δ的极小,就可令δ对 ci的偏导数等于零,于是得到m+1个方程组,从中求解出ci。通常取基函数为1,x,x2,x3,…,xm,这时拟合函数f(x)为多项式函数。 数据的n次多项式拟合
x x1 x2 …… xm f(x) y1 x2 …… ym 已知函数在个离散点处的函数值,假设拟合函数是n次多项式,则需要用所给数据来确定下面的函数
y = a0 + a1 x + a2 x 2 + …… + an x n
这里要做一个假设,即多项式的阶数n应小于题目所给数据的数目m。类似前面的推导,可得数据的n次多项式拟合中拟合函数的系数应满足的正规方程组如下
??m?m?xk??k?1??m??xkn??k?1?x?xk?1k?1mmk2k???xkk?1mn?1n???x?k??k?1??mn?1??xk????k?1??????m2n????xk?k?1???mm?a0??yk????k?1???m?a1??xykk?????k?1??????????mn??xy??kk?an????k?1?
从以上方程组可看出,线性拟合方法和二次拟合方法是多项式拟合的特殊情况。从算法上看,数据最小二乘拟合的多项式方法是解一个如下超定方程组的最小二乘解。
?a0?a1x1?a2x12???anx1n?y1?2n?a0?a1x2?a2x2???anx2?y2???????a?ax?ax2???axn?y1m2mnmm( m > n) ?0而多项式拟合所引出的正规方程组恰好是用超定方程组的系数矩阵的转置矩阵
去左乘超定方程组左、右两端所得。正规方程组的系数矩阵是一个病态矩阵,这类方程组被称为病态方程组。当系数矩阵或者是右端向量有微小的误差时,可能引起方程组的准确解有很大的误差。为了避免求解这样的线性方程组,在做多项式拟合时可以将多项式中的各次幂函数做正交化变换,使得所推出的正规方程的系数矩阵是对角矩阵。
26
多项式拟合的一般方法可归纳为以下几步:
(1) 由已知数据画出函数粗略的图形——散点图,确定拟合多项式的次数n;
(2) 列表计算和;
(3) 写出正规方程组,求出a0,a1……an ; (4) 写出拟合多项式
。
5.2.2曲线拟合的MATLAB实现
MATLAB软件提供了基本的曲线拟合函数的命令: 多项式函数拟合: a = polyfit(xdata,ydata,n)
其中n表示多项式的最高阶数,xdata,ydata 为要拟合的数据,它是用数组的方式输入。输出参数a为拟合多项式y = a1xn + … + anx + an+1的系数a = [a1, …, an, an+1]。
多项式在x处的值y可用下面程序计算。 y = polyval (a, x) 5.2.3拟合公式
有上述可知Matlab代码及步骤: clear all,clc,
x1=[1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3];%参数; x2=[0 1 2 2 3 3 3 0 1 2 2 3 3 3 0 1 2 2 3 3 3 8];%高度; x3=[1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 14];%复杂度; y=[1 3.3 10.66 11.73
22.41
35.14
51.15 1 6.72
18.78
20.6
401.41 630.83 632 1 17 46.56 60.03 7427.24 16155.44 18270.45
26000];
%每3个x为一组对应一个y,进行最小二乘法拟合,得到回归方程 format long g Y=y';
X11=[ones(size(x1));10*x3.*x2.*exp(x1);10*x3.*exp(x2);x2.*x1.*exp(x3)]';
27