Matlab曲线拟合

     最近用Matlab处理实验数据,拟合曲线用的较多。
    
  Excel拟合曲线方程
 
     Excel可以通过画散点图,添加趋势线,对数据进行简单的对数,线性,多项式,指数,幂函数曲线拟合,可能不适用于它们的组合,也就是交复杂的线性;另一种方法是使用加载项中的规划求解,运用统计和数值分析知识,确定目标函数和拟合参数初值,然后求出最优的拟合参数,画出散点图,观看效果。
     第二种方法,可以参考用论文《EXCEL及其规划求解功能拟合曲线方程》    http://ishare.iask.sina.com.cn/f/18741114.html?from=like
   
   Matlab拟合曲线方程
   Matlab拟合曲线,可以使用最优化工具箱里的非线性拟合函数lsqcurvefit(最小二乘法)和 概率论和数理统计工具箱里的非线性回归函数nlinfit函数或nlintool函数,还有直接求最小二乘解,若是多项式的拟合,用ployfit函数。
  
    Matlab的曲线拟合工具箱CFtool使用简介
   详细参见      http://hi.baidu.com/snowlxm/blog/item/15a714b122ae95500823025f.html
    注意的是 cftool  工具箱只能进行单个变量 的曲线拟 
 
 1.  lsqcurvefit
 [x,res] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
其中,fun是在M文件中定义的函数,xdata,ydata为原始数据,x0是函数中参数的初始值,lb、ub分别为变量x的下限、上限;x为参数的最优值,res是x的残差平方和sum((fun(x,xdata)-ydata).^2)
 
1)编写函数文件
 function Thta = hth(x,ht)
 %编写函数M文件,内容如下
%编写完毕,保存为hth.m
 Thta=(x(3)-x(4))./((1+(x(1).*ht).^x(2)).^(1-(1./x(2))))+x(4);

%不运行hth.m,而是进行下一步骤,否则提示x未定义
%在命令窗口输入,以下内容
ht=[0 27.2 53.04 62.56 69.36 81.60 95.20 108.80 126.48 159.12 197.20 251.60 262.48 286.96 359.04 452.88 503.20];
th=[476 434 406 401 392 382 365 351 335 312 287 271 261 253 252 236 234]*0.001;
x0=[0.1 1.5 0.5 0.1];
x1=[0 1 0 0];
x2=[5 5 1 1];
[x resnorm]=lsqcurvefit(@hth,x0,ht,th,x1,x2)
 
2)定义内置函数
      f=inline(fun,'参变量','自变量')
 fx=inline('(x(3)-x(4))./((1+(x(1).*ht).^x(2)).^(1-(1./x(2))))+x( 4)','x','ht');
ht=[0 27.2 53.04 62.56 69.36 81.60 95.20 108.80 126.48 159.12 197.20 251.60 262.48 286.96 359.04 452.88 503.20];
th=[476 434 406 401 392 382 365 351 335 312 287 271 261 253 252 236 234]*0.001;
x0=[0.1 1.5 0.5 0.1];
x1=[0 1 0 0];
x2=[5 5 1 1];
[x,res]=lsqcurvefit(f,x0,ht,th,x1,x2)
y1=fx(x,ht);
plot(th,ht,' o',y1,ht,'-')
 
 
2.nlinfit
   [beta,r,J] = nlinfit(x,y,fun,beta0)
 其中,x,y为原始数据,fun是在M文件中定义的函数,beta0是函数中参数的初始值;beta为参数的最优值,r是各点处的拟合残差,J为雅克比矩阵的数值.
%非线性回归
fun=inline('(x(3)-x(4))./((1+(x(1).*ht).^x(2)).^(1-(1./x(2))))+x(4)','x','ht');
ht=[0 27.2 53.04 62.56 69.36 81.60 95.20 108.80 126.48 159.12 197.20 251.60 262.48 286.96 359.04 452.88 503.20];
th=[476 434 406 401 392 382 365 351 335 312 287 271 261 253 252 236 234]*0.001;
x0=[0.1 1.2 0.5 0.1];
[x,r,J]=nlinfit(ht,th,fun,x0);
x
R=sum(r.^2)                        %误差平方和
y=fun(x,ht);  
plot(th,ht,'*',y,ht,'-r')
 
3.求最小二乘解
 
%函数线性组合的曲线拟合方法
%y(x)=c1+c2*exp(-3*x)+c3*cos(-2*x).*exp(-4*x)+c4*x.^2
x=[0 0.2 0.4 0.7 0.9 0.92 0.99 1.2 1.4 1.48 1.5]';
y=[2.88 2.2576 1.9683 1.9258 2.0862 2.109 2.1979 2.5409 2.9627 3.155 3.2052]';
A=[ones(size(x)),exp(-3*x),cos(-2*x).*exp(-4*x),x.^2];
c=A\y;                                                    %最小二乘解
c1=c'
x0=[0:0.01:1.5]';
A1=[ones(size(x0)),exp(-3*x0),cos(-2*x0).*exp(-4*x0),x0.^2];
y1=A1*c;
plot(x0,y1,x,y,'rx');
 
4.polyfit
 
plot(x,y,n),根据数据x,y得到一个n次拟合多项式P(x)的系数;polyval(p,x)由系数p(从高次到低次顺序)确定的多项式在x个点上的值
x=1:0.5:5;
y=[2.6 3.3 3.7 4.0 4.1 4.0 3.8  3.3 2.8];
p=polyfit(x,y,2)
y1=polyval(p,x);
plot(x,y1,x,y,'ro')

你可能感兴趣的:(matlab)