matlab曲线拟合 - 非常好非常全面的介绍M拟合的参考资料

matlab曲线拟合 - 非常好非常全面的介绍M拟合的参考资料
matlab曲线拟合 - 非常好非常全面的介绍M拟合的参考资料

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_M文件与M函数

M文件与M函数 Matlab输入命令的常用方式有两种:一种是直接在Matlab的命令窗门中逐条输入Matlab 命令;二是m文件工作方式。当命令行很简单时,使用逐条输入方式还是比较方便的。但当命令行很多时(比如说几十行乃至全成百上千行命令),显然再使用这种方式输入MATLAB 命令,就会显得杂乱无章,不易于把握程序的具体走向,并且给程序的修改和维护带来了很大的麻烦。这时,建议采用Matlab命令的第二种输入形式m文件工作方式。 m文件工作方式,指的是将要执行的命令全部写在一个文本文件中,这样既能使程序显得简洁明了,又便于对程序的修改与维护。m文件直接采用Matlab命令编写,就像在Matlab 的命令窗口直接输入命令一样,因此调试起来也十分方便,并且增强了程序的交互性。 m文件与其他文本文件一样,可以在任何文本编辑器中进打编辑、存储、修改和读取。利用m文件还可以根据白己的需要编写一些函数,这些函数也可以橡Matlab提供的函数一样进行调用。从某种意义上说,这也是对MATLAB的二次开发。 m文件有两种形式:一种是命令方式或称脚本方式;另一种就是函数文件形式。两种形式的文件扩展名均是.m。 1、M文件 当遇到输入命令较多以及要重复输入命令的情况时,利用命令文件就显得很方便了。将所有要执行的命令按顺序放到一个扩展名为.m的文本文件中,每次运行时只需在MATLAB 的命令窗口输入m文件的文件名就可以了。需要注意的是,m文件最好直接放在Matlab 的默认搜索路径下(一般是Matlab安装目录的子目录work中),这样就不用设置m文件的路径了,否则应当用路径操作指令path重新设置路径。另外,m文件名不应该与Matlab的内置函数名以及工具箱中的函数重名,以免发生执行错误命令的现象。Matlab对命令文件的执行等价于从命令窗口中顺序执行文件中的所有指令。命令文件可以访问Matlab工作空间里的任何变量及数据。命令文件运行过程中产生的所有变量都等价于从Matlab工作空间中创建这些变量。因此,任何其他命令文件和函数都可以自由地访问这些变量。这些变量一旦产生就一直保存在内存中,只有对它们重新赋值,它们的原有值才会变化。关机后,这里变量也就全部消失了。另外,在命令窗口中运行clear命令,也可以把这些变量从工作空间中删去。当然,在Matlab的工作空间窗口中也可以用鼠标选择想要删除的变量,从而将这些变量从工作空间中删除。 接下来,编写一个名为test.m的命令文件,用来计算矩阵1到100的和,并把它放到变量s中。 第一步创建新的M-文件。在Matlab主菜单上选择菜单命令File→New→M-File

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最小二乘法曲线拟合的应用实例

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))])

实验1Matlab基本操作M文件和流程控制语句+答案

实验1 Matlab基本操作、M文件和流程控制语句-答案 1、计算以下表达式的值,将结果按不同格式输出。掌握format命令的使用方法。(1) (2),其中 (3),其中 以(1)为例,其余类似。 (1)>> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.7017 >> format long >> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.70168931166114 >> format short e >> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.7017e+000 >> format bank >> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.70 >> format rat >> y=1.3^3*sin(pi/3)*sqrt(26) y = 2862/295 (2)>> format short >> x=[2 1+2*i;-0.45 5] x = 2.0000 1.0000 + 2.0000i -0.4500 5.0000 >> y=(1/2)*log(x+sqrt(1+x^2)) y = 0.7114 - 0.0253i 0.8968 + 0.3658i 0.2139 + 0.9343i 1.1541 - 0.0044i (3) >> format short >> x=-3:0.1:3; >> y=((exp(0.3*x)-exp(-0.3*x))/2).*sin(x+0.3)+log((0.3+x)/2) 2、已知: 求下列表达式的值: A+6*B和A-B+I

