搜档网
当前位置:搜档网 › MATLAB曲线拟合

MATLAB曲线拟合

MATLAB曲线拟合
MATLAB曲线拟合

Mathworks Tech-Note 1508 曲线拟合向导

1.介绍

2. Mathworks 产品的曲线拟合特色

a.曲线拟合工具箱(Curve Fitting Toolbox)

b.Matlab 内建函数与其他的带有曲线拟合能力的附加产品(工具箱)

c.线性曲线拟合

d.非线性曲线拟合

3.加权曲线拟合方法

a.曲线拟合工具箱

b.统计工具箱

c.优化工具箱

4.利用曲线拟合工具箱提高曲线拟合结果

5.其他的相关资料

第1节:简介

MA TLAB即有内建的解决很多通常遇到的曲线拟合问题的能力,又具有附加这方面的产品。本技术手册描述了几种拟合给定数据集的曲线的方法,另外,本手册还解释了加权曲线拟合、针对复数集的曲线拟合以及其他一些相关问题的拟合技巧。在介绍各种曲线拟合方法中,采用了典型例子的结合介绍。

第2节:MathWorks产品的曲线拟合特色

MATLAB有可以用于曲线拟合的内建函数。MathWorks公式也提供了很多工具箱可以用于曲线拟合。这些方法可以用来做线性或者非线性曲线拟合。MATLAB也有一个开放的工具箱――曲线拟合工具箱(Curve Fitting Toolbox),她可以用于参数拟合,也可以用于非参数拟合。本节将介绍曲线拟合工具箱与其他工具箱、以及各种MA TLAB可以用于曲线拟合的内建函数的详细特征。

a.曲线拟合工具箱

曲线拟合工具箱是专门为数据集合进行曲线拟合而设计的。这个工具箱集成了用MA TLAB建立的图形用户界面(GUIs)和M文件函数。

?利用工具箱的库方程(例如线性,二次,高阶多项式等)或者是用户自定义方程(局限于用户的想象力)可以进行参数拟合。当你想找出回归系数以及他们背后的物理意义的时候就可以采用参数拟合。

?通过采用平滑样条或者其他各种插值方法,你就可以进行非参数拟合。当回归系数不具有物理意义并且不在意他们的时候,就采用非参数拟合方法。

曲线拟合工具箱提供了如下功能:

?数据回归,譬如截面(?sectioning)与平滑;

?标准线性最小二乘拟合,非线性最小二乘拟合,加权最小二乘拟合,约束二乘(constrained least squares)拟合以及稳健(robust)拟合;

?根据诸如R2以及误差平方和(SSE)确定的拟合性能的统计特征。

请查阅曲线拟合工具箱提供的demos。

b. MATLAB内建函数与具有曲线拟合能力的其他工具箱

除了曲线拟合工具箱,MATALB与其他工具箱也提供了些可以用于解决线性和非线性曲线拟合的功能。本节列举并解释了其中几个。

c.利用MATLAB内建函数进行线性曲线拟合

函数描述

polyfit 用多项式进行数据拟合。polyfit(X,Y,N)对数据X,Y拟合N阶多项式系数,P(X(I))~=Y(I),在最小二乘意义上。

\ 反斜线或者矩阵阵左除。如果A是一个方阵,A\B 基本上与

inv(A)*B一致的,是采用的不同计算方式而已。

polyval 在给定点计算多项式的值

corrcoef 计算两个向量的相关系数。它可以与polyfit和polyval函数一起用来在实际数据和拟合输出之间计算R2相关系数

下面给出一个利用corref计算R2值的例子:

load census

[p,s]=polyfit(cdate,pop,2);

Output=polyval(p,cdate);

Corrolation=corroef(cate,Output);

cdate 与它自身很好的相关,同样的Output也与它自身很好相关。反对角线上元素是

cdate与Output之间的相关性。这个值非常接近于1,因此实际数据与拟合结果能否较好的吻合。因此,这个拟合是“好”的拟合。(应该是这样判断的么?我怎么觉得应该通过pop与Output的相关性来判断拟合的好坏的呢?)

利用反斜线操作符与polyfit函数进行回归与曲线拟合的更多的例子请参照MA TLAB文档中的Regression and Curve Fitting一节。

附加例子:

数据集:

t = [0 .3 .8 1.1 1.6 2.3]';

y = [0.5 0.82 1.14 1.25 1.35 1.40]';

plot(t,y,'o'), grid on

方法1:多项式回归

基于图形,数据可能通过二次多项式建模如下:

y = a0 +a1*t +a2*t

其中未知系数a0,a1,a2可以通过最小二乘(通过最小化通过模型计算

出来的数据的偏差的平方和)拟合计算。三个未知数6个方程如下:

用6x3的矩阵表示:

X = [ones(size(t)) t t.^2];

则结果通过反斜线操作符得到:

a=X\y

a =

0.5318

0.9191

-0.2387

因此二阶多项式模型为:y = 0.5318+0.9191*t-0.2387*t2

计算模型在均匀空间的值,并将原来的值画在同一个图形上:T=(0:.1:2.5)';

Y=[ones(size(T) T T.^2)]*a;

plot(T,Y,'-'t,y,'o'),grid on

方法2:线性参数回归

建立模型:

X=[ones(size(t)) exp(-t) t.*exp(-t)];

a = X\y;

T=(0:.1:2.5)';

Y=[ones(size(T)) exp(-T) T.exp(-T)]*a;

plot(T,Y,'-',t,y,'o'),grid on

方法3:多元回归

如果y是一个包含多个独立变量的函数,表示变量间的相邻关系的矩阵方程可以通过附加数据进行扩展。

假设我们测量参数x1、x2的少数几个值的输出y,观测值如下:

x1 = [.2 .5 .6 .8 1.0 1.1]';

x2 = [.1 .3 .4 .9 1.1 1.4]';

y = [.17 .26 .28 .23 .27 .24]';

本数据的一个多元模型是:

多元回归解决的是通过最小二乘拟合求未知系数a0,a1,a2。通过构造回归矩阵X 构造和解决同步方程,依然采用反斜线操作符。

X=[ones(size(x1)) x1 x2];

a=X\y;

为了评价模型,求取绝对误差的最大值:

Y = X *a;

MaxErr = max(abs(Y-y));

实例分析:曲线拟合(本节来自matlab的在线帮助文档)本节提供了以实际数据分析形式的在MA TLAB中的数据分析基本能力的概貌。下面的例子是以收集的人口普查数据为基础,采用MATLAB函数对数据进行实验拟合:?多项式拟合

?残差分析

?指数拟合

?误差界限

1.导入数据

load census (census.mat包含了美国1790年到1990年的人口数据)

其中包括两个变量:cdate与pop

