MATLAB曲线拟合(含实例)
[matlab 曲线拟合(含实例)]
matlab曲线拟合- ⾮常好⾮常全⾯的介绍M拟合的参考资料
Mathworks Tech-Note 1508 曲线拟合向导
1.介绍
2. Mathworks 产品的曲线拟合特⾊
a.曲线拟合⼯具箱(Curve Fitting Toolbox)
b. Matlab 内建函数与其他的带有曲线拟合能⼒的附加产品(⼯具箱)c.线性曲线拟合
d.⾮线性曲线拟合
3.加权曲线拟合⽅法
a.曲线拟合⼯具箱
b.统计⼯具箱
c.优化⼯具箱
4.利⽤曲线拟合⼯具箱提⾼曲线拟合结果
5.其他的相关资料
第1节:简介
MATLAB即有内建的解决很多通常遇到的曲线拟合问题的能⼒,⼜具有附加这⽅⾯的产品。本技术⼿册描述了⼏种拟合给定数据集的曲线的⽅法,另外,本⼿册还解释了加权曲线拟合、针对复数集的曲线拟合以及其他⼀些相关问题的拟合技巧。在介绍各种曲线拟合⽅法中,采⽤了典型例⼦的结合介绍。
第2节: MathWorks产品的曲线拟合特⾊
MATLAB有可以⽤于曲线拟合的内建函数。MathWorks公式也提供了很多⼯具箱可以⽤于曲线拟合。这些⽅法可以⽤来做线性或者⾮线性曲线拟合。MATLAB 也有⼀个开放的⼯具箱――曲线拟合⼯具箱(Curve Fitting Toolbox),她可以⽤于参数拟合,也可以⽤于⾮参数拟合。本节将介绍曲线拟合⼯具箱与其他⼯具箱、以及各种MATLAB可以⽤于曲线拟合的内建函数的详细特征。
a.曲线拟合⼯具箱
曲线拟合⼯具箱是专门为数据集合进⾏曲线拟合⽽设计的。这个⼯具箱集成了⽤MATLAB建⽴的图形⽤户界⾯(GUIs)和M ⽂件函数。
曲线拟合向导 Genial @ USTC 2004-4-18
利⽤⼯具箱的库⽅程(例如线性,⼆次,⾼阶多项式等)或者是⽤户⾃定义⽅程(局限于⽤户的想象⼒)可以进⾏参数拟合。当你想出回归系数以及他们背后的物理意义的时候就可以采⽤参数拟合。
通过采⽤平滑样条或者其他各种插值⽅法,你就可以进⾏⾮参数拟合。当回归系数不具有物理意义并且不在意他们的时候,就采⽤⾮参数拟合⽅法。
曲线拟合⼯具箱提供了如下功能:
数据回归,譬如截⾯(?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计算R值的例⼦:
load census
[p,s]=polyfit(cdate,pop,2);
Output=polyval(p,cdate);
Corrolation=corroef(cate,Output);
cdate 与它⾃⾝很好的相关,同样的 Output也与它⾃⾝很好相关。反对⾓线上元素是 2
曲线拟合向导 Genial @ USTC 2004-4-18
cdate与 Output之间的相关性。这个值⾮常接近于1,因此实际数据与拟合结果能否较好的吻合。因此,这个拟合是“好”的拟合。(应该是这样判断的么?我怎么觉得应该通过pop与Output的相关性来判断拟合的好坏的呢?)利⽤反斜线操作符与polyfit函数进⾏回归与曲线拟合的更多的例⼦请参照
MATLAB⽂档中的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
曲线拟合向导 Genial @ USTC 2004-4-18 计算模型在均匀空间的值,并将原来的值画在同⼀个图形上: T=(0:.1:2.5)';
Y=[ones(size(T) T T.^2)]*a;
plot(T,Y,'-'t,y
,'o'),grid on
⽅法2:线性参数回归
建⽴模型:
matlab拟合数据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
曲线拟合向导 Genial @ USTC 2004-4-18
⽅法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的在线帮助⽂档)
本节提供了以实际数据分析形式的在MATLAB中的数据分析基本能⼒的概貌。下⾯的例⼦是以收集的⼈⼝普查数据为基础,采⽤MATLAB函数对数据进⾏实验
拟合:
多项式拟合
残差分析
指数拟合
误差界限
1.导⼊数据
load census (census.mat包含了美国1790年到1990年的⼈⼝数据)
其中包括两个变量:cdate与pop
cdate 是从1790以10递增到1990的⼀个列向量,是年份数;
pop 是cdate中年份相应的⼈⼝数据向量
曲线拟合向导 Genial @ USTC 2004-4-18
2.多项式拟合
⾸先我们想通过简单的多项式对普查数据进⾏拟合。利⽤MATLAB中的两个函数进⾏处理: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 POLYFIT.
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
曲线拟合向导 Genial @ USTC 2004-4-18
另外⼀个规范化数据的⽅法就是通过结果与单位的知识进⾏转换。如,对于本数据集,选择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
曲线拟合向导 Genial @ USTC
2004-4-18
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);