lsqcurvefit.
或者lsqnonlin.
此示例显示如何使用函数来使用lsqcurvefit.
和...一起多层的
。该示例的末尾显示了相同的解决方案lsqnonlin.
。
许多拟合问题有多个本地解决方案。金宝搏官方网站多层的
可以帮助找到全球解决方案,这意味着最合适。此示例首先使用lsqcurvefit.
由于其语法方便。
该模型是
输入数据的位置 和参数 那 那 , 和 是未知的模型系数。
编写一个匿名函数,采用数据矩阵xdata.
和N
行和两列,并返回响应矢量N
行。该功能还采用系数矩阵P.
,对应于系数矢量
。
fitfcn = @(p,xdata)p(1)+ p(2)* xdata(:,1)。* sin(p(3)* xdata(:,2)+ p(4));
创建200个数据点和响应。使用值 。在响应中包括随机噪声。
RNG.默认重复性的%n = 200;%数据点数preal = [-3,1 / 4,1 / 2,1];%真实系数xdata = 5 * rand(n,2);% 数据点ydata = fitfcn(preal,xdata)+ 0.1 * randn(n,1);噪声%响应数据
设定界限lsqcurvefit.
。没有理由
超过
在绝对值,因为正弦函数在其全范围内取值在任何宽度间隔内
。假设系数
必须小于20的绝对值小于20,因为允许高频可能导致不稳定的响应或不准确的收敛。
lb = [-inf,-inf,-20,-pi];UB = [INF,INF,20,PI];
将初始点设置为(5,5,5,0)。
p0 = 5 * in(1,4);%任意初始点p0(4)= 0;%确保初始点满足界限
将参数适合数据,开始P0.
。
[Xfitted,errorfited] = LSQCurveFit(FitFCN,P0,XDATA,YDATA,LB,UB)
地方最低可能。LSQCurveFit停止,因为相对于其初始值的平方和总和的最终变化小于功能公差的值。
Xfited =.1×4-2.6149 -0.0238 6.0191 -1.6998
errorfited = 28.2524.
lsqcurvefit.
找到一个没有特别接近模型参数值的本地解决方案(-3,1 / 4,1 / 2,1)。
多层的
。创建一个问题结构多层的
可以解决同样的问题。
问题= createOptimproblem('lsqcurvefit'那'x0',p0,'客观的',fitfcn,......'磅',磅,'UB',UB,'xdata',xdata,'ydata',ydata);
解决拟合问题多层的
有50个迭代。绘制最小的错误作为数量多层的
迭代。
ms = multiStart('plotfcns',@ gsplotbestf);[xmulti,errormulti] =运行(ms,问题,50)
MultiStart完成了所有起始点的运行。所有50个本地解算器运行融合,并使用正本地求解器出口标志。
xmulti =.1×4-2.9852 -0.2472 -0.4968 -1.0438
errormulti = 1.6464
多层的
在参数值(-3,-1 / 4,-1 / 2,-1)附近找到全局解决方案。(这相当于附近的解决方案pr
=(-3,1 / 4,1 / 2,1),因为除了第一个给出相同的数字值之外,更改所有系数的符号fitfcn.
。)残余误差的规范从约28到约1.6减小,降低超过10倍。
lsqnonlin.
出于替代方法,使用lsqnonlin.
作为拟合功能。在这种情况下,使用预测值与实际数据值之间的差异作为目标函数。
fitfcn2 = @(p)fitfcn(p,xdata)-ydata;[xlsqnonlin,errorlsqnonlin] = lsqnonlin(fitfcn2,p0,lb,Ub)
地方最低可能。LSQNONLIN停止,因为相对于其初始值的平方和的最终变化小于功能公差的值。
xlsqnonlin =1×4-2.6149 -0.0238 6.0191 -1.6998
errowlsqnonlin = 28.2524.
从相同的初始点开始P0.
那lsqnonlin.
发现与较差的解决方案相同lsqcurvefit.
。
跑步多层的
使用lsqnonlin.
作为当地的解决者。
问题2 = createOptimproblem('lsqnonlin'那'x0',p0,'客观的',fitfcn2,......'磅',磅,'UB',UB');[xmultinonlin,errormultinonlin] =运行(ms,问题2,50)
MultiStart完成了所有起始点的运行。所有50个本地解算器运行融合,并使用正本地求解器出口标志。
xmultinonlin =1×4-2.9852 -0.2472 -0.4968 -1.0438
errormultinonlin = 1.6464
再次,多层的
仅找到比本地求解器更好的解决方案。