cdate 是从1790以10递增到1990的一个列向量,是年份数;

pop 是cdate中年份相应的人口数据向量

2.多项式拟合

首先我们想通过简单的多项式对普查数据进行拟合。利用MA TLAB中的两个函数进行处理:polyfit 与polyval 。

polyfit函数是在给定阶次多项式上对数据进行最小二乘意思上的最优拟合。假设采用4阶多项式,拟合过程为:

>> p=polyfit(cdate,pop,4)

Warning: Polynomial is badly conditioned. Remove repeated data points

or try centering and scaling as described in HELP POL YFIT.

p = 1.0e+005 *

0.0000 -0.0000 0.0000 -0.0126 6.0020

警告的产生是因为polyfit函数用很大的值cdate作为基本数据,用他来产生范德蒙矩阵(Vandermonde matrix),具体细节的可以在polyfit的m文件中看到。cdate的展开导致尺度标准问题,一个解决办法就是标准化cdate数据。

预处理:标准化数据

标准化处理是为了提高后期数值计算精度而进行的尺度变化处理。一个处理办法是:sdate=(cdate-mean(cdate))./std(cdate);

然后再以标准化后数据进行4阶多项式拟合:

>> p=polyfit(sdate,pop,4)

p = 0.7047 0.9210 23.4706 73.8598 62.2285

通过图形我们来观察其拟合的好坏:

>> pop4=polyval(p,sdate);

>> plot(cdate,pop4,'-',cdate,pop,'+'), grid on

另外一个规范化数据的方法就是通过结果与单位的知识进行转换。如,对于本数据集,选择1790作为0年也可以得到较为满意的解。

3.残差分析

一个评价拟合好坏的测度就是残差――观测值与预测值的差异。对不同的拟合,利用残差进行比较。从拟合图形和残差上,我们显而易见,采用标准化数据比简单的多项式可能对数据有更好的拟合。

利用如下命令,分别对数据进行1阶,2阶,4阶的拟合,作图,并比较其残差:>> load census

>> sdate=(cdate-mean(cdate))./std(cdate);

>> p1=polyfit(sdate,pop,1);

>> pop1=polyval(p1,sdate);

>> plot(cdate,pop1,'b-',cdate,pop,'g+');

>> res1=pop-pop1;

>> figure,plot(cdate,res1,'g+');

>> p=polyfit(sdate,pop,2);

>> pop2=polyval(p,sdate);

>> figure,plot(cdate,pop2,'b-',cdate,pop,'g+')

>> res2=pop-pop2;

>> figure,plot(cdate,res2,'g+');

>> p=polyfit(sdate,pop,4);

>> pop4=polyval(p,sdate);

>> figure,plot(cdate,pop4,'b-',cdate,pop,'g+')

>> res4=pop-pop4;

>> figure,plot(cdate,res4,'g+');

>> max(abs(res1))

ans = 41.3987

>> max(abs(res2))

ans = 7.5361

>> max(abs(res4))

ans = 6.3455

4.指数拟合

看前面的人口图形,发现人口数据曲线有些与指数曲线相似。利用这一点,我们试着对人口数据值的对数进行拟合,依然采用前面的标准化方法。

>> logp1=polyfit(sdate,log10(pop),1);

>> logpred1=10.^polyval(logp1,sdate);

>> semilogy(cdate,logpred1,'-',cdate,pop,'+'); grid on

>> logp2=polyfit(sdate,log10(pop),2);

>> logpred2=10.^polyval(logp2,sdate);

>> figure,semilogy(cdate,logpred2,'-',cdate,pop,'+');grid on

>> logres2=log10(pop)-polyval(logp2,sdate);

>> figure,plot(cdate,logres2,'+');

>> r=pop-10.^(polyval(logp2,sdate));

>> figure ,plot(cdate,r,'+')

可以看出,残差更加随机性强一些。或许,残差随着人口数的增加而在数量级方面增长很快,但是总体而言,对数模型提供了更精确的拟合。

5.误差界限

误差界限对于判别你的拟合是否是个合理的模型很有用。你可以通过从polyfit选择任意两个输出参数作为polyfit的两个输入参数。

本例子采用普查例子断乎机和前面讲的规范化方法,利用polyfit和polyval得到二阶多项式模型的误差界限。对年度值进行规范化,本例子采用+-2△间隔,相应的其置信度的95%。

>> load census

>> sdate=(cdate-mean(cdate))./std(cdate);

>> [p2,S2]=polyfit(sdate,pop,2);

>> [pop2,del2]=polyval(p2,sdate,S2);

>> plot(cdate,pop,'+',cdate,pop2,'g-',cdate,pop2+2*del2,'r:',cdate,pop2-2*del2,'r:'),grid on

优化工具箱的利用(接1)

函数描述

LSQLIN 有约束线性最小二乘优化

LSQNONNEG 非负约束线性最小二乘优化问题

当有约束问题存在的时候,应该采用上面的方法代替Polyfit与反斜线(\)。具体例子请参

阅优化工具箱文档中的相应利用这两个函数的例子。

d. 非线性曲线拟合

利用MATLAB的内建函数

函数名描述

FMINBND 只解决单变量固定区域的最小值问题

FMINSEARCH 多变量无约束非线性最小化问题(Nelder-Mead 方法)。

下面给出一个小例子展示一下如何利用FMINSEARCH

1.首先生成数据

>> t=0:.1:10;

>> t=t(:);

>> Data=40*exp(-.5*t)+rand(size(t)); % 将数据加上随机噪声2.写一个m文件,以曲线参数作为输入,以拟合误差作为输出function sse=myfit(params,Input,Actural_Output)

A=params(1);

lamda=params(2);

Fitted_Curve=A.*exp(-lamda*Input);

Error_Vector=Fitted_Curve-Actural_Output;

% 当曲线拟合的时候,一个典型的质量评价标准就是误差平方和

sse=sum(Error_Vector.^2);

%当然,也可以将sse写作:sse=Error_Vector(:)'*Error_Vector(:);

3.调用FMINSEARCH

>> Strarting=rand(1,2);

>> options=optimset('Display','iter');

>> Estimates=fiminsearch(@myfit,Strarting,options,t,Data);

>> plot(t,Data,'*');

>> hold on

>> plot(t,Estimates(1)*exp(-Estimates(2)*t),'r');

Estimates将是一个包含了对原数据集进行估计的参数值的向量。

附图见后面:

FMINSEARCH通常能够用来解决不连续情况,特别是如果他们不出现在解的附近的时候。它得到的通常也是局部解。FMINSEARCH只能够最小化实数值(也就是说,解的域必须只能包括实数,函数的输出只能够为实数值)。当感兴趣的是复数变量的域的时候,他们必须被分割为实部与虚部。

