主要内容

非线性数据拟合使用几个具体问题具体分析的方法

最小二乘问题的一般性建议设置制定问题的方式允许解决认识到这个问题有一个最小二乘形式。当你这样做,解决在内部调用lsqnonlin,这是有效地解决最小二乘问题。看到写具体问题具体分析最小二乘法的目标函数

这个例子展示了最小二乘解算器的效率进行比较的性能lsqnonlinfminunc在同样的问题。此外,例子展示了额外的好处,可以分别获得通过明确地认识和处理问题的线性部分。

问题的设置

考虑以下数据:

Data =(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“罗”)标题(的数据点)

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

问题是适应函数

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

的数据。

解决方案方法使用默认的能手

首先,定义优化变量的方程。

c = optimvar (“c”2);林= optimvar (“林”2);

任意设置初始点x0如下:c (1) = 1,c (2) = 1,林(1)= 1,林(2)= 0:

x0。c=[1,1]; x0.lam = [1,0];

创建一个函数,这个函数计算的值响应t当参数c

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

转换diffun优化表达式和广场的功能和数据之间的差异y

diffexpr =总和((diffun - y) ^ 2);

创建一个优化问题diffexpr作为目标函数。

ssqprob = optimproblem (“目标”,diffexpr);

使用默认解决解决问题。

[溶胶,fval exitflag、输出]=解决(x0 ssqprob)
使用lsqnonlin解决问题。局部最小值。lsqnonlin停止是因为最后的平方和的变化相对于其初始值小于公差的值函数。
索尔=结构体字段:c: [2 x1双]林:[2 x1双)
fval = 0.1477
exitflag = FunctionChangeBelowTolerance
输出=结构体字段:firstorderopt: 7.8870 e-06迭代:6 funcCount: 7 cgiterations: 0算法:“trust-region-reflective”stepsize: 0.0096消息:当地最低可能....“objectivederivative:“forward-AD”解算器:“lsqnonlin”

情节产生的曲线根据返回的值的解决方案sol.csol.lam

resp =评估(diffun,索尔);持有情节(t,职责)

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

适合看起来一样好。

解决方案方法使用fminunc

解决这个问题用fminunc解算器,设置“规划求解”选项“fminunc”当调用解决

[xunc, fvalunc exitflagunc outputunc] =解决(x0, ssqprob“规划求解”,“fminunc”)
使用fminunc解决问题。局部最小值。优化完成因为梯度的大小小于最优值的宽容。
xunc =结构体字段:c: [2 x1双]林:[2 x1双)
fvalunc = 0.1477
exitflagunc = OptimalSolution
outputunc =结构体字段:迭代:30 funcCount: 37 stepsize: 0.0017 lssteplength: 1 firstorderopt: 2.9454 e-05算法:“拟牛顿”的信息:“局部最小值发现....“objectivederivative:“forward-AD”解算器:“fminunc”

请注意,fminunc发现相同的解决方案lsqcurvefit,但更多的功能评估。的参数fminunc以相反的顺序是那些lsqcurvefit;更大的林(2),而不是林(1)。这并不奇怪,变量的顺序是任意的。

流([“有% d迭代使用fminunc”,”和使用lsqcurvefit % d。\ n”),outputunc.iterations output.iterations)
有使用fminunc 30迭代,并使用lsqcurvefit 6。
流([“有% d函数使用fminunc评估,”“使用lsqcurvefit和% d。”),outputunc.funcCount output.funcCount)
有37个函数使用fminunc评估,并使用lsqcurvefit 7。

把线性和非线性问题

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

返工问题是一个二维问题,寻找最好的价值林(1)林(2)。的值c (1)c (2)计算每一步使用反斜杠符如上所述。为此,使用fitvector函数,该函数执行反斜杠操作获得c (1)c (2)在每个迭代解算器。

