主要内容

非线性数据拟合

此示例显示如何使用多个优化工具箱™算法将非线性功能适合数据。

问题设置

考虑以下数据:

资料=......[0.0000 5.8955 0.1000 3.5639 0.2000 2.5173 0.3000 1.9790 0.4000 1.8990 0.5000 1.3938 0.6000 1.1359 0.7000 1.0096 0.8000 1.0343 0.9000 0.8435 1.0000 0.6856 1.1000 0.6100 1.2000 0.5392 1.3000 0.3946 1.4000 0.3903 1.5000 0.5474 1.6000 0.3459 1.7000 0.1370 1.8000 0.2211 1.9000 0.1704 2.0000 0.2636];

让我们绘制这些数据点。

t =数据(:1);Y =数据(:,2);%轴([0 2 -0.5 6])%等一下图(t,y,'ro')头衔(“数据点”

图包含轴。带标题数据点的轴包含类型线的对象。

%抵消

我们希望适合该功能

y=c(1)*exp(-lam(1)*t)+c(2)*exp(-lam(2)*t)

对数据进行修改。

解决方案方法使用lsqcurvefit.

lsqcurvefit.功能很容易解决这种问题。

首先,用一个变量x定义参数:

x(1)=c(1)

x(2)=林(1)

x(3)=c(2)

X(4)=林(2)

然后将曲线定义为参数x和数据t的函数:

F=@(x,扩展数据)x(1)*exp(-x(2)*扩展数据)+x(3)*exp(-x(4)*扩展数据);

我们任意将初始点X0设置如下:C(1)= 1,LAm(1)= 1,C(2)= 1,LAM(2)= 0:

x0 = [1 1 1 0];

我们运行解算器并绘制结果拟合。

[x,resnorm,~,exitflag,output]=lsqcurvefit(F,x0,t,y)
地方最低可能。LSQCurveFit停止,因为相对于其初始值的平方和总和的最终变化小于功能公差的值。
X =1×43.0068 10.5869 2.8891 1.4003
Resnorm = 0.1477.
exitflag=3
输出=带字段的结构:firstorderopt:7.8852e-06迭代次数:6次funcCount:35次cgiterations:0算法:“信赖域反射”步长:0.0096消息:“…”
抓住在…上图(t,F(x,t))保持

图中包含一个轴。带有标题数据点的轴包含2个line类型的对象。

解决方案方法使用Fminunc.

使用Fminunc.,我们将目标函数设置为残差的平方和。

Fsumsquares=@(x)和((F(x,t)-y)。^2;opts=options('fminunc'“算法”“拟牛顿”);[Xunc,Ressquared,Eflag,Outputu] =......fminunc(Fsumsquares,x0,opts)
发现本地最低限度。优化完成,因为梯度的大小小于最优耐受性的值。
Xunc =.1×42.8890 1.4003 3.0069 10.5862
Ressquared = 0.1477.
EFLAG = 1
输出=带字段的结构:迭代次数:30次funcCount:185步长:0.0017 lssteplength:1 firstorderopt:2.9662e-05算法:“拟牛顿”消息:“…”

注意Fminunc.找到了与之相同的解决方案lsqcurvefit.,但采取了更多的职能评估。参数Fminunc.它们的顺序与lsqcurvefit.;较大的脉冲是脉冲(2),而不是林(1)。这并不令人惊讶,变量的顺序是任意的。

fprintf(['使用fminunc进行了%d次迭代,'......'和%d使用lsqcurvefit。\n'],......outputu.iterations,output.iterations)
使用Fminunc和6使用LSQCurveFit有30个迭代。
fprintf(['使用fminunc进行了%d次功能评估,'......'和%d使用lsqcurvefit。'],......outputu.funcCount,output.funcCount)
有185项功能评估使用fminunc,35项功能评估使用lsqcurvefit。

分裂线性和非线性问题

请注意,拟合问题在参数c(1)和c(2)中是线性的。这意味着对于lam(1)和lam(2)的任何值,我们都可以使用反斜杠操作符来找到解决最小二乘问题的c(1)和c(2)的值。

现在,我们将问题重新处理为二维问题,搜索lam(1)和lam(2)的最佳值。如上所述,在每一步使用反斜杠操作符计算c(1)和c(2)的值。

类型FitVector.
功能Yest = FitVector(LAM,XDATA,YDATA)%FITVEMO用于返回拟合功能的值。%Yest = FitVector(LAM,XDATA)返回拟合函数,Y%(下面定义)的值,在数据点XDATA中设置为LAM的参数。%YEST作为n×1列向量返回,其中n是%数据点的数量。%fifevector假定拟合函数y,采用表格%y = c(1)* exp( -  -1)* t)+ ... + c(n)* exp( -   -   -  am(n)*用N线性参数C和N非线性参数LAM的T)%百分比。为线性参数C求解%%,我们构建一个矩阵A%,其中exp的第j个列( -   -   -   -   -   -  j)* xdata)(xdata是向量)。然后我们解决了一个* c = ydata的线性最小二乘溶液c,%ydata是y的观察值。a =零(长度(xdata),长度(lam));%构建j = 1的矩阵:长度(lam)a(:,j)= exp( -  -lam(j)* xdata);结束c = a \ ydata;%求解一个* c = y用于线性参数c yest = a * c; % return the estimated response based on c