MATLAB的FIGURE窗口:最基本的拟合界面与数据统计工具

MATLAB通过基本的拟合界面也支持基本曲线拟合。利用这个界面,你可以快速地在简单易用的环境中实现许多基本的曲线拟合。这个界面可以实现以下功能:a.通过比样条插值(spline interpolant)、hermite 插值、或者是高达10阶的多项式插值实现数据的拟合;

b.对给定数据同时实现多样插值的绘制;

c.绘制残差图;

d.检查拟合结果的残差的数值;

e.通过内插值或者外推插值评价一个拟合结果;

f.对拟合结果和残差的模进行图形绘制;

g.将拟合结果保存入MA TLAB工作空间。

开发你的拟合应用的时候,你可以通过基本拟合(Basic Fitting)界面,也可以通过命

令行函数,也可以同时作用。你可以通过基本拟合界面只能够实现2-D数据的拟合。然而,如果你用subplot绘制多个数据集,只要有至少一个数据集是2D的,那么就可以用基本拟合界面。

可以通过如下步骤激活基本拟合界面:

1.绘制数据;

2.从figure窗口的Tools菜单条下面选择Basic Fitting菜单项;

有关Basic Fitting界面的更多信息,请查阅MA TLAB帮助文档的相应部分。

注意:对于HP,IBM以及SGI平台,MA TLAB6.0(R12.0)以及MA TLAB6.1(R12.1)的基本拟合界面不受支持。

数据统计界面可以用来对图形中的每个数据集进行统计量的计算。可以通过如下步骤将数据统计界面激活:

1.制数据;

2.从figure窗口的Tools菜单条下面选择Data Statistics菜单项;

优化工具箱函数

LSQNONLIN 解决非线性最小二乘法问题,包括非线性数据拟合问题

LSQCURVEFIT 解决非线性数据拟合问题

下面给出利用这两个函数的例子:

LSQNONLIN:利用这个函数最小化连续函数只能够找到句柄解。下面的例子说明利用LSQNONLIN函数用下面的函数进行拟合:

f = A + B exp(C*x)+D*exp(E*x)

对数据集x与y进行拟合,其中y是在给定x的情况下的期望输出。为了解决这个问题,先建立下面的名为fit_simp.m的函数,它利用数据x与y,将他们作为优化输入参数传递给LSQNONLIN。利用给定的数据x计算f的值,再与原始数据y进行比较。经验值与实际计算出的值之间的差异作为输出值返回。LSQNOLIN函数就是最小化这些差的平方和。

function diff = fit_simp(x,X,Y)

% 此函数被LSQNONLIN调用

% x 是包含等式系数的向量

% X 与Y 是作为操作数传递给lsnonlin

A = x(1);

B = x(2);

C = x(3);

D = x(4);

E = x(5);

diff = A + B.*exp(C.*X)+D.*exp(E.*X)-Y;

下面的脚本是利用上面定义的fit_simp.m函数的一个例子:

%定义你打算拟合的数据集合

>> X=0:.01:.5;

>> Y=2.0.*exp(5.0.*X)+3.0.*exp(2.5.*X)+1.5.*rand(size(X));

%初始化方程系数

>> X0=[1 1 1 1 1]';

%设置用中等模式(memdium-scale)算法

>> options=optimset('Largescale','off');

%通过调用LSQNONLIN重现计算新的系数

>> x=lsqnonlin(@fit_simp,X0,[],[],options,X,Y);

%调用LSQNONLIN结果输出表明拟合是成功的

Optimization terminated successfully:

Gradient in the search direction less than tolFun

Gradient less than 10*(tolFun+tolX)

%绘制原始数据与新的计算的数据

>> Y_new=x(1)+x(2).*exp(x(3).*X)+x(4).*exp(x(5).*X);

>> plot(X,Y,'+r',X,Y_new,'b');

注意:LSQNONLIN 只可以处理实数变量。在处理包括复数变量的实例的拟合的时候,数据集应该被切分成实数与虚数部分。下面给出一个例子演示如何对复数参数进行最小二乘拟合。

为了拟合复数变量,你需要将复数分解为实数部分与虚数部分,然后把他们传递到函数中去,这个函数被LEASTSQ作为单个输入调用。首先,将复数分解为实部与虚部两个向量。其次,将这两个向量理解成诸如第一部分是实部、第二部分是虚部。在MA TLAB函数中,重新装配复数数据,并用你想拟合的复数方程计算。将输出向量分解实部与虚部,将这两部分连接为一个单一的输出向量传递回LEASTSQ。下面,给出一个例子演示如何根据两个复数指数拟合实数X与Y。

建立方程:

function zero = fit2(x,X,Y)

% 根据输入x重建复数输入

cmpx = x(1:4)+i.*x(5:8);

% 利用复数计算函数

zerocomp = cmpx(1).*exp(cmpx(2).*X) + cmpx(3).* exp(cmpx(4).*X)-Y;

% 将结果转换成一个列向量

% 其中第一部分是实部,第二部分是虚部

numx = length(X); % 实部长度

zero=real(zerocomp); %实部

zero(numx+1:2*numx)=imag(zerocomp); % 虚部

为了评价计算这个函数,需要X与Y数据集。LSQNONLIN将根据它拟合出下面方程中的参数a,b,c与d:

Y = a*exp(b*X)+c*exp(d*X);

其中,a,b,c与d是复数变量。

>> X=0:.1:5;

>> Y=sin(X);

>> Y=Y+.1*rand(size(Y))-.05;

>> cmpx0=[1 i 2 2*i];

>> x0(1:4)=real(cmpx0);

>> x0(5:8)=imag(cmpx0);

>> x=leastsq(@fit2,x0,[],[],X,Y);

>> cmpx=x(1:4)+i.*x(5:8);

>> Y1=real(cmpx(1).*exp(cmpx(2).*X)+cmpx(3).*exp(cmpx(4).*X));

>> plot(X,Y1,'r');

>> hold on

>> plot(X,Y,'+');

LSQCURVEFIT:利用此函数可以在最小二乘意义上解决非线性曲线拟合(数据拟合)问题。也就是说,给定输入数据xdata,以及观测的输出数据ydata,找到系数x,使得函数F(x,xdata)能够最好的拟合向量值。LSQCURVEFIT利用与LSQNONLIN相同的算法。它的目的在于专门为数据拟合问题提供一个接口。

在拟合的时候,2维、3维或者N维参数拟合是没有什么差别的。下面给出一个3维参数拟合的例子。待拟合函数是:

z = a1*y.*x..^2+a2*sin(x)+a3*y.^3;

建立的myfun.m的函数如下:

function F = myfun(a, data);

x = data(1,:);

y = data(2,:);

F= a(1)*y.*x.^2+a(2)*sin(x)+a(3)*y.^3;

下面的脚本展示了这么利用上面的函数:

>> xdata= [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];

>> ydata= [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];

>> zdata= [95.09 23.11 60.63 48.59 89.12 76.97 45.68 1.84 82.17 44.47];

>> data=[xdata; ydata];

>> a0= [10, 10, 10]; % 初识揣测

>> [a, resnorm] = lsqcurvefit(@myfun,a0,data,zdata)

Maximum number of function evaluations exceeded;

increase options.MaxFunEvals

a = 0.0088 -34.2886 -0.0000

resnorm = 2.2636e+004

>> format long

>> a

a = 0.00881645527493 -34.28862491919983 -0.00000655131499

>> option=optimset('MaxFunEvals',800);

>> [a, resnorm] = lsqcurvefit(@myfun,a0, data, zdata, [], [], option)

Optimization terminated successfully:

Relative function value changing by less than OPTIONS.TolFun

a = 0.00740965259653 -20.21201417111138 -0.00000502014964

resnorm = 2.195886958305428e+004

统计工具箱函数

函数名描述

nlinfit(非线性回归)采用Gauss-Newton法进行非线性最小二乘数据拟合lscov(线性回归)根据已知协方差矩阵进行最小二乘估计

regress 多元线性回归

regstats 回归诊断

ridge 脊回归(?Ridge regress)

rstool 多维响应表面可视化(RSV)

stepwise 交互式逐步回归

具体例子请参阅相应文档

第3节加权曲线回归方法

当拟合数据包含随机变量时,通常在针对误差有两个主要假设:

●误差只在响应数据中存在,而不在预测数据中存在;

●误差是满足零均值常数方差正态分布的数据变量。

第二条假设方差为常数严重影响野点的出现。因为野点原来真实模式数据,他们可能引起真实拟合的潜在错误。为了改善拟合,你可以领用附加的尺度因子(也就是权值)来提高拟合的质量。将野点的权值设置得比较小,因此可以获得较好的拟合。

你可以利用下面的三个工具箱来实施加权拟合。

a.Curve Fitting Toolbox

此工具箱对线性与非线性数据有通用的最小二乘拟合能力。权值是操作数设置

中的一部分,你可以通过fitoptions进行设置。在曲线拟合工具箱中,权值可以

是与数据相联系的一个权向量。

b.Statistics Toolbox

统计工具箱中的robustfit 函数具有加权自动回归的能力。robustfit采用robust

回归对数据进行拟合,其输出为回归系数。它也可以进行线性加权回归。调用

语法结构是:ROBUSTFIT(X,Y,'WFUN',TUNE,'CONST')

c.Optimization Toolbox

你也可以利用优化工具箱的最小二乘求解器-----LSQNONLIN和LSQCURVEFIT

函数实施加权最小二乘拟合。为了利用LSQNONLIN和LSQCURVEFIT实现加

权最小二乘拟合,你需要针对你的拟合数据建立起一个方程。你可以在Solution

27840中找到相应的例子。

附:Solution 27840

如何利用优化工具箱的LSQNONLIN函数实现加权最小二乘拟合

例子:

1.制造准备拟合的样本数据。在本例子中,数据是叠加了噪声的负指数模型:>> xdata=0:.01:1;

>> ydata=exp(-3*xdata)+randn(size(xdata))*.05;

2.在图形中查看数据,即用plot画出xdata与ydata,用蓝色的点表示:

>> plot(xdata,ydata,'b.');

3.建立一个函数作为LSQNONLIN的输入,该函数包含你打算拟合的数据的方程。

建立名为Mycurve.m的m文件:

function err_weithted = mycurv(parameter, real_x,real_y)

% 想拟合的方程是: exp(parameter*xdata)

% 其中,parameter是未知的

% fit = exp(parameter*real_x);

fit = exp(parameter*real_x);

err = fit -real_y;

% 对误差进行加权

% 在本例子中,,我们只对最后一项进行加权,并设置其他的项为0(这将

%使得例子根据清楚)

weight = [zeros(1,length(real_x)-1) 1]; % 误差向量的权重

err_weithted = err.*weight;

4.调用优化程序,返回parameter_hat 参数

>> parameter_hat = lsqnonlin(@mycurv,3,[],[],[],xdata,ydata)

Optimization terminated successfully:

First-order optimality less than OPTIONS.TolFun, and no

negative/zero curvature detected

parameter_hat = -11.18559914772636

parameter_hat 返回利用m文件Mycurv的指定方程的产生值。

5.获取了拟合的方程式,将parameter_hat带入指数方程,并在同一张图上画出。

>> fitted = exp(parameter_hat*xdata); hold on

>>plot(xdata,fitted,'ro');

>>parameter_hat2 = lsqnonlin(@mycurv,3,[],[],[],xdata,ydata) %不加权拟合

>>fitted2 = exp(parameter_hat2*xdata);

>>plot(xdata,fitted2,'y-');

>>legend('待拟合数据','加权拟合结果','直接拟合结果');

比较拟合结果可以看出不加权时,曲线从所有数据点的中间穿过去(如黄色的线所示)。加权的时候,拟合曲线只通过最后一个点(因为只有该点权值非0)。

第4节:利用Curve Fitting Toolbox改善拟合结果

很多因素对曲线拟合造成影响。下面列出各种提示有助于你提高拟合质量:

●模型的选择:或者从MATLAB的模型库、或者用户自定义的模型的选择,是最主

要的一个因素,试着用各种不同的模型对你的数据进行拟合比较;

●数据预处理:在拟合前对数据进行预处理也很有用。这包括:

▲对响应数据进行变换

▲剔除Infs,NaNs,以及野点

更多的细节请查阅Curve Fitting Toolbox的文档。

●合理的拟合应该具有处理出现奇异而使得预测趋于无穷大的时候的能力。

具体细节请查阅Curve Fitting Toolbox的文档

●如果你提供越多的系数的估计信息,你的拟合越容易收敛。下面的提示有利于你

加快拟合的速度,提高拟合的精度:

▲在开始拟合的时候进行一些智能的揣测。如果你认为系数可能是某些值,那么就用那些值作为起始值

▲如果缺少起始值的信息,试着用大量不同的起始值

▲尽量重复训练参数。例如,如果你知道参数必须是正的,那么设置它的下限是0使得循环拟合过程。

▲调整各种拟合操作数,例如:

a. 采用不同的算法

b. 增加迭代与函数评价的次数

c. 减小容许误差

▲将数据分解为几个子集,对不同的子集采用不同的曲线拟合

●复杂的问题最好通过进化的方式解决,即一个问题的少量独立变量先解决。低阶

问题的解通常通过近似映射作为高阶问题解的起始点。例如,如果你的模型最

好被描述为:

y = c + a * exp(b*x) +d * sin(f*x)

那么它经常最好每次拟合一个项,通常从最重要的项开始。你可以先拟合: y = c1 + a1 * exp(b1*x)

然后利用拟合出的结果系数作为上式中的a,b,c的起始值进行完整的拟合。

第5节:其他相近方法

或许MATLAB 2002年2月的News and Notes 杂志中有关曲线拟合的文章:Atmospheric Carbon Di-Oxide Modeling and the Curve Fitting Toolbox 或许对你有用。

附:一个用fminsearch进行园的拟合的例子:

function [xc,yc,r,fval,exitflag,output] = tlscirc(x,y)

% TLS circle fit

options=optimset('TolFun',1e-10);

[x0,y0]=circfit(x,y); % center estimate

[z,fval,exitflag,output]=fminsearch(@circobj,[x0,y0],options,x,y);

[f,r]=circobj(z,x,y); xc=z(1); yc=z(2);

function [f,r] = circobj(z,x,y)

% TLS circle fit objective f and radius r

n=length(x);

X=x-z(1); Y=y-z(2); X2=X'*X; Y2=Y'*Y;

r=sum(sqrt(X.^2+Y.^2))/n; f=X2+Y2-n*r^2;

The circfit function is used above as an initial estimator. The

objective values of tlscirc and circfit differ by nearly 14% in the

example below.

x=[1;2;3;5;7;9]; y=[7;6;7;8;7;5];

plot(x,y,'bo'), hold on

[xc,yc,r,f]=tlscirc(x,y)

% [xc,yc,r,f]=[4.7398, 2.9835, 4.7142, 1.2276]

rectangle('Position', [xc-r,yc-r,2*r,2*r], 'Curvature', [1,1],'EdgeColor','b')

[xc,yc,r] = circfit(x,y)

X=x-xc; Y=y-yc; f=sum((sqrt(X.^2+Y.^2)-r).^2)

% [xc,yc,r,f]=[4.7423, 3.8351, 4.1088, 1.3983]

rectangle('Position', [xc-r,yc-r,2*r,2*r], 'Curvature', [1,1],'EdgeColor','r')

hold off, axis equal

Genial @ USTC

2004-4-17

MATLAB曲线拟合的应用

MATLAB曲线拟合的应用 王磊品吴东 新疆泒犨泰克石油科技有限公司新疆油田公司准东采油厂信息所 摘要:1.阐述MATLAB数学分析软件的基本功能; 2.对MATLAB在生产数据分析中的应用进行了研究,指出曲线拟合的基本方法; 3.以实例阐明MATLAB与行业生产数据结合对生产数据进行分析的原理。 关键词:MATLAB;曲线拟合;插值 1.引言 在生产开发过程中,复杂的生产数据之间或多或少的存在着这样或者那样的联系,如何利用现今普及的计算机以及网络资源在最短的时间内找到这个联系,以指导我们的生产开发,这对于行业科研人员来说无疑是一个最为关心的问题。MATLAB矩阵分析软件,自推出以来,已成为国际公认的最优秀的数学软件之一,其范围涵盖了工业、电子、医疗以及建筑等各个领域,以其强大的科学计算功能使众多科研机构纷纷采用。 为此,本文从介绍MATLAB软件开始,以实例讲述如何使用MATLAB对生产开发数据进行计算与分析,从而达到高效、科学指导生产的目的。 2.MATLAB简介 MATLAB是MathWorks公司于1982年推出的一套高性能的数值计算和可视化数学软件。由于使用编程运算与人进行科学计算的思路和表达方式完全一致,所以不象学习其它高级语言那样难于掌握,用Matlab编写程序犹如在演算纸上排列出公式与求解问题,所以又被称为演算纸式科学算法语言。在这个环境下,对所要求解的问题,用户只需简单地列出数学表达式,其结果便以数值或图形方式显示出来。 MATLAB的含义是矩阵实验室(MATRIX LABORATORY),主要用于方便矩阵的存取,其基本元素是无须定义维数的矩阵。自问世以来, 就是以数值计算称雄。MATLAB进行数值计算的基本单位是复数数组(或称阵列),这使得MATLAB高度“向量化”。经过十几年的完善和扩充,现已发展成为线性代数课程的标准工具。由于它不需定义数组的维数,并给出矩阵函数、特殊矩阵专门的库函数,使之在求解诸如信号处理、建模、系统识别、控制、优化等领域的问题时,显得大为简捷、高效、方便,这是其它高级语言所不能比拟的。美国许多大学的实验室都安装有供学习和研究之用。 MATLAB中包括了被称作工具箱(TOOLBOX)的各类应用问题的求解工具。工具箱实际上是对MATLAB进行扩展应用的一系列 MATLAB函数(称为M文件),它可用来求解各类学科的问题,包括信号处理、图象处理、控制系统辨识、神经网络等。随着 MATLAB版本的不断升

MATLAB中如何直接曲线拟合

MATLAB中如何直接曲线拟合,而不使用cftool的GUI 界面 我们知道在MATLAB中有个很方便的曲线拟合工具:cftool 最基本的使用方法如下,假设我们需要拟合的点集存放在两个向量X和Y中,分别储存着各离散点的横坐标和纵坐标,则在MATLAB中直接键入命令 cftool(X,Y) 就会弹出Curve Fitting Tool的GUI界面,点击界面上的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文件一样,使用不同的X和Y值就能拟合出不同的曲线。但是,这种调用方法只能看到一个拟合出的图形窗口,拟合参数以及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;

[整理]matlab拟合工具箱的使用.

matlab拟合工具箱使用 2011-06-17 12:53 1.打开CFTOOL工具箱。在Matlab 6.5以上的环境下,在左下方有一个"Start"按钮,如同Windows的开始菜单,点开它,在目录"Toolboxes"下有一个"Curve Fitting",点开"Curve Fitting Tool",出现数据拟合工具界面,基本上所有的数据拟合和回归分析都可以在这里进行。也可以在命令窗口中直接输入”cftool”,打开工具箱。 2.输入两组向量x,y。 首先在Matlab的命令行输入两个向量,一个向量是你要的x坐标的各个数据,另外一个是你要的y坐标的各个数据。输入以后假定叫x向量与y向量,可以在workspace里面看见这两个向量,要确保这两个向量的元素数一致,如果不一致的话是不能在工具箱里面进行拟合的。 例如在命令行里输入下列数据: x = [196,186, 137, 136, 122, 122, 71, 71, 70, 33]; y = [0.012605; 0.013115; 0.016866; 0.014741; 0.022353; 0.019278; 0.041803; 0.038026; 0.038128; 0.088196]; 3.数据的选取。打开曲线拟合共工具界面,点击最左边的"Data..."按钮,出现一个Data对话框,在Data Sets页面里,在X Data选项中选取x向量,Y Data 选项中选取y向量,如果两个向量的元素数相同,那么Create data set按钮就激活了,此时点击它,生成一个数据组,显示在下方Data Sets列表框中。关闭Data对话框。此时Curve Fitting Tool窗口中显示出这一数据组的散点分布图。