类型fitvector
函数是= fitvector (lam xdata, ydata) % fitvector DATDEMO用来拟合函数的返回值。%是= FITVECTOR (lam xdata)返回的值拟合函数,y %(下面定义),在数据点xdata参数设置为林。%是返回N×1列向量,其中N是%数据点的数量。% % FITVECTOR假设拟合函数,y, y的% % = c (1) * exp (lam (1) * t) +…+ c (n) * exp (lam (n) * t) % % n线性参数c和n非线性参数。% %求解线性参数c,我们构建一个矩阵a %的j列在哪里exp (lam (j) * xdata) (xdata是一个向量)。%然后我们解决线性最小二乘解的* c = ydata c %, ydata y。的观测值= 0(长度(xdata), (lam));%建立一个矩阵j = 1:长度(lam) (:, j) = exp (lam (j) * xdata);c = \ ydata结束;%解决* c = y为线性参数c是= * c; % return the estimated response based on c

解决问题用解决从二维初始点x02.lam=(1,0)。要做到这一点,首先转换fitvector函数使用一个优化表达式fcn2optimexpr。看到将非线性函数优化表达式。为了避免一个警告,给结果表达式的输出大小。创建一个新的优化问题与客观的平方的总和差异之间的转换fitvector函数和数据y

x02.lam=x0。林;F2 = fcn2optimexpr (@ (x) fitvector (x, t, y),林,“OutputSize”,长度(t) 1);ssqprob2 = optimproblem (“目标”总和((F2 - y)。^ 2));[sol2, fval2 exitflag2 output2] =解决(ssqprob2 x02)
使用lsqnonlin解决问题。局部最小值。lsqnonlin停止是因为最后的平方和的变化相对于其初始值小于公差的值函数。
sol2 =结构体字段:林(2 x1双):
fval2 = 0.1477
exitflag2 = FunctionChangeBelowTolerance
output2 =结构体字段:firstorderopt: 4.4032 e-06迭代:10 funcCount: 33 cgiterations: 0算法:“trust-region-reflective”stepsize: 0.0080消息:当地最低可能....“objectivederivative:“有限差分求解器:”lsqnonlin”

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

流([“有% d函数评估使用二维的的配方,使用4 - d % d配方。”),output2.funcCount output.funcCount)
有33个函数评估使用二维配方,使用4 - d配方和7。

分割问题是更健壮的初始猜测

选择一个糟糕的起点最初的四个参数问题导致当地的解决方案,并不是全球性的。选择一个起点相同的坏林(1)林(2)分割两个参数的值问题导致了全球性的解决方案。为了展示这一点,重新运行原始问题的起点会导致相对糟糕的局部解,并比较结果符合全球解决方案。

x0bad。c=[5 1]; x0bad.lam = [1 0]; [solbad,fvalbad,exitflagbad,outputbad] = solve(ssqprob,x0bad)
使用lsqnonlin解决问题。局部最小值。lsqnonlin停止是因为最后的平方和的变化相对于其初始值小于公差的值函数。
solbad =结构体字段:c: [2 x1双]林:[2 x1双)
fvalbad = 2.2173
exitflagbad = FunctionChangeBelowTolerance
outputbad =结构体字段:firstorderopt: 0.0036迭代:31 funcCount: 32 cgiterations: 0算法:“trust-region-reflective”stepsize: 0.0012消息:“局部最小值可能....“objectivederivative:“forward-AD”解算器:“lsqnonlin”
respbad =评估(diffun solbad);持有情节(t, respbad‘g’)传说(“数据”,“全球健康”,“坏当地合适的,“位置”,“不”)举行

图包含一个坐标轴对象。坐标轴对象与标题数据点包含3线类型的对象。这些对象表示数据,全球健康,坏的地方。

流([的残余规范良好的终点是% f,”和坏的残留标准终点% f。),fval fvalbad)
好的终点的残留标准是0.147723,和残余规范坏终点是2.217300。

另请参阅

|

相关的话题