曲线拟合的最小二乘法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中M文件例子

20.11 M文件例子 精通MATLAB工具箱含有许多实用函数,它们可以验证本章的许多概念。这些函数的基本部分已经在二维和三维图形这些章阐述过了。有了前面对句柄图形的讨论,我们现在可以更彻底地讨论这些函数。 最简单的精通MATLAB工具箱的函数之一提出了一个共同的问题。MATLAB函数gcf返回当前图形的句柄。但是,它有一个副作用。如果图形不存在,gcf就创建一个,并返回它的句柄。如果想寻找一个图形是否存在于头一个位置,要是没有,又不得不创建,怎么办?函数mmgcf正好实现由其内容所描述的工作。 function HF=mmgcf %MMGCF Get Current Figure if it Exists. % MMGCF returns the handle of the current figure if it exists. % If no current figure exists,MMGCF returns an empty handle. % % Note that the function GCF is different.It creates a figure and returns its handle if it does not % exist. % Copyright (c) 1996 by Prentice-Hall,Inc. Hf=get(0, ‘Children’ ); % check for figure children if isempty(Hf) return else Hf=get(0, ‘CurrentFigure’ ); end 函数mmgcf首先检查根对象的子对象的图形是否存在,如至少有一个图形对象时,根对象的‘CurrentFigure’属性就返回当前的图形。 函数mmgca为坐标轴对象执行同样的功能,如同在它的M文件内所描述的那样。 function Ha=mmgca %MMGCA Get Current Axes if it exists. % MMGCA returns the handle of the current axes if it exists. % If no current axes exists,MMGCA returns an empty handle. % % Note that the function GCA is diffent.It create a figure and an axes and returns the axes % handle if they do not exist. % Copyright (c) 1996 by Prentice-Hall,Inc.

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一栏看结果

MatlabM文件编程

M文件及程序调试 本章详细讲解利用M语言进行编程的方法讲述的主要内容: 主程序文件 函数文件 M文件的调试

MATLAB的工作模式 (1)指令驱动模式 即在MATLABM命令行窗口下用户输入单行指令 时,MATLAB立即处理这条指令,并显示结果, 这就是MATLAB命令行方式。 缺点:命令行方式程序可读性差,而且不能存 储,当处理复杂问题和大量数据时很不方便。(2)M文件模式 将MATLAB语句构成的程序存储成以m为扩展名的 文件,然后再执行该程序文件,这种工作模式 称为程序文件模式。

M语言文件可以分为主程序文件和函数文件 一个M语言文件就是由若干MATLAB的命令组合在一起构成的。 M语言文件是标准的纯文本格式的文件,其文件扩展名为.m。 MATLAB提供了meditor编辑器编辑M文件 注意: (1)不可用汉字命名(若用汉字命名虽然可以打开M文件,但是编译运行时会出错); (2)文件名不可与MATLAB内置函数重名; (3)文件名不可以以数字命名。

主程序文件(脚本文件) 相当于C语言的主函数 主程序文件没有输入参数和输出参数。 执行主程序文件时,文件中的指令或者命令按照出现在脚本文件中的顺序依次执行。 主程序文件主要由注释行和代码行组成: M文件的注释行需要使用%,定义符注释定义符仅能影响一行代码 程序执行的结果将显示于命令窗中

函数文件(相当于C语言的子函数) 函数文件供主程序文件调用,必须指定函数名和输入输出参数,并由主程序文件中语句序列给出一系列操作,从而生成所需数据 函数文件格式一般包括以下部分: (1)函数定义行:表明该m文件包含一个函数,且为其定义函数名、输入参数和输出参数 function y=mean(x) (2)帮助信息:处在文件中的第二行,应该反 映该m文件概括性信息 %求平均值

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基本操作和M文件的编写及调试.