matlab曲线拟合实例

曲线拟合 求二次拟合多项式 解:(一)最小二乘法MA TLAB编程: function p=least_squar(x,y,n,w) if nargin<4 w=1 end if nargin<3 n=1 end m=length(y); X=ones(1,m) if m<=n error end for i=1:n X=[(x.^i);X] end A=X*diag(w)*X';b=X*(w.*y)';p=(A\b)' 输入: x=[1 3 5 6 7 8 9 10]; y=[10 5 2 1 1 2 3 4] p=least_squar(x,y,2) 运行得: p = 0.2763 -3.6800 13.4320 故所求多项式为:s(x)=13.432-3.68x+0.27632x (二)正交多项式拟合MATLAB编程: function p=least_squar2(x,y,n,w) if nargin<4 w=1; end if nargin<3 n=1; end m=length(x); X=ones(1,m); if m<=n error end for i=1:n X=[x.^i;X]; end A=zeros(1,n+1);

A(1,n+1)=1; a=zeros(1,n+1); z=zeros(1,n+1); for i=1:n phi=A(i,:)*X;t=sum(w.*phi.*phi); b=-sum(w.*phi.*x.*phi)/t a(i)=sum(w.*y.*phi)/t; if i==1 c=0;else c=-t/t1; end t1=t for j=1:n z(j)=A(i,j+1); end z(n+1)=0 if i==1 z=z+b*A(i,:); else z=z+b*A(i,:)+c*A(i-1,:); end A=[A;z]; end phi=A(n+1,:)*X;t=sum(w.*phi.*phi); a(n+1)=sum(w.*y.*phi)/t; p=a*A; 输入: x=[1 3 5 6 7 8 9 10]; y=[10 5 2 1 1 2 3 4]; p=least_squar2(x,y,2) 运行得: b = -6.1250 t1 = 8 z = 0 1 0 b = -4.9328 t1 = 64.8750 z = 1.0000 -6.1250 0 p = 0.2763 -3.6800 13.4320 故所求多项式为:s(x)=13.432-3.68x+0.27632x

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

曲线拟合(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. 设拟合多项式为: 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=[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.5614x^2+0.08287x+1.15560 图1 最小二乘法曲线拟合示例 对比检验拟合的有效性: 例:在[0,π]区间上对正弦函数进行拟合,然后在[0,2π]区间画出图形,比较拟合区间和非拟合区间的图形,考察拟合的有效性。 在MATLAB中输入如下代码: clear x=0:0.1:pi; y=sin(x); [p,mu]=polyfit(x,y,9)

Matlab最小二乘法曲线拟合的应用实例

MATLAB机械工程 最小二乘法曲线拟合的应用实例 班级: 姓名: 学号: 指导教师:

一,实验目的 通过Matlab上机编程,掌握利用Matlab软件进行数据拟合分析及数据可视化方法 二,实验内容 1.有一组风机叶片的耐磨实验数据,如下表所示,其中X为使用时间,单位为小时h,Y为磨失质量,单位为克g。要求: 对该数据进行合理的最小二乘法数据拟合得下列数据。 x=[10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 2 0000 21000 22000 23000]; y=[24.0 26.5 29.8 32.4 34.7 37.7 41.1 42.8 44.6 47.3 65.8 87.5 137.8 174. 2] 三,程序如下 X=10000:1000:23000; Y=[24.0,26.5,29.8,32.4,34.7,37.7,41.1,42.8,44.6,47.3,65.8,87.5,137.8,17 4.2] dy=1.5; %拟合数据y的步长for n=1:6 [a,S]=polyfit(x,y,n); A{n}=a;

da=dy*sqrt(diag(inv(S.R′*S.R))); Da{n}=da′; freedom(n)=S.df; [ye,delta]=polyval(a,x,S); YE{n}=ye; D{n}=delta; chi2(n)=sum((y-ye).^2)/dy/dy; end Q=1-chi2cdf(chi2,freedom); %判断拟合良好度 clf,shg subplot(1,2,1),plot(1:6,abs(chi2-freedom),‘b’) xlabel(‘阶次’),title(‘chi2与自由度’) subplot(1,2,2),plot(1:6,Q,‘r’,1:6,ones(1,6)*0.5) xlabel(‘阶次’),title(‘Q与0.5线’) nod=input(‘根据图形选择适当的阶次(请输入数值)’); elf,shg, plot(x,y,‘kx’);xlabel(‘x’),ylabel(‘y’); axis([8000,23000,20.0,174.2]);hold on errorbar(x,YE{nod},D{nod},‘r’);hold off title(‘较适当阶次的拟合’) text(10000,150.0,[‘chi2=’num2str(chi2(nod))‘~’int2str(freedom(nod))])

Matlab曲线拟合工具箱cftool功能

Matlab的曲线拟合工具箱CFtool功能 一、单一变量的曲线逼近 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 data和Y 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种类型,linear、nearest neighbor、cubic spline、shape- 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,设置参数a、b的上下限,然后点击OK。 (5)类型设置完成后,点击“Apply”按钮,就可以在Results框中得到拟合结果,如下例:

曲线拟合的最小二乘法matlab举例

曲线拟合的最小二乘法 学院:光电信息学院 姓名:赵海峰 学号: 200820501001 一、曲线拟合的最小二乘法原理: 由已知的离散数据点选择与实验点误差最小的曲线 S( x) a 0 0 ( x) a 1 1(x) ... a n n ( x) 称为曲线拟合的最小二乘法。 若记 m ( j , k ) i (x i ) j (x i ) k (x i ), 0 m (f , k ) i0 (x i )f (x i ) k (x i ) d k n 上式可改写为 ( k , jo j )a j d k ; (k 0,1,..., n) 这个方程成为法方程,可写成距阵 形式 Ga d 其中 a (a 0,a 1,...,a n )T ,d (d 0,d 1,...,d n )T , 、 数值实例: 下面给定的是乌鲁木齐最近 1个月早晨 7:00左右(新疆时间 )的天气预报所得 到的温度数据表,按照数据找出任意次曲线拟合方程和它的图像。 它的平方误差为: || 2 | 2 ] x ( f

(2008 年 10 月 26~11 月 26) F 面应用Matlab 编程对上述数据进行最小二乘拟合 三、Matlab 程序代码: x=[1:1:30]; y=[9,10,11,12,13,14,13,12,11,9,10,11,12,13,14,12,11,10,9,8,7,8,9,11,9,7,6,5,3,1]; %三次多项式拟合% %九次多项式拟合% %十五次多项式拟合% %三次多项式误差平方和 % %九次次多项式误差平方和 % %十五次多项式误差平方和 % %用*画出x,y 图像% %用红色线画出x,b1图像% %用绿色线画出x,b2图像% %用蓝色o 线画出x,b3图像% 四、数值结果: 不同次数多项式拟和误差平方和为: r1 = 67.6659 r2 = 20.1060 r3 = 3.7952 r1、r2、r3分别表示三次、九次、十五次多项式误差平方和 拟和曲线如下图: a 仁polyfit(x,y,3) a2= polyfit(x,y,9) a3= polyfit(x,y,15) b1= polyval(a1,x) b2= polyval(a2,x) b3= polyval(a3,x) r1= sum((y-b1).A 2) r2= sum((y-b2).A2) r3= sum((y-b3).A2) plot(x,y,'*') hold on plot(x,b1, 'r') hold on plot(x,b2, 'g') hold on plot(x,b3, 'b:o')

MATLAB中简单的数据拟合方法与应用实例①

MATLAB中简单的数据拟合方法与应用实例 仅供努力学习matlab的同学们参考参考,查阅了M多资料,总结了以下方法 按步骤做能够基本学会matlab曲线拟合的 1.1数据拟合方法 1.1.1多项式拟合 1.多项式拟合命令 polyfit(X,Y,N):多项式拟合,返回降幂排列的多项式系数。 Polyval(P,xi):计算多项式的值。 其中,X,Y是数据点的值;N是拟合的最高次幂;P是返回的多项式系数;xi是要求的横坐标 拟合命令如下: x=[1 2 3 4 5 6 7 8 9]; y=[9 7 6 3 -1 2 5 7 20]; P=polyfit(x,y,3); xi=0:.2:10; yi=polyval(P,xi); plot(xi,yi,x,y,'r*'); 拟合曲线与原始数据如图1-1 图1-1 2图形窗口的多项式拟合 1)先画出数据点如图1-2 x=[1 2 3 4 5 6 7 8 9]; y=[9 7 6 3 -1 2 5 7 20]; plot(x,y,'r*');

图1-2 2)在图形窗口单击Tools—Basic Fitting,如图1-3勾选. 图1-3 图1-3右方分别是线性、二阶、三阶对数据进行多项式拟合。下面的柱状图显示残差,可以看出,三阶多项式的拟合效果是最好的。 1.1.2指定函数拟合 已知M组数据点和对应的函数形式f t (t)=acos(kt)e X Y 编写M文件:

