主要内容

使用几种基于问题的方法的非线性数据拟合

最小二乘问题设置的一般建议是以允许的方式制定问题解决认识到这个问题是最小二乘形式。当你这样做的时候,解决内部呼叫lsqnonlin.,这是求解最小二乘问题的有效。看写入基于问题的最小二乘函数

该示例通过比较性能来显示最小二乘求解器的效率lsqnonlin.有了Fminunc.在同一个问题上。此外,该示例显示了通过明确识别和处理问题的线性部分来显示您可以获得的额外优势。

问题设置

考虑以下数据:

数据=......[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);情节(t y'ro') 标题('数据点'

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

问题是符合函数

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

到数据。

使用默认求解器的解决方案方法

首先,定义对应于等式的优化变量。

c = Optimvar('C',2);lam = Optimvar('我是',2);

任意设置初始点X0.如下:c(1)= 1C(2)= 1林(1)= 1, 和林(2)= 0

x0.c = [1];x0。林= (1,0);

创建一个计算响应值的函数有时T.当参数是C我是

diffun = c(1)* exp( -   -   -  1)* t)+ c(2)* exp( -  -2)* t);

转变困境到优化表达式,总和函数与数据之间的差异的平方y

diffexpr = sum((diffun  -  y)。^ 2);

创建优化问题Diffexpr.作为目标函数。

ssqprob = OptimProblem('客观的', diffexpr);

使用默认解算器解决问题。

[SOL,FVAL,EXITFLAG,输出] =求解(SSQPROB,X0)
使用LSQNONLIN解决问题。地方最低可能。LSQNONLIN停止,因为相对于其初始值的平方和的最终变化小于功能公差的值。
sol =结构与字段:C:[2x1双]林:[2x1双]
fval = 0.1477.
exitflag = FunctionChangeBelowTolerance
输出=结构与字段:firstorderopt:7.8870e-06迭代:6 funccount:7 cgiteration:0算法:'信任区域 - 反光'STAPEIZ:0.0096消息:'...'orivederivative:“前进广告”求解器:'lsqnonlin'

根据返回的解决方案值绘制所产生的曲线sol.c.sol.lam.

resp =评估(diffun,sol);抓住绘图(T,REAC)持有离开

图中包含一个坐标轴。标题为Data points的轴包含两个类型为line的对象。

适合的看起来尽可能好。

解决方案方法使用Fminunc.

用解决问题Fminunc.解算器,设置“规划求解”选项'fminunc'在呼唤时解决

[xunc,fvalunc,extflagungunc,outputunc] =解决(ssqprob,x0,“规划求解”“fminunc”
使用fminunc解决问题。发现本地最低限度。优化完成,因为梯度的大小小于最优耐受性的值。
Xunc =.结构与字段:C:[2x1双]林:[2x1双]
fvalunc = 0.1477.
ExitFlagunc = OptimalAlyolution.
outputunc =.结构与字段:迭代:30 Funccount:37步骤:0.0017 Lssteplenth:1/2.9454E-05算法:'Quasi-Newton'留言:'...'orboutivederivative:“前进广告”求解器:'fminunc'

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

fprintf([“使用fminunc有%d次迭代,”......'和%d使用lsqcurvefit.\n'],......Outputunc.Iltations,Output.Iltations)
使用Fminunc和6使用LSQCurveFit有30个迭代。
fprintf([“使用fminunc,”有%d函数评估“......'和%d使用lsqcurvefit。'],......outputunc.funccount,output.funccount)
使用Fminunc和7使用LSQCurveFit有37个功能评估。

分裂线性和非线性问题

请注意,拟合问题是参数中的线性C(1)C(2).这意味着任何值林(1)林(2),您可以使用反斜杠运算符查找值C(1)C(2)解决最小二乘问题。

重新制作问题作为二维问题,搜索最佳值林(1)林(2).价值C(1)C(2)如上所述,在每个步骤中计算每个步骤。为此,使用FitVector.函数,执行反斜杠操作以获取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

解决问题解决从二维初始点开始X02.=[1,0].为此,首先转换FitVector.使用优化表达式的功能fcn2optimexpr.看将非线性函数转换为优化表达式.为避免警告,请给出所得表达式的输出大小。用目标创建一个新的优化问题,作为转换后的平方差的总和FitVector.功能和数据y

x02.lam = x0。f2 = fcn2optimexpr(@(x)fitvector(x,t,y),lam,'输出',[长度(t),1]);ssqprob2 = OptimProblem('客观的',总和((f2  -  y)。^ 2));[Sol2,FVAL2,EXITFLAG2,OUTPUT2] =求解(SSQPROB2,X02)
使用LSQNONLIN解决问题。地方最低可能。LSQNONLIN停止,因为相对于其初始值的平方和的最终变化小于功能公差的值。
sol2 =结构与字段:林:[2x1双]
FVAL2 = 0.1477.
EXITFLAG2 = functionchangeBelowTolerance.
Output2 =结构与字段:Firstorderopt:4.4018E-06迭代:10 Funccount:33 Cgiteration:0算法:'信任区域 - 反光'STAPEIZE:0.0080消息:'...'orboivederivative:“有限差异”求解器:'lsqnonlin'

二维解决方案的效率类似于四维解决方案的效率:

fprintf([“使用2-d进行了%d函数计算”......“配方,使用4-D配方的%D.”],......Output2.Funccount,Output.funccount)
使用二维配方的功能评估有33项,使用4d配方的功能评估有7项。

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

选择原始四参数问题的错误起点导致不全局的本地解决方案。选择一个同样糟糕的起点林(1)林(2)分割双参数问题的值导致全局解决方案。为了表明这一点,将原始问题重新运行了一个导致一个相对糟糕的本地解决方案,并将结果与​​全局解决方案进行比较。

X0bad.c = [5 1];x0bad。我是=[1 0]; [solbad,fvalbad,exitflagbad,outputbad] = solve(ssqprob,x0bad)
使用LSQNONLIN解决问题。地方最低可能。LSQNONLIN停止,因为相对于其初始值的平方和的最终变化小于功能公差的值。
solbad =结构与字段:C:[2x1双]林:[2x1双]
fvalbad = 2.2173
ExitFlagbad = functionchangeBelowTolerance.
outputbad =.结构与字段:firstorderopt:0.0036迭代:31 funccount:32 cgiteration:0算法:'信任区域 - 反光'的步骤:0.0012消息:'...'orboutivederivative:“前进广告”求解器:'lsqnonlin'
respbad =评估(diffun solbad);抓住绘图(T,Respbad,'G') 传奇('数据''全球合适''糟糕的地方合身'“位置”“不”) 抓住离开

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

fprintf(['良好结束点的残余规范是%f,'......'坏结局点的残余标准是%f。'],......fval,fvalbad)
好的结束点残差范数为0.147723,坏的结束点残差范数为2.217300。

也可以看看

|

相关的话题