MATLAB中如何直接曲线拟合,而不使用cftoolGUI界面
(这里使用的版本是MATLAB 2009a
我们知道在MATLAB中有个很方便的曲线拟合工具:cftool
最基本的使用方法如下,假设我们需要拟合的点集存放在两个向量XY中,分别储存着各离散点的横坐标和纵坐标,则在MATLAB中直接键入命令 cftool(X,Y) matlab拟合数据就会弹出Curve Fitting ToolGUI界面,点击界面上的fitting即可开始曲线拟合。
MATLAB提供了各种曲线拟合方法,例如:Exponential, Fourier, Gaussing, Interpolant, Polynomial, Power, Rational, Smoothing Spline, Sum of Functions, Weibull等,当然,也可以使用 Custom Equations.
cftool不仅可以绘制拟合后的曲线、给出拟合参数,还能给出拟合好坏的评价参数(Goodness of fit)SSE, R-square, RMSE等数据,非常好用。但是如果我们已经确定了拟合的方法,只需要对数据进行计算,那么这种GUI的操作方式就不太适合了,比如在m文件中就不方便直接调用cftool
MATLAB已经给出了解决办法,可以在cftool中根据情况生成特定的m文件,让我们直接进行特定的曲线拟合并给出参数。具体方法在帮助文件的如下文档中" \ Curve Fitting Toolbox \ Generating M-files From Curve Fitting Tool " ,以下简单举例说明:
以双球从第125期到第145期蓝球为Y值:
Y=[12 15 4 1 7 11 5 7 1 6 16 1 1 14 2 12 9 13 10 12 11];
X=1:1:21;
cftool(X,Y);
点击Fitting选择最常用的多项式拟合(Polynomial),选择3次多项式拟合(cubic),然后就会出现如下拟合图形:

然后在Curve Fitting Tool窗口中点击 " \ File \ Generate M-file " 即可生成能直接曲线拟合的m函数文件,其中使用的拟合方法就是刚才使用的三次多项式拟合,文件中这条语句证明了这一点:
ft_ = fittype('poly3');
保存该m文件(默认叫做createFit.m),调用方法和通常的m文件一样,使用不同的XY值就能拟合出不同的曲线。但是,这种调用方法只能看到一个拟合出的图形窗口,拟合参数以及Goodness of fit参数都看不到了,因此需要在刚才的m文件中稍作修改。
到这句话:
cf_ = fit(X(ok_),Y(ok_),ft_);
修改为:
[cf_,gof] = fit(X(ok_),Y(ok_),ft_);
然后将函数声明 function createFit(X,Y) 修改为 function [cf_,gof] = createFit(X,Y) ,这样我们再调用试试看:
Y=[12 15 4 1 7 11 5 7 1 6 16 1 1 14 2 12 9 13 10 12 11];
X=1:1:21;
[c,g]=createFit(X,Y);
这样就会弹出拟合图形的窗口,然后再键入cg,就能查看多项式拟合参数及拟合评价参数啦。
cg分别是1×1 cfit 数据类型和1×1 struct 数据类型。本例中c包括p1, p2, p3, p4四个成员,即三次曲线拟合的参数;g包括rmse等成员,即拟合评价参数。如果要在程序中引用这些数据,用法和 C/C++ 一样:
a=c.p1;
se;
MATLAB中直接曲线拟合就讲到这里,相信大家用过一两次后就能熟练使用了。
一、 单一变量的曲线逼近
Matlab有一个功能强大的曲线拟合工具箱 cftool ,使用方便,能实现多种类型的线性、非线性曲线拟合。下面结合我使用的 Matlab R2007b 来简单介绍如何使用这个工具箱。
假设我们要拟合的函数形式是 y=A*x*x + B*x, A>0,B>0
1、在命令行输入数据:
x=[110.3323 148.7328 178.064 202.8258033 224.7105 244.5711 262.908 280.0447 296.204 311.5475]
y=[5 10 15 20 25 30 35 40 45 50]
2、启动曲线拟合工具箱
cftool
3、进入曲线拟合工具箱界面“Curve Fitting tool”
1)点击“Data”按钮,弹出“Data”窗口;
2)利用X dataY data的下拉菜单读入数据x,y,可修改数据集名“Data set name”,然后点击“Create data set”按钮,退出“Data”窗口,返回工具箱界面,这时会自动画出数据集的曲线图;
3)点击“Fitting”按钮,弹出“Fitting”窗口;
4)点击“New fit”按钮,可修改拟合项目名称“Fit name”,通过“Data set”下拉菜单选择数据集,然后通过下拉菜单“Type of fit”选择拟合曲线的类型,工具箱提供的拟合类型有:
Custom Equations:用户自定义的函数类型
Exponential:指数逼近,有2种类型, a*exp(b*x) a*exp(b*x) + c*exp(d*x)
Fourier:傅立叶逼近,有7种类型,基础型是 a0 + a1*cos(x*w) + b1*sin(x*w)
Gaussian:高斯逼近,有8种类型,基础型是 a1*exp(-((x-b1)/c1)^2)
Interpolant:插值逼近,有4种类型,linearnearest neighborcubic splineshape-preserving
Polynomial:多形式逼近,有9种类型,linear ~quadratic ~cubic ~4-9th degree ~
Power:幂逼近,有2种类型,a*x^b a*x^b + c
Rational:有理数逼近,分子、分母共有的类型是linear ~quadratic ~cubic ~4-5th degree ~;此外,分子还包括constant
Smoothing Spline:平滑逼近(翻译的不大恰当,不好意思)
Sum of Sin Functions:正弦曲线逼近,有8种类型,基础型是 a1*sin(b1*x + c1)
Weibull:只有一种,a*b*x^(b-1)*exp(-a*x^b)
选择好所需的拟合曲线类型及其子类型,并进行相关设置:
——如果是非自定义的类型,根据实际需要点击“Fit options”按钮,设置拟合算法、修改待估
计参数的上下限等参数;
——如果选Custom Equations,点击“New”按钮,弹出自定义函数等式窗口,有“Linear Equations线性等式“General Equations构造等式两种标签。
在本例中选Custom Equations,点击“New”按钮,选择“General Equations”标签,输入函数类型y=a*x*x + b*x,设置参数ab的上下限,然后点击OK
5)类型设置完成后,点击“Apply”按钮,就可以在Results框中得到拟合结果,如下例:
general model:
f(x) = a*x*x+b*x
Coefficients (with 95% confidence bounds):
a = 0.009194 (0.009019, 0.00937)
b = 1.78e-011 (fixed at bound)
Goodness of fit:
SSE: 6.146
R-square: 0.997
Adjusted R-square: 0.997
RMSE: 0.8263
同时,也会在工具箱窗口中显示拟合曲线。
这样,就完成一次曲线拟合啦,十分方便快捷。当然,如果你觉得拟合效果不好,还可以在“Fitting”窗口点击“New fit”按钮,按照步骤(4~5)进行一次新的拟合。
不过,需要注意的是,cftool 工具箱只能进行单个变量的曲线拟合,即待拟合的公式中,变量只能有一个。对于混合型的曲线,例如 y = a*x + b/x ,工具箱的拟合效果并不好。下一篇文章我介绍帮同学做的一个非线性函数的曲线拟合。
6)Matlab中如何作线性拟合/线性回归/多元线性回归?
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools #

即用y=a*x+b来拟合一组数据{{x1,y1},{x2,y2}…{xn,yn}}
matlab中使用polyfit
x=data(:,1);
y=data(:,2);
p=polyfit(x,y,1);
p(1)为斜率ap(2)为截距b

多元线性回归即用y=a1*x1+a2*x2+..+am*xm来拟合数据点{x1i,x2i,…xmi,yi}
(i=1~n)

|x11,x21,…xm1|
A=|x12,x22,…xm2|
|…………… |
|x1n,x2n,…xmn|

Y={y1,y2,y3,…,yn}'

则系数{a1,a2,…,am}'=pinv(A)*Y
matlab中使用
coeff=A\Y
则可以得到最小二乘意义上的拟合系数

7)Matlab中如何作圆回归? :#Peter Boettcher (boettcher@ll.mit.edu),2002/5/16, comp.soft-sys.matlab#

Q5.5: How can I fit a circle to a set of XY data?
=================================================


An elegant chunk of code to perform least-squares circle fitting was
written by Bucher Izhak and has been floating around the newgroup for
some time. The first reference to it that I can find is in:

function [xc,yc,R,a] = circfit(x,y)
%CIRCFIT Fits a circle in x,y plane
%
% [XC, YC, R, A] = CIRCFIT(X,Y)
% Result is center point (yc,xc) and radius R.A is an optional
% output describing the circle's equation:
%
% x^2+y^2+a(1)*x+a(2)*y+a(3)=0

% by Bucher izhak 25/oct/1991


n=length(x); xx=x.*x; yy=y.*y; xy=x.*y;
A=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)];
B=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)];
a=A\B;
xc = -.5*a(1);
yc = -.5*a(2);
R = sqrt((a(1)^2+a(2)^2)/4-a(3));

Tom Davis provided a more sophisticated approach that works for more
cases in and Code included.

8)Matlab中如何绘制箭头? :#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, SMTH/MathTools #

www.mathworks/matlabcentral/fileexchange/index.jsp 
2-D Plotting and Graphics中查arrow.m,或者
www.mathworks/matlabcentral/spotlight/arrows.shtml 
www.math.umd.edu/~jec/matcomp/matcompmfiles/mfiles.html 
Matlab中如何作圆回归?
       
        An elegant chunk of code to perform least-squares circle fitting 
        was written by Bucher Izhak and has been floating around the 
        newgroup for some time.  The first reference to it that I can 
        find is in:

                 function [xc,yc,R,a] = circfit(x,y)
                 %CIRCFIT  Fits a circle in x,y plane
                 %
                 % [XC, YC, R, A] = CIRCFIT(X,Y)
                 % Result is center point (yc,xc) and radius R.A is an 
                 % optional output describing the circle's equation:
                 %
                 %   x^2+y^2+a(1)*x+a(2)*y+a(3)=0
 
                 % by Bucher izhak 25/oct/1991
 
                 n=length(x);  xx=x.*x; yy=y.*y; xy=x.*y;
                 A=[sum(x) sum(y) n;sum(xy) sum(yy)...
                    sum(y);sum(xx) sum(xy) sum(x)];
                 B=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)];
                 a=A\B;
                 xc = -.5*a(1);
                 yc = -.5*a(2);
                 R  =  sqrt((a(1)^2+a(2)^2)/4-a(3));


           Tom Davis provided a more sophisticated approach that works 
        for more cases in  and Code included.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。