syms t x=[0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15]; y=[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02]; f=fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'}); cfun=fit(x,y,f) xi=0:.1:20; yi=cfun(xi); plot(x,y,'r*',xi,yi,'b-'); 图1-4 运行程序,在命令窗口可达到以下运行结果,图像如图1-4 Warning: Start point not provided, choosing random start point. > In fit>handlewarn at 715 In fit at 315 In Untitled2 at 5 cfun = General model: cfun(t) = a*cos(k*t)*exp(w*t) Coefficients (with 95% confidence bounds): a = 0.9987 ( 0.9835, 1.014) k = 1.001 (0.9958, 1.006) w = -0.2066 (-0.2131, -0.2002) 从结果可以看出,拟合的曲线为: (0.2066) ()0.9987cos(1.001)*t f t t e- =。拟 合曲线给出了数据大致趋势,并给出了各参数的置信区间。

matlab曲线拟合2010a演示

2010a版本曲线拟合工具箱 一、单一变量的曲线逼近 Matlab有一个功能强大的曲线拟合工具箱cftool ,使用方便,能实现多种类型的线性、非线性曲线拟合。下面结合我使用的Matlab R2007b 来简单介绍如何使用这个工具箱。 假设我们要拟合的函数形式是y=A*x*x + B*x, 且A>0,B>0。 1、在主命令输入数据: x=233.8:0.5:238.8; y=[235.148 235.218 235.287 235.357 235.383 235.419 235.456 235.49 235.503 235.508 235.536]; 2、启动曲线拟合工具箱 cftool(x,y) 3、进入曲线拟合工具箱界面“Curve Fitting tool” 如图 (1)利用X data和Y data的下拉菜单读入数据x,y,可在Fit name修改数据集名,这时会自动画出数据集的曲线图;

(2)在红色区域选择拟合曲线类型 工具箱提供的拟合类型有: ?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种类型,linear、nearest neighbor、cubicspline、shape-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) 在results一栏看结果

MATLAB拟合函数

在Matlab 6.5以上的环境下,在左下方有一个"Start"按钮,如同Windows的开始菜单,点开它,在目录"Toolboxes"下有一个"Curve Fitting",点开"Curve Fitting Tool",出现数据拟合工具界面,基本上所有的数据拟合和回归分析都可以在这里进行。 下面给你简单介绍一下它的使用方法。 首先在Matlab的命令行输入两个向量,一个向量是你要的x坐标的各个数据,另外一个是你要的y坐标的各个数据。输入以后假定叫x向量与y向量,可以在workspace里面看见这两个向量,要确保这两个向量的元素数一致,如果不一致的话是不能在工具箱里面进行拟合的。 例如在命令行里输入下列数据: x=(0:0.02:0.98)';二胡与施工的计划的风光好舒服很多国家法规和积分高科技 y=sin(4*pi*x+rand(size(x))); 此时x-y之间的函数近似的为正弦关系,频率为2,但是存在一个误差项。 可以通过作图看出它们的大体分布: plot(x,y,'*','markersize',2); 打开曲线拟合共工具界面,点击最左边的"Data..."按钮,出现一个Data对话框,在Data Sets 页面里,在X Data选项中选取x向量,Y Data选项中选取y向量,如果两个向量的元素数相同,那么Create data set按钮就激活了,此时点击它,生成一个数据组,显示在下方Data Sets列表框中。关闭Data对话框。此时Curve Fitting Tool窗口中显示出这一数据组的散点分布图。 点击Fitting...按钮,出现Fitting对话框,Fitting对话框分为两部分,上面为Fit Editor,下面为Table of Fits,有时候窗口界面比较小,Fit Editor部分会被收起来,只要把Table of Fits 上方的横条往下拉就可以看见Fit Editor。在Fit Editor里面点击New Fit按钮,此时其下方的各个选框被激活,在Data Set选框中选中刚才建立的x-y数据组,然后在Type of fit 选框中选取拟合或回归类型,各个类型的拟合或回归相应的分别是: Custom Equations 用户自定义函数 Expotential e指数函数 Fourier 傅立叶函数,含有三角函数 Gaussian 正态分布函数,高斯函数 Interpolant 插值函数,含有线性函数,移动平均等类型的拟合 Polynomial 多项式函数 Power 幂函数 Rational 有理函数(不太清楚,没有怎么用过) Smooth Spline ??(光滑插值或者光滑拟合,不太清楚) Sum of sin functions正弦函数类 Weibull 威布尔函数(没用过) 不好意思,没有学过数理统计,所以很多东西都是用了才知道,翻译也就不太准确。不过在Type of fit选框下方有一个列表框,基本上各个函数类里的函数都写成解析式列在下方以供选择,所以找合适的函数还是比较容易的。

