MATLAB曲线拟合(含实例)(2)

2020-03-29 19:09

拟合:

? 多项式拟合 ? 残差分析 ? 指数拟合 ? 误差界限 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); >> 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,'+')

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

曲线拟合向导 Genial @ USTC 2004-4-18 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与反斜线(\\)。具体例子请参

曲线拟合向导 Genial @ USTC 2004-4-18

阅优化工具箱文档中的相应利用这两个函数的例子。 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将是一个包含了对原数据集进行估计的参数值的向量。


MATLAB曲线拟合(含实例)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:江苏省海门中学09-10学年高二上学期期末考试(政治必修) -

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: