matlab最小二乘法的非线性参数拟合
- 格式:doc
- 大小:46.50 KB
- 文档页数:5
标题:深度剖析:用MATLAB基于残差平方最小二乘法拟合曲线的代码一、引言MATLAB作为一种强大的数学建模和仿真工具,常常被用于拟合曲线。
其中,最小二乘法是一种常见的数据拟合方法,而残差平方最小二乘法则是最小二乘法的一种特例。
在本文中,我们将深入探讨MATLAB中基于残差平方最小二乘法拟合曲线的代码实现,以帮助读者更全面地理解这一方法。
二、残差平方最小二乘法的原理残差平方最小二乘法是一种基于最小化残差平方和的拟合方法。
其原理可以简单描述为:对于给定的数据点集合,假设存在一个模型可以描述这些数据,但是这个模型的参数是未知的。
残差平方最小二乘法的目标就是通过调整模型参数,使得模型预测值与实际观测值之间的残差平方和最小化。
通常情况下,这个过程可以通过优化算法来实现。
三、MATLAB代码实现在MATLAB中,可以使用curve fitting toolbox来实现残差平方最小二乘法拟合曲线。
具体的代码实现如下:```matlab% 准备数据x = [1, 2, 3, 4, 5];y = [2.5, 3.5, 4.5, 5.5, 6.5];% 拟合曲线f = fit(x', y', 'poly1', 'Robust', 'Bisquare');% 绘制拟合结果plot(f, x, y);```在上面的代码中,首先我们准备了一组实验数据,然后利用MATLAB中的fit函数进行曲线拟合,参数'poly1'表示拟合一次多项式,'Robust'参数表示使用残差平方最小二乘法,并且采用Bisquare函数作为拟合方法。
最后通过plot函数将拟合结果可视化出来。
四、个人观点残差平方最小二乘法是一种非常有效的拟合方法,它能够较好地描述数据的特征,并且在MATLAB中实现也相对简单。
但是在实际使用中,需要根据具体问题选择合适的拟合方法和模型,以及合理地处理拟合结果和残差。
MATLAB麦夸特法数据拟合一、背景介绍MATLAB是一种强大的数学分析工具,广泛应用于科学计算、工程设计和数据分析等领域。
在数据拟合方面,MATLAB提供了多种方法来处理实验数据,其中麦夸特法(Marquardt Method)是一种常用的非线性最小二乘拟合方法。
通过使用麦夸特法,我们可以将实验数据与理论模型进行拟合,找到最优的参数,从而更好地理解数据背后的规律。
二、麦夸特法原理1. 麦夸特法是一种迭代算法,用于最小化误差函数,其核心思想是通过不断调整参数的值,使得误差函数的值逐渐趋近于最小值。
2. 在每一次迭代中,麦夸特法将误差函数在当前参数值处进行线性化,然后求解线性化函数的最小二乘解,从而得到新的参数值。
3. 通过不断迭代,可以逐步逼近最优的参数值,使得拟合效果得到改善。
三、使用MATLAB进行麦夸特法数据拟合的步骤1. 准备实验数据:首先需要准备好实验数据,将实验数据存储在MATLAB中的数组或矩阵中。
2. 构建拟合模型:根据实验数据的特点和拟合的需求,选择合适的拟合模型,并用函数的形式表示出来。
3. 初值设定:对拟合模型的参数进行初值设定,这些初值将作为麦夸特法的起始点。
4. 调用麦夸特法函数:MATLAB提供了专门的函数来实现麦夸特法数据拟合,例如“lsqnonlin”函数。
需要将实验数据、拟合模型、初值等作为输入参数传入该函数。
5. 获取拟合参数:调用麦夸特法函数后,可以得到拟合的最优参数值,以及拟合的误差值。
6. 拟合效果评估:通过对比实验数据与拟合模型预测值的差异,评估拟合效果的好坏。
四、实例演示假设我们有以下实验数据,需要使用麦夸特法进行数据拟合:x = [1, 2, 3, 4, 5];y = [2.1, 3.9, 6.2, 8.3, 10.5];我们选择使用二次多项式模型进行拟合,即y = ax^2 + bx + c。
接下来,我们将演示如何使用MATLAB进行数据拟合。
步骤1:准备实验数据x = [1, 2, 3, 4, 5];y = [2.1, 3.9, 6.2, 8.3, 10.5];步骤2:构建拟合模型fun = (p,x) p(1)*x.^2 + p(2)*x + p(3);步骤3:初值设定p0 = [1, 1, 1];步骤4:调用麦夸特法函数p = lsqnonlin((p) fun(p,x) - y, p0);步骤5:获取拟合参数a = p(1);b = p(2);c = p(3);步骤6:拟合效果评估x_fit = linspace(1,5,100);y_fit = a*x_fit.^2 + b*x_fit + c;plot(x, y, 'o', x_fit, y_fit);通过以上MATLAB代码演示,我们成功使用麦夸特法对实验数据进行了二次多项式拟合,并获得了最优的拟合参数。
matlab最⼩⼆乘法数据拟合函数详解定义:最⼩⼆乘法(⼜称最⼩平⽅法)是⼀种数学优化技术。
它通过最⼩化误差的平⽅和寻找数据的最佳函数匹配。
利⽤最⼩⼆乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平⽅和为最⼩。
最⼩⼆乘法还可⽤于曲线拟合。
其他⼀些优化问题也可通过最⼩化能量或最⼤化熵⽤最⼩⼆乘法来表达。
最⼩⼆乘法原理:在我们研究两个变量(x,y)之间的相互关系时,通常可以得到⼀系列成对的数据(x1,y1.x2,y2... xm,ym);将这些数据描绘在x -y直⾓坐标系中,若发现这些点在⼀条直线附近,可以令这条直线⽅程如(式1-1)。
Yj= a0 + a1 X (式1-1),其中:a0、a1 是任意实数。
matlab中⽤最⼩⼆乘拟合的常⽤函数有polyfit(多项式拟合)、nlinfit(⾮线性拟合)以及regress(多元线性回归)。
⾃变量有2个或以上时,应变量⼀个,可以使⽤的有nlinfit和regress,线性时⽤regress,⾮线性时⽤nlinfit。
对于进阶matlab使⽤者还有更多的选择,如拟合⼯具箱、fit函数、interp系列插值拟合等等。
MATLAB中关于最⼩⼆乘法的函数主要有:help polyfit -- POLYFIT Fit polynomial to data.help lsqcurvefit -- LSQCURVEFIT solves non-linear least squares problems.help lsqnonlin -- LSQNONLIN solves non-linear least squares problems.help nlinfit -- NLINFIT Nonlinear least-squares regression.help regress -- REGRESS Multiple linear regression using least squares.help meshgrid -- MESHGRID X and Y arrays for 3-D plots.本⽂主要讲解的函数:polyfit,lsqcurvefit,lsqnonlin,regress1.多项式曲线拟合:polyfit1.1 常见拟合曲线直线: y=a0X+a1多项式:,⼀般次数不易过⾼2,3双曲线: y=a0/x+a1指数曲线: y=a*e^b1.2 matlab中函数P=polyfit(x,y,n)[P S mu]=polyfit(x,y,n)polyval(P,t):返回n次多项式在t处的值注:其中x y已知数据点向量分别表⽰横纵坐标,n为拟合多项式的次数,结果返回:P-返回n次拟合多项式系数从⾼到低依次存放于向量P中,S-包含三个值其中normr是残差平⽅和,mu-包含两个值 mean(x)均值,std(x)标准差。
lsqcurvefit是MATLAB中用于最小二乘曲线拟合的函数,它可以帮助我们找到一条曲线,使得该曲线与数据点之间的误差平方和最小。
下面我们来详细介绍一下lsqcurvefit函数的使用方法和参数设置。
1. 函数介绍lsqcurvefit函数是MATLAB Optimization Toolbox中的一个函数,用于非线性最小二乘曲线拟合。
该函数可以拟合一般形式的非线性模型,求解最优参数,使得模型与实际数据之间的拟合效果最好。
2. 使用方法lsqcurvefit函数的基本调用格式为:```[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)```其中各参数含义如下:- fun:拟合模型函数,即要拟合的曲线模型,其输入参数为x和xdata,输出为模型的预测值- x0:模型参数的初始值- xdata:自变量数据,即要拟合的数据点的横坐标- ydata:因变量数据,即要拟合的数据点的纵坐标- lb和ub:模型参数的上下界限制,可选参数- options:优化设置选项,可选参数3. 参数设置在使用lsqcurvefit函数时,我们需要注意以下几点参数设置:- 拟合模型函数fun:这是lsqcurvefit函数最重要的参数,需要根据实际问题选择合适的曲线模型来进行拟合。
常见的拟合模型包括多项式模型、指数模型、对数模型等,根据实际问题选择合适的模型来进行拟合。
- 模型参数初始值x0:这是拟合过程中的初始参数值,一般需要根据实际情况进行合理的设定,初始值的选择对拟合效果有较大影响。
- 参数限制lb和ub:在一些情况下,模型参数可能需要满足一定的限制条件,比如参数不能为负值等,这时候可以通过设置lb和ub来进行限制。
- 优化设置选项options:lsqcurvefit函数还提供了很多优化设置选项,比如最大迭代次数、容许误差等,可以根据实际情况进行设置。
非线性曲线拟合最小二乘法、问题提出设数据(Xj,yJ 3(i=0,1,2,3,4).由表给出,表中第四行为lnyZl«,可以看出数学模型为y二aebx,用最小二乘法确定a及b。
、理论基础根据最小二乘拟合的定义:在函数的最佳平方逼近中f(x). C[a,b],如果f(x)只在一组离散点集{Xi,i=O,1,…,m},上给定,这就是科学实验中经常见到的实验数据{ ( Xj,%),i=O,1,・・・,m}的曲线拟合,这里yi二f(xj,i=O,1,・・・,n% 要求一个函数y二S(x)与所给数据{ ( Xi, yi) m}拟合,若记误差i 二 S*(xJ-% ,i=O,1m,、=(O,1, ,、m)T,设\(x), \(x)/,:n(x)是C[a,b]上线性无尖函数族,在」-spar( A(X), : l(x), (x)}中找一函数S(x),使误差平方和m m m2、2八、F 八[s(Xi)・y_2 =min,目凶呦2,i=0 i=0 S(x)邯im这里S(x)二a。
o(x) 4 !(x) ann(x) (n<m)这就是一般的最小二乘逼近,用几何语言来说,就称为曲线拟合的最小二乘法。
在建模的过程中应用到了求和命令(sum)、求偏导命令(diff)、化简函数命令(simple)〉用迭代方法解二元非线性方程组的命令(fsolve),画图命令(plot)等。
三、实验内容用最小二乘法求拟合曲线时,首先要确定S(x)的形式。
这不单纯是数学问题,还与所研究问题的运动规律及所得观测数据( Xi,% )有尖;通常要从问题的运动规律及给定数据描图,确定s(x)的形式,并通过实际计算选出较好的结果。
S(x)的一般表达式为线性形式,若\(x)是k次多项式,S(x)就是n次多项式,为了使问题的提法更有一般性,通常在最小二乘法中2都考虑为加权平方和m:2八(X讥S(Xj) - f(xj]2.i=0这里r(x)_o是[a,b]上的权函数,它表示不同点(Xi, f(xj)处的数据比重不同。
方便大家使用的最小二乘法曲线拟合的Matlab程序非常方便用户使用,直接按提示操作即可;这里我演示一个例子:(红色部分为用户输入部分,其余为程序运行的结果,结果图为Untitled.fig,Untitled2.fig) 请以向量的形式输入x,y.x=[1,2,3,4]y=[3,4,5,6]通过下面的交互式图形,你可以事先估计一下你要拟合的多项式的阶数,方便下面的计算.polytool()是交互式函数,在图形上方[Degree]框中输入阶数,右击左下角的[Export]输出图形回车打开polytool交互式界面回车继续进行拟合输入多项式拟合的阶数m = 4Warning: Polynomial is not unique; degree >= number of data points. > In polyfit at 72In zxecf at 64输出多项式的各项系数a = 0.0200000000000001a = -0.2000000000000008a = 0.7000000000000022a = 0.0000000000000000a = 2.4799999999999973输出多项式的有关信息 SR: [4x5 double]df: 0normr: 2.3915e-015Warning: Zero degrees of freedom implies infinite error bounds.> In polyval at 104In polyconf at 92In zxecf at 69观测数据拟合数据x y yh1.0000 3.0000 3.00002.0000 4.0000 4.00003 5 54.0000 6.0000 6.0000剩余平方和 Q = 0.000000标准误差 Sigma = 0.000000相关指数 RR = 1.000000请输入你所需要拟合的数据点,若没有请按回车键结束程序.输入插值点x0 = 3输出插值点拟合函数值 y0 = 5.0000>>结果:untitled.figuntitled2.fig一些matlab优化算法代码的分享代码的目录如下:欢迎讨论1.约束优化问题:minRosen(Rosen梯度法求解约束多维函数的极值)(算法还有bug) minPF(外点罚函数法解线性等式约束)minGeneralPF(外点罚函数法解一般等式约束)minNF(内点罚函数法)minMixFun(混合罚函数法)minJSMixFun(混合罚函数加速法)minFactor(乘子法)minconPS(坐标轮换法)(算法还有bug)minconSimpSearch(复合形法)2.非线性最小二乘优化问题minMGN(修正G-N法)3.线性规划:CmpSimpleMthd(完整单纯形法)4.整数规划(含0-1规划)DividePlane(割平面法)ZeroOneprog(枚举法)5.二次规划QuadLagR(拉格朗日法)ActivedeSet(起作用集法)6.辅助函数(在一些函数中会调用)minNT(牛顿法求多元函数的极值)Funval(求目标函数的值)minMNT(修正的牛顿法求多元函数极值)minHJ(黄金分割法求一维函数的极值)7.高级优化算法1)粒子群优化算法(求解无约束优化问题)1>PSO(基本粒子群算法)2>YSPSO(待压缩因子的粒子群算法)3>LinWPSO(线性递减权重粒子群优化算法)4>SAPSO(自适应权重粒子群优化算法)5>RandWSPO(随机权重粒子群优化算法)6>LnCPSO(同步变化的学习因子)7>AsyLnCPSO(异步变化的学习因子)(算法还有bug)8>SecPSO(用二阶粒子群优化算法求解无约束优化问题)9>SecVibratPSO(用二阶振荡粒子群优化算法求解五约束优化问题)10>CLSPSO(用混沌群粒子优化算法求解无约束优化问题)11>SelPSO(基于选择的粒子群优化算法)12>BreedPSO(基于交叉遗传的粒子群优化算法)13>SimuAPSO(基于模拟退火的粒子群优化算法)2)遗传算法1>myGA(基本遗传算法解决一维约束规划问题)2>SBOGA(顺序选择遗传算法求解一维无约束优化问题)3>NormFitGA(动态线性标定适应值的遗传算法求解一维无约束优化问题)4>GMGA(大变异遗传算法求解一维无约束优化问题)5>AdapGA(自适应遗传算法求解一维无约束优化问题)6>DblGEGA(双切点遗传算法求解一维无约束优化问题)7>MMAdapGA(多变异位自适应遗传算法求解一维无约束优化问题)自己编写的马尔科夫链程序A 代表一组数据序列一维数组本程序的操作对象也是如此t=length(A); % 计算序列“A”的总状态数B=unique(A); % 序列“A”的独立状态数顺序,“E”E=sort(B,'ascend');a=0;b=0;c=0;d=0;for j=1:1:ttLocalization=find(A==E(j)); % 序列“A”中找到其独立状态“E”的位置for i=1:1:length(Localization)if Localization(i)+1>tbreak; % 范围限定elseif A(Localization(i)+1)== E(1)a=a+1;elseif A(Localization(i)+1)== E(2)b=b+1;elseif A(Localization(i)+1)== E(3)c=c+1;% 依此类推,取决于独立状态“E”的个数elsed=d+1;endendT(j,1:tt)=[a,b,c,d]; % “T”为占位矩阵endTT=T;for u=2:1:ttTT(u,:)= T(u,:)- T(u-1,:);endTT; % 至此,得到转移频数矩阵Y=sum(TT,2);for uu=1:1:ttTR(uu,:)= TT(uu,:)./Y(uu,1);endTR % 最终得到马尔科夫转移频率/概率矩阵% 观测序列马尔科夫性质的检验:N=numel(TT);uuu=1;Col=sum(TT,2); % 对列求和Row=sum(TT,1); % 对行求和Total=sum(Row); % 频数总和for i=1:1:ttfor j=1:1:ttxx(uuu,1)=sum((TT(i,j)-(Row(i)*Col(j))./Total).^2./( (Row(i)*Col(j)). /Total));uuu=uuu+1; % 计算统计量x2endendxx=sum(xx)。
matlab最小二乘法拟合matlab最小二乘法拟合是一种常用的拟合方法,它属于非线性最小二乘拟合,其可以用来拟合任意数据。
matlab最小二乘法拟合主要包括以下几个步骤:一、准备数据1、准备数据阶段:包括收集数据,整理数据,观察数据;2、设计拟合模型:根据观察到的特性确定拟合模型方程;3、计算函数参数:根据拟合模型对原始数据进行曲线拟合,计算出模型参数;二、参数估计1、最小二乘法拟合:将所有点拟合到曲线上,使每个点到曲线上的距离之和最小;2、非线性最小二乘拟合:根据多元非线性模型参数的变化范围,构造最小二乘拟合的曲线,应用非线性拟合和最小二乘法拟合找出最佳拟合曲线;3、外推预测:根据拟合后的参数预测特定值。
三、评价拟合结果1、残差平方和:根据拟合模型和所得数据,计算拟合结果和拟合误差;2、自由度:自由度 = 总数据点数- 拟合模型参数的个数;3、复杂度检验:考虑拟合模型的复杂度对拟合效果的影响;4、对数校正残差:考虑拟合结果的稳定性,比较数据的分布与真实数据的分布;5、误差统计检验:通过统计分析评估拟合结果的可靠性。
四、模型预测1、均方根误差(RMSE):评估预测模型拟合准确性,值越小,模型越有效;2、均方误差(MSE):反映预测值与真实值之间的平均差异;3、绝对均差(MAE):反映预测值与真实值之间的绝对均值差异;4、平均绝对平方偏差(MAHAPE):反映模型拟合精度平均差距,值越接近0,模型越精确;5、杰拉德系数(R):反映预测值与真实值之间的线性联系,值越接近1,模型越有效。
以上是matlab最小二乘法拟合的原理和应用,它不仅可以拟合任意数据,而且具有较强的适用性和准确性。
此外,matlab最小二乘法拟合还可以用来评估拟合结果的准确性,方便对数据进行分析处理。
关于采用matlab进行指定非线性方程拟合的问题(1)※1。
优化工具箱的利用函数描述LSQLIN 有约束线性最小二乘优化LSQNONNEG 非负约束线性最小二乘优化问题当有约束问题存在的时候,应该采用上面的方法代替Polyfit与反斜线(\)。
具体例子请参阅优化工具箱文档中的相应利用这两个函数的例子。
d. 非线性曲线拟合利用MATLAB的内建函数函数名描述FMINBND 只解决单变量固定区域的最小值问题FMINSEARCH 多变量无约束非线性最小化问题(Nelder-Mead 方法)。
下面给出一个小例子展示一下如何利用FMINSEARCH1.首先生成数据>> 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是一种强大的数学软件,它提供了许多用于数学建模、数据分析、图形可视化等功能的工具。
对数最小二乘拟合是其中一个重要的功能,它可以帮助研究人员处理实验数据,找出数据之间的相关性,从而进行有效的数据分析和建模。
在本文中,我们将讨论Matlab中对数最小二乘拟合的原理、方法和应用。
二、对数最小二乘拟合的原理对数最小二乘拟合是一种特殊的非线性拟合方法,它适用于当实验数据呈现出指数增长或指数衰减的趋势时。
对数最小二乘拟合的原理是将实验数据取对数变换,然后使用最小二乘法进行拟合。
最小二乘法是一种常用的数值优化方法,它通过最小化实际观测值和模型预测值之间的残差平方和来确定模型参数,从而实现拟合。
三、Matlab中对数最小二乘拟合的方法在Matlab中,可以使用“lsqcurvefit”函数进行对数最小二乘拟合。
该函数可以通过最小二乘法拟合非线性方程,并返回拟合参数和拟合效果。
使用该函数时,需要提供拟合的非线性方程、初始参数估计值、实验数据及其权重等信息,以便进行拟合。
在拟合结束后,可以通过绘制拟合曲线和残差图来评估拟合效果。
四、对数最小二乘拟合的应用对数最小二乘拟合在实际应用中具有广泛的意义。
在生物学领域,用对数最小二乘拟合可以研究物种种裙的增长趋势;在经济学领域,可以用来分析经济指标的增长规律等。
通过对数最小二乘拟合,研究人员可以更加准确地描述实验数据的变化规律,从而做出更有力的数据分析和预测。
五、结论对数最小二乘拟合是Matlab中的重要功能之一,它可以帮助研究人员处理实验数据、分析数据规律,并进行数学建模。
本文讨论了对数最小二乘拟合的原理、方法和应用,希望可以为对数最小二乘拟合的研究和应用提供一些有益的参考。
在实际应用中,研究人员可以根据具体的问题和实验数据,灵活运用Matlab中的数学工具,进行数据分析和建模工作。
六、对数最小二乘拟合的优缺点尽管对数最小二乘拟合在处理指数增长或指数衰减的数据时具有一定优势,但同样也存在一些局限性。
matlab最小二乘法的非线性参数拟合首先说一下匿名函数:在创建匿名函数时,Matlab记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab不再进行搜索,而是立即执行该函数,极大提高了效率。
所以首选匿名函数。
具体拟合时可以使用的方法如下:1 曲线拟合工具箱提供了很多拟合函数,使用简单非线性拟合nlinfit函数clear all;x1=[0.4292 0.4269 0.381 0.4015 0.4117 0.3017]';x2=[0.00014 0.00059 0.0126 0.0061 0.00425 0.0443]';x=[x1 x2];y=[0.517 0.509 0.44 0.466 0.479 0.309]';f=@(p,x)2.350176*p(1)*(1-1/p(2))*(1-(1-x(:,1).^(1/p(2))).^p(2)).^2.*(x(:,1).^ (-1/p(2))-1).^(-p(2)).*x(:,1).^(-1/p(2)-0.5).*x(:,2);p0=[8 0.5]';opt=optimset('TolFun',1e-3,'TolX',1e-3);%[p R]=nlinfit(x,y,f,p0,opt)2 最小二乘法在曲线拟合中比较普遍。
拟合的模型主要有1.直线型2.多项式型3.分数函数型4.指数函数型5.对数线性型6.高斯函数型一般对于LS问题,通常利用反斜杠运算“\”、fminsearch或优化工具箱提供的极小化函数求解。
在Matlab中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。
在命令提示符后键入:cftool,即可根据数据,选择适当的拟合模型。
“\”命令1.假设要拟合的多项式是:y=a+b*x+c*x^2.首先建立设计矩阵X:X=[ones(size(x)) x x^2];执行:para=X\ypara中包含了三个参数:para(1)=a;para(2)=b;para(3)=c;这种方法对于系数是线性的模型也适应。
2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2)设计矩阵X为X=[ones(size(x)) exp(x) x.*exp(x.^2)];para=X\y3.多重回归(乘积回归)设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。
设计矩阵为X=[ones(size(x)) x t] %注意x,t大小相等!para=X\ypolyfit函数polyfit函数不需要输入设计矩阵,在参数估计中,polyfit会根据输入的数据生成设计矩阵。
1.假设要拟合的多项式是:y=a+b*x+c*x^2p=polyfit(x,y,2)然后可以使用polyval在t处预测:y_hat=polyval(p,t)polyfit函数可以给出置信区间。
[p S]=polyfit(x,y,2) %S中包含了标准差[y_fit,delta] = polyval(p,t,S) %按照拟合模型在t处预测在每个t处的95%CI为:(y_fit-1.96*delta, y_fit+1.96*delta)2.指数模型也适应假设要拟合:y = a+b*exp(x)+c*exp(x.?2)p=polyfit(x,log(y),2)fminsearch函数fminsearch是优化工具箱的极小化函数。
LS问题的基本思想就是残差的平方和(一种范数,由此,LS产生了许多应用)最小,因此可以利用fminsearch函数进行曲线拟合。
假设要拟合:y = a+b*exp(x)+c*exp(x.?2)首先建立函数,可以通过m文件或函数句柄建立:x=[......]';y=[......]';f=@(p,x) p(1)+p(2)*exp(x)+p(3)*exp(x.?2) %注意向量化:p(1)=a;p(2)=b;p(3)=c;%可以根据需要选择是否优化参数%opt=options()p0=ones(3,1);%初值para=fminsearch(@(p) (y-f(p,x)).^2,p0) %可以输出Hessian矩阵res=y-f(para,x)%拟合残差3.多项式型的一个例子1900-2000年的总人口情况的曲线拟合clear all;close all;%cftool提供了可视化的曲线拟合!t=[1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000]';y=[75.995 91.972 105.711 123.203 131.669 150.697 179.323 203.212 226.505 249.633 281.4220]';%t太大,以t的幂作为基函数会导致设计矩阵尺度太差,列变量几乎线性相依。
变换为[-1 1]上s=(t-1950)/50;%plot(s,y,'ro');%回归线:y=a+bxmx=mean(s);my=mean(y);sx=std(s);sy=std(y);r=corr(s,y);b=r*sy/sx;a=my-b*mx;rline=a+b.*s;figure;subplot(3,2,[1 2])plot(s,y,'ro',s,rline,'k');%title('多项式拟合');set(gca,'XTick',s,'XTickLabel',sprintf('%d|',t));%hold on;n=4;PreYear=[2010 2015 2020];%预测年份tPreYear=(PreYear-1950)/50;Y=zeros(length(t),n);res=zeros(size(Y));delta=zeros(size(Y));PrePo=zeros(length(PreYear),n);Predelta=zeros(size(PrePo));for i=1:n[p S(i)]=polyfit(s,y,i);[Y(:,i) delta(:,i)]=polyval(p,s,S(i));%拟合的Y[PrePo(:,i) Predelta(:,i)]=polyval(p,tPreYear,S(i));%预测res(:,i)=y-Y(:,i);%残差end% plot(s,Y);%2009a自动添加不同颜色% legend('data','regression line','1st poly','2nd poly','3rd poly','4th poly',2)% plot(tPreYear,PrePo,'>');% hold off% plot(Y,res,'o');%残差图r=corr(s,Y).^2 %R^2%拟合误差估计CIYearAdd=[t;PreYear'];tYearAdd=[s;tPreYear'];CFtit={'一阶拟合','二阶拟合','三阶拟合','四阶拟合'};for col=1:nsubplot(3,2,col+2);plot(s,y,'ro',s,Y(:,col),'g-');%原始数据和拟合数据legend('Original','Fitted',2);hold on;plot(s,Y(:,col)+2*delta(:,col),'r:');%95% CIplot(s,Y(:,col)-2*delta(:,col),'r:');plot(tPreYear,PrePo(:,col),'>');%预测值plot(tPreYear,PrePo(:,col)+2*Predelta(:,col));%预测95% CIplot(tPreYear,PrePo(:,col)-2*Predelta(:,col));axis([-1.2 1.8 0 400]);set(gca,'XTick',tYearAdd,'XTickLabel',sprintf('%d|',YearAdd));title(CFtit{col});hold off;endfigure;%残差图for col=1:nsubplot(2,2,col);plot(Y(:,i),res(:,i),'o');end4 非线性的应用例子(多元情况)要拟合y=a*x1^n1+b*x2^n2+c*x3^n3%注:只是作为应用,模型不一定正确!!!%x2=x3!!!y=[1080.94 1083.03 1162.80 1155.61 1092.82 1099.26 1161.06 1258.05 1299.03 1298.30 1440.22 1641.30 1672.21 1612.73 1658.64 1752.42 1837.99 2099.29 2675.47 2786.33 2881.07]';x1=[1 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 1.8 1.85 1.9 1.95 2]';x2=[1 1.025 1.05 1.075 1.1 1.125 1.15 1.175 1.2 1.225 1.250 1.275 1.3 1.325 1.350 1.375 1.4 1.425 1.45 1.475 1.5]';x3=[1 1.025 1.05 1.075 1.1 1.125 1.15 1.175 1.2 1.225 1.250 1.275 1.3 1.325 1.350 1.375 1.4 1.425 1.45 1.475 1.5]';x=[x1 x2 x3];f=@(p,x) p(1)*x(:,1).^p(2)+p(3)*x(:,2).^p(4)+p(5)*x(:,3).^p(6);p0=ones(6,1);p=fminsearch(@(p)sum(y-f(p,x)).^2,p0)res=y-f(p,x);res2=res.^2 %失败的模型Matlab 自定义函数自定义函数的途径:M文件函数(M file function)在线函数(Inline Function)匿名函数(Anonymous Function)1.M文件函数范例function c=myadd(a,b)%这里可以写函数的使用说明,前面以%开头%在工作区中,help myadd将显示此处的说明c=a+b;%end %非必须的第一行function告诉Matlab这是一个函数,a,b是输入,c是输出,myadd是函数名。