实验一、MATLAB基本操作和M文件的编写及调试 一、实验目的 1、熟悉MATLAB环境。 2、掌握MATLAB矩阵输入、运算以及元素运算和矩阵运算的区别。 3、熟悉MATLAB中M文件的编辑环境; 4、掌握MATLAB中M文件的编写与调试; 5、熟悉MATLAB中基本程序语句的使用; 二、预习要求 1、矩阵的基本运算法则以及矩阵转置、逆矩阵、线性方程组的求解问题等基本概念。 2、If、for、while以及switch语句的用法。 3、子程序的调用。 三、实验内容 1、利用help命令,查找plot、stem和*、.*等的帮助文件。同时在命令窗口中运行demo 命令,运行有关通信、信号处理的演示。 2、以及输入D=[1,4,7;8,5,2,;3,6,0],计算Z=D^3,D.^3,Z=3.^D,掌握元素运算和矩阵 运算的区别。 3、输入X=[-1 0 1],计算Y=X-1,l=length(X),pi*X,X*Y',Y'*X,验证矩阵的左乘与 右乘不相等。 4、输入A=[1,2,3;4,5,6],B=[2,4,0;1,3,5],D=[1,4,7;8,5,2,;3,6,0] ,计算D\A',A/D,掌握矩阵 的左除与右除的含义。 5、在命令窗口中输入edit命令,观察M文件编辑器的组成及各部分功能。 6、自行编写函数,定义全局变量及局部变量,并进行访问,观察全局变量与局部变量 的区别。 7、编写M文件试用input函数的功能: 8、请编写一个判断数据(整数)奇偶性的函数。 四、实验报告要求 1、写清学号、姓名、班级及实验名称; 2、简练描述MATLAB的窗口组成,它可以编辑哪些文件,这些文件的作用是什么。 3、简略写出实验内容的操作步骤及运行结果。 五、思考题 1、MATLAB中元素运算和矩阵运算的区别是什么? 2、矩阵的左除与右除的含义是什么? 3、MATLAB中M文件的编写与调试的过程是什么? 4、MATLAB中基本程序语句的如何使用? 六、注意事项

MATLAB在非线性曲线拟合中的应用研究

MATLAB 在非线性曲线拟合中的应用小结 摘要:归纳总结了非线性曲线拟合的方法、求解步骤和上机操作过程 关键词:曲线拟合非线性MAT LAB 正文: 1.曲线拟合的基本原理 已知一组测定的数据(例如N个点(xi,yi )去求得自变量x和因变量y 的一个近似解析表达式y=φ(x)。若记误差δi=φ(xi )-yi ,i=1,2,…N ,则要使误差的平方和最小,即要求: ∑==N i i Q 12δ 为最小,这就是常用的最小二乘法原理。 2 .MATLAB 曲线拟合的相关方法 2.1.函数形式: (1)多项式拟合函数po ly fit ,调用格式为: p =polyfit (x ,y,n ) 其中x ,y 为参与曲线拟合的实验数据,n为拟合多项式的次数,函数返回值为拟合多项式的系数(按降幂排列)。n =1时,就为线性拟合。 例1:给出表1数据,试用最小二乘法求一次和二次拟合多项式。 表1 数据 在M AT LAB 命令窗口中输入: cle ar ; cl os e; x=-1:0.25:1; y=[-0.2209,0.3295,0.8826,1.4392,2.0003,2.5645,3.1334,3.7061,4.2836] p1=p olyfit(x,y ,1) p2=po lyf it(x,y,2) y 1=polyva l(p 1,x); y 2=p oly val(p2,x); pl ot(x,y,'+',x,y1,'r:',x ,y 2,'k-.')

运行结果: 拟合多项式为:y*=2.0516+2.0131和y *=0.0313x2+2.2516x +2.20001 (2)非线性数据拟合函数lsq cu rvefit 调用格式为: c=ls qcur vefi (t 'f un',x0,xdata,yd ata ) 其中'fun'为拟合函数的M-函数文件名,x0为初始向量,x data ,ydat a为参与曲线拟合的实验数据。函数返回值c为非线性函数fun 的拟合系数。 例2:2004年全国大学生数学建模竞赛C 题(酒后驾车)中给出某人在短时间内喝下两瓶啤酒后,间隔一定的时间测量他的血液中酒精含量y (毫克/百毫升),得到数据如表2。 表2 酒精含量与饮酒时间的实验数据 通过建立微分方程模型得到短时间内喝酒后血液中 酒精浓度与时间的关系为: )(321t c t c e e c y ---= (2) 根据实验数据,利用非线性拟合函数ls qcurve fit ,确定模型(2)式中的参数c 1,c 2,c3。求解过程为: 先编写一个M -函数文件Example2_1: fun ction f=Ex ample2_1(c,td ata) f =c(1)*(ex p(-c(2)*t data)-exp (-c(3)*t da ta )); 保存后,在命令窗口中输入: clea r tdata=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16]; 时间(小时) 0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 酒精含量 30 68 75 82 82 77 68 68 58 51 50 41 时间(小时) 6 7 8 9 1 16 酒精含量 38 35 28 25 18 15 12 10 7 7 4

#【Matlab 简易教程】第八章 M文件和面向对象编程

Matlab 简易教程 8 M 文件和面向对象编程 假如读者想灵活运用MATLAB 去解决实际问题,想充分调动MATLAB ——科学技术资源,想理解MATLAB 版本升级所依仗的基础,那么本章内容将十分有用。 本章将涉及比较深层的MATLAB 内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。 8.1 入门 【*例8.1-1】通过M 脚本文件,画出下列分段函数所表示的曲面。 ??? ????-≤+≤+<->+=+-------15457.0117575.015457.0),(215.175.375.0216215.175.375.021121222 12212 122x x e x x e x x e x x p x x x x x x x x (1)编写M 脚本文件的步骤 图 8.1-1-1 MATLAB Editor/Debugger 窗口 点击MATLAB 指令窗工具条上的New File 图标 ,就可打开如图8.1-1-1所示的 MATLAB 文件编辑调试器MATLAB Editor/Debugger 。其窗口名为untitled ,用户即可在空白窗口中编写程序。比如输入如下一段程序 [zx81.m] %zx81.m This is my first example. <1> a=2;b=2; % <2> clf; x=-a:0.2:a;y=-b:0.2:b; for i=1:length(y) for j=1:length(x) if x(j)+y(i)>1 z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j)); elseif x(j)+y(i)<=-1 z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));

Matlab 曲面插值和拟合

得用拟合或插值。 常用的拟合有多项式拟合POLYFIT 插值有INTERP1,SPLINE,LAGR1等。。。 在Matlab中,用于曲线和曲面平滑的方法与函数很多,曲线平滑可用smooth和smoothts 等,三维数据可用smooth3,另外样条工具箱中也有不少可用于平滑数据的函数,如三次样条csaps和B样条spaps等。 matlab中三维作图功能总结2007-12-09 11:29plot3 画三维坐标中的点,连线,但只能顺序连接。 surf(X,Y,Z) 用X和Y定义x-y坐标网格,Z定义网格上每一点的高度,来生成三维曲面。如:[X,Y,Z] = peaks(30);surf(X,Y,Z) mesh,和surf一样,只不过生成的是网格。 surface 用法也一样。 fill3 只能生成平面。重点在色彩。 [X,Y,Z]=meshgrid(1:3,1:3,1:5) 生成3*3*5的三维网格,X,Y,Z都是3*3*5三维矩阵。 这只是生成坐标网格,还需要一个V(X,Y,Z)定义图形。 ndgrid 生成三维以上网格时用。 smooth3 作用于体数据,使光滑 isosurface X,Y,Z如meshgrid的定义。 V中元素为1则表示存在,即要显示。但要连成片的1才会显示。 V中元素如a>1时,表示要显示的这个点离上方的网格距离是单位距离的1/a 圆滑程度由isovalue决定,0.9999是最硬,越接近0越圆滑。可同时配合isocaps. isocaps 生成并显示图形与坐标系交界处的平面。 patch 接收isosuface返回的参数,生成图形。