Matlab曲线拟合及工具箱简介

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 data和Y 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种类型,linear、nearest neighbor、cubic spline、shape-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”按钮,

matlab曲线拟合

函数插值与曲线拟合 1、函数插值 一维插值:interp1(x,y,cx,?method?) 一维插值:interp1(x,y,z,cx,cy,?method?) method:nearest、linear、spline、cubic 例: clear echo on x=-2:0.4:2; y=[2.8 2.96 2.54 3.44 3.565.4 6.0 8.7 10.1 13.3 14.0]; t=-2:0.01:2; nst=interp1(x,y,t,'nearest'); plot(x,y,'r*',t,nst) title('最临近点插值') lnr=interp1(x,y,t,'linear'); figure(2) plot(x,y,'r*',t,lnr,'b:') title('线性插值') spl=interp1(x,y,t,'spline'); figure(3) plot(x,y,'r*',t,spl) title('样条插值') cbc=interp1(x,y,t,'cubic'); figure(4) plot(x,y,'r*',t,cbc,'k-') title('三次插值') 2、曲线拟合 多项式拟合:polyfit(x,y,m) 线性:m=1,二次:m=2, … 例: x=0:0.1:1; y=[-0.447 1.978 3.28 6.16 7.08 7.347.66 9.56 9.48 9.30 11.2]; A=polyfit(x,y,2) Z=polyval(A,x); Plot(x,y,?r*?,x,z,?b?) matalb 曲线拟合的问题 %多项式拟合函数polyfit示例 x=[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]; y=[-0.4471 0.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]; n=2;%polynomial order p=polyfit(x, y, n); %polyfit 的输出是一个多项式系数的行向量。 %其解是y = -9.8108x2+20.1293x-0.0317。为了将曲线拟合解与数据点比较,

MATLAB数据拟合例子

MATLAB数据拟合例子(一次函数、指数函数、双曲线) (2010-06-03 01:44:30)转载▼ 分类:数学工具 标签:杂 谈 一次函数:(a+bx = y) %先求出拟合函数 format long; x = [2001 2002 2003 2004 2005 2006 2007 2008 2009]; y = [32.2 31.3 29.7 28.6 27.5 26.1 25.3 23.7 22.7]; d = [1 1 1 1 1 1 1 1 1]; a=[d;x]; b = a*y'; a=a*a'; c=a\b c = 1.0e+003 * 2.436797222221444 -0.001201666666666 %所以,拟合函数为 y = 1.0e+003 *(2.436797222221444 - 0.001201666666666*x %根据拟合函数求估测值 format short; x = [2010, 2011, 2012, 2013, 2014] 1.0e+003 *( 2.436797222221444 - 0.001201666666666*x) ans = 21.4472 20.2456 19.0439 17.8422 16.6406

指数函数:( y = exp(a + b*x)) >> x = [2001 2002 2003 2004 2005 2006 2007 2008 2009]; y = [21.5 15.9 11.8 8.7 6.5 4.8 3.5 2.6 2.0]; y=log(y'); d = [1 1 1 1 1 1 1 1 1]; a=[d;x]; b = a*y; a=a*a'; c=a\b c = 601.9448 -0.2993 %所以,拟合函数为 y = exp(601.9448 - 0.2993*x) %根据拟合函数求估测值 >> x = [2010, 2011, 2012, 2013, 2014] exp(601.9448 - 0.2993*x) ans = 1.4216 1.0539 0.7813 0.5792 0.4294 双曲线:(1/y = a + b/x) format long;

matlab数据拟合,有图有例子,一看就会

Matlab CFTool使用简介: 单一变量的曲线逼近 Matlab有一个功能强大的曲线拟合工具箱 cftool ,使用方便,能实现多种类 型的线性、非线性曲线拟合。下面结合我使用的 Matlab R2007b 来简单介绍如何使用这个工具箱。 假设我们要拟合的函数形式是 y=A*x*x + B*x, 且A>0,B>0 。 1、在命令行输入数据: 》x=[你的X轴数据]; 》y=[你的Y轴数据]; 》cftool 可以将上面三个行建立一个M文件,以便后面进行数据拟合时可以直接使用,点击运行即可进入曲线拟合工具箱界面“Curve Fitting tool” (1)点击“Data”按钮,弹出“Data”窗口; (2)利用X data和Y 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种类型,linear、nearest neighbor、cubic spline、shape-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构造等式”两种标签。

Matlab曲线拟合工具箱CFTOOL实例解析

Matlab曲线拟合工具箱CFTOOL实例解析 (2011-04-14 23:53:11) 转载▼ 标签: 分类:Matlab matlab 向量 曲线拟合 函数 cftool 杂谈 整理于https://www.sodocs.net/doc/a68635127.html,/viewthread.php?tid=43771&sid=mg9z2z 1.打开CFTOOL工具箱。在Matlab 6.5以上的环境下,在左下方有一个"Start"按钮,如同Windows的开始菜单,点开它,在目录"Toolboxes"下有一个"Curve Fitting",点开"Curve Fitting Tool",出现数据拟合工具界面,基本上所有的数据拟合和回归分析都可以在这里进行。 2.输入两组向量x,y。 首先在Matlab的命令行输入两个向量,一个向量是你要的x坐标的各个数据,另外一个是你要的y坐标的各个数据。输入以后假定叫x向量与y向量,可以在workspace里面看见这两个向量,要确保这两个向量的元素数一致,如果不一致的话是不能在工具箱里面进行拟合的。 例如在命令行里输入下列数据: x = [196,186, 137, 136, 122, 122, 71, 71, 70, 33]; y = [0.012605; 0.013115; 0.016866; 0.014741; 0.022353; 0.019278; 0.041803; 0.038026; 0.038128; 0.088196];

3.数据的选取。打开曲线拟合共工具界面,点击最左边的"Data..."按钮,出现一个Data对话框,在Data Sets页面里,在X Data选项中选取x向量,Y Data选项中选取y 向量,如果两个向量的元素数相同,那么Create data set按钮就激活了,此时点击它,生成一个数据组,显示在下方Data Sets列表框中。关闭Data对话框。此时Curve Fitting Tool窗口中显示出这一数据组的散点分布图。

相关主题