解决问题lsqcurvefit.,从二维初始点林(1),林(2)开始:

x02 = [1 0];F2 = @(x,t)fitvector(x,t,y);[x2,Resnorm2,〜,ExitFlag2,Output2] = LSQCurveFit(F2,X02,T,Y)
地方最低可能。LSQCurveFit停止,因为相对于其初始值的平方和总和的最终变化小于功能公差的值。
x2 =1×210.5861 1.4003
resnorm2=0.1477
EXITFLAG2 = 3.
Output2 =带字段的结构:Firstorderopt:4.4018E-06迭代:10 Funccount:33 Cgiterations:0算法:'信任区域 - 反光'步骤:0.0080消息:'...'

二维解的效率与四维解的效率相似:

fprintf(['使用2-d进行了%d次函数评估'......'配方,以及使用4-d配方的%d。'],......output2.funcCount,output.funcCount)
使用23个功能评估使用2-D配方和35使用4-D配方。

裂缝问题更加强大以初始猜测

选择原始四参数问题的错误起点导致不全局的本地解决方案。选择具有相同BAD LAM(1)和LAM(2)值的起始点,用于分割双参数问题导致全局解决方案。要显示此,我们将使用启动点重新运行原始问题,导致对本地解决方案相对较差,并将结果与​​全局解决方案进行比较。

x0bad = [5 1 1 0];[XBAD,ResnorMBAD,〜,EXITFLAGBAD,OutputBad] =......LSQ曲线拟合(F,x0bad,t,y)
地方最低可能。LSQCurveFit停止,因为相对于其初始值的平方和总和的最终变化小于功能公差的值。
xbad=1×4-22.9036 2.4792 28.0273 2.4791
ResnorMBAD = 2.2173
exitflagbad=3
outputbad =.带字段的结构:firstorderopt:0.0057迭代次数:32 funcCount:165 cgiterations:0算法:“信任区域反射”步长:0.0021消息:“…”
抓住在…上图(t,F(xbad,t),“g”) 传奇(“数据”'全球合适'“局部不适”“位置”“不”)持有

图包含轴。具有标题数据点的轴包含3个类型的线。这些对象代表数据,全局适合,糟糕的本地合适。

fprintf(['良好结束点的残余规范是%f,'......'在坏的结束点的剩余范数是%f.'],......resnorm,resnormbad)
好终点的剩余范数为0.147723,坏终点的剩余范数为2.217300。

相关话题