多段使用最小二乘拟合解非线性最小二乘问题

此示例演示如何使用最小二乘拟合一起多段. 示例的结尾显示了使用解非线性最小二乘问题.

许多拟合问题都有多个局部解。万博 尤文图斯多段有助于找到全局解决方案,这意味着最佳匹配。这个例子首先使用最小二乘拟合因为它的语法很方便。

模型是

是的 = + 1个 ( c类 2个 + ) ,

输入数据在哪里 = ( 1个 , 2个 ) ,以及参数 , , c类 ,和 是未知的模型系数。

第一步。创建目标函数。

编写接受数据矩阵的匿名函数外部数据存储器具有N个行和两列,并返回一个响应向量N个排。该函数还采用系数矩阵第页,对应于系数向量 ( , , c类 , ) .

fitfcn=@(p,扩展数据)p(1)+p(2)*扩展数据(:,1)。*sin(p(3)*扩展数据(:,2)+p(4));

第二步。创建培训数据。

创建200个数据点和响应。使用这些值 = - , = 1个 / 4个 , c类 = 1个 / 2个 , = 1个 . 在响应中包含随机噪声。

rng公司违约%再现性N=200;%数据点数量preal=[-3,1/4,1/2,1];%实系数扩展数据=5*rand(N,2);%数据点是的丁一ta = fitfcn(preal,xdata) + 0.1*randn(N,1);%噪声响应数据

第三步。设置边界和初始点。

设置的界限最小二乘拟合. 没有理由 to exceed π 在绝对值中,因为正弦函数在其整个范围内的任何宽度间隔内接受值 2个 π .Assume that the coefficient c类 绝对值必须小于20,因为允许高频率会导致不稳定的响应或不准确的收敛。

lb=[-Inf,-Inf,-20,-pi];ub=[Inf,Inf,20,pi];

将初始点任意设置为(5,5,5,0)。

p0=5*1(1,4);%任意起始点p0(4)=0;%确保初始点满足边界

第四步。找到最适合当地的。

将参数与数据匹配,从0分.

[xfitted,errorfitted]=lsqcurvefit(fitfcn,p0,扩展数据,ydata,lb,ub)
可能是局部最小值。lsqcurvefit停止,因为相对于其初始值的平方和的最终变化小于函数公差的值。
已写入=1×4个-2.6149-0.0238 6.0191-1.6998
误差拟合=28.2524

最小二乘拟合查找与模型参数值不太接近的局部解决方案(–3,1/4,1/2,1)。

第五步。设置问题多段.

C类reate a problem structure so多段可以解决同样的问题。

问题=创建优化问题('lsqcurvefit','x0',p 0,“目标”,菲夫肯,我是。。。“磅”,磅,'ub',ub,'扩展数据',扩展数据,'伊达',伊达);

第6步。找到一个全球性的解决方案。

使用解决拟合问题多段有50次迭代。将最小误差绘制为多段迭代。

ms=多段('绘图Fcns',@gsplotbestf);[xmulti,errormulti]=运行(ms,问题,50)

MultiStart从所有起点完成了运行。所有50个局部解算器运行收敛于一个正的局部解算器退出标志。
xmulti公司=1×4个-2.9852-0.2472-0.4968-1.0438
多错误=1.6464

多段在参数值(–3,–1/4,–1/2,–1)附近查找全局解决方案。(这相当于柏油=(-3,1/4,1/2,1),因为改变除第一个系数外的所有系数的符号,得到相同的数值fitfcn残差的范数从约28降到约1.6,降幅超过10倍。

Formulate Problem for解非线性最小二乘问题

对于另一种方法,使用解非线性最小二乘问题作为拟合函数。在这种情况下,使用预测值和实际数据值之间的差异作为目标函数。

fitfcn2个=@(p)fitfcn(p,xdata)-ydata; [xlsqnonlin,errorlsqnonlin] = lsqnonlin(fitfcn2,p0,lb,ub)
可能是局部最小值。lsqnonlin停止,因为相对于其初始值的平方和的最终变化小于函数公差的值。
十解非线性最小二乘问题=1×4个-2.6149-0.0238 6.0191-1.6998
误差qnonlin=28.2524

从同一起始点开始0分,解非线性最小二乘问题找到与最小二乘拟合.

跑步多段使用解非线性最小二乘问题作为本地解决方案。

problem2=创建优化问题('lsqnonlin','x0',p 0,“目标”,fitfcn2,我是。。。“磅”,磅,'ub',ub');[xmultinonlin,errormultinonlin]=运行(ms,问题2,50)

MultiStart从所有起点完成了运行。所有50个局部解算器运行收敛于一个正的局部解算器退出标志。
xmultinonlin公司=1×4个-2.9852-0.2472-0.4968-1.0438
errormultinonlin=1.6464

再一次,多段找到比单独使用本地解算器更好的解决方案。

相关主题