Matlab 曲面插值和拟合 附录: Matlab 样条工具箱(Spline ToolBox)【信息来源教师博客】 Matlab样条工具箱中的函数提供了样条的建立,操作,绘制等功能; 一. 样条函数的建立 第一步是建立一个样条函数,曲线或者曲面。这里的样条函数,根据前缀,分为4类: cs* 三次样条 pp* 分段多项式样条,系数为t^n的系数 sp* B样条, 系数为基函数B_n^i(t)的系数 rp* 有理B样条 二. 样条操作 样条操作包括:函数操作:求值,算术运算,求导求积分等等 节点操作:主要是节点重数的调节,设定,修改等等 附:样条工具箱函数 1. 三次样条函数 csapi 插值生成三次样条函数 csape 生成给定约束条件下的三次样条函数 csaps 平滑生成三次样条函数 cscvn 生成一条内插参数的三次样条曲线 getcurve 动态生成三次样条曲线 2. 分段多项式样条函数

matlab拟合实例

散点图 >> x=0:0.1:1; >> y=[0.99567,0.99334,1.0413,1.0929,1.1485,1.2619,1.3719,1.4896,1.6433,1.8117,.9981]; >> plot(x,y,'ok'),title('散点图') 多项式拟合 >> x=0:0.1:1; >> y=log(1+x); >> P=polyfit(x,y,3) 对观测数据x,y作3阶多项式拟合 P = 0.1079 -0.3974 0.9825 0.0004 >> xi=0:0.1:1; >> yi=polyval(P,xi); >> plot(x,y,'or'); >> hold on; >> plot(xi,yi,'b'); >> plot(xi,log(1+xi),'g'); >> plot(xi,log(1+xi),'y'); >> plot(xi,log(1+xi),'g'); >> xlabel('x'); >> ylabel('y'); >> legend('采样数据','拟合曲线','精确曲线')

指数函数拟合 >> x=0:0.01:0.99; >> y=1-sqrt(x); >> P=polyfit(x,log(y),1) P = -3.3761 0.2071 >> yi=exp(polyval(P,x)); >> plot(x,y,'.k') >> plot(x,y,'.k') >> hold on >> plot(x,yi,'g') >> xlabel('x') >> ylabel('y') >> legend('采样数据','拟合曲线'); >> hold off;

用matlab编写M文件

用matlab编写M文件,计算函数值 2009-6-13 12:28 提问者:我ww是xx小jj俊|悬赏分:10|浏览次数:792次当x<1时,f(x)=x 当1 或=10时,f(x)=3x-11 其他回答共5条 2009-6-13 13:20 yuweilian|四级 n=100; for x=1:n; if x<1 f(x)=x; else if x<10 f(x)=2*x; else f(x)=3*x-11; end end plot (x,'b'); |评论 2009-6-13 14:35 唐海华86|三级 for x=-5:20; if x<1 y=x; end if <=x<10 y=2*x; end if x>10 y=3*x-11;

end end plot (x,y,'r'); |评论 2009-6-13 14:44 daoxiangcun|五级 %函数文件,保存为f.m function y = f(x) n = length(x); for k=1:n if x(k)<1 y(k)=x(k); elseif x(k)>=10 y(k)=3*x(k)-11; elseif 1=1&x<10)+(3*x-11).*(x>=10)

相关文档
最新文档