MultiStart使用lsqcurvefit
或lsqnonlin
这个例子展示了如何使用函数来适应数据lsqcurvefit
在一起MultiStart
.示例的最后显示了使用的相同解决方案lsqnonlin
.
许多拟合问题有多个局部解决方案。金宝搏官方网站MultiStart
可以帮助找到全球解决方案,这意味着最适合。本例首先使用lsqcurvefit
因为它的语法方便。
模型是
输入数据在哪里 ,和参数 , , , 为未知模型系数。
步骤1。创建目标函数。
编写一个接受数据矩阵的匿名函数xdata
与N
行和两列,并返回一个响应向量N
行。这个函数也有一个系数矩阵p
,对应于系数向量
.
xdata fitfcn = @ (p), p (1) + (2) * xdata(: 1)。*罪(p (3) * xdata(:, 2) +(4)页);
步骤2。创建培训数据。
创建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);%带有噪声的响应数据
步骤3。设置边界和起始点。
为lsqcurvefit
.没有理由
超过
在绝对值上,因为正弦函数在任何宽度区间内都取它的取值范围
.假设系数
绝对值必须小于20,因为允许高频率会导致不稳定的响应或不准确的收敛。
lb = [-Inf,-Inf,-20,-pi];ub = [Inf,Inf,20,pi];
将初始点任意设置为(5,5,5,0)。
P0 = 5*ones(1,4);%任意起始点P0 (4) = 0;确保初始点满足边界
步骤4。找到当地最合适的。
将参数与数据匹配,从p0
.
[xfitting, errorfitting] = lsqcurvefit(fitfcn,p0,xdata,ydata,lb,ub)
局部最小值。Lsqcurvefit停止了,因为相对于其初始值的平方和的最终变化小于函数公差的值。
xfitted =1×4-2.6149 -0.0238 6.0191 -1.6998
errorfits = 28.2524
lsqcurvefit
找到一个局部解,它不是特别接近模型参数值(- 3,1/4,1/2,1)。
第5步。设置问题MultiStart
.
创建一个问题结构MultiStart
可以解决同样的问题。
问题= createOptimProblem(“lsqcurvefit”,“x0”p0,“目标”fitfcn,...“磅”磅,乌兰巴托的乌兰巴托,“xdata”xdata,“ydata”, ydata);
步骤6。找到一个全球性的解决方案。
解决安装问题MultiStart
50次迭代。将最小误差绘制为的数MultiStart
迭代。
ms = MultiStart(“PlotFcns”, @gsplotbestf);[xmulti,errormulti] = run(ms,problem,50)
MultiStart从所有起始点完成运行。所有50个本地求解器运行都收敛于一个积极的本地求解器退出标志。
xmulti =1×4-2.9852 -0.2472 -0.4968 -1.0438
Errormulti = 1.6464
MultiStart
在参数值(-3,-1 /4,-1 /2,-1)附近找到全局解。(这等价于附近的解preal
=(- 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
Errorlsqnonlin = 28.2524
从相同的起始点出发p0
,lsqnonlin
得到相同的相对较差的解lsqcurvefit
.
运行MultiStart
使用lsqnonlin
作为局部求解器。
问题2 = createOptimProblem(“lsqnonlin”,“x0”p0,“目标”fitfcn2,...“磅”磅,乌兰巴托的乌兰巴托的);[x多onlin,error多onlin] = run(ms,problem2,50)
MultiStart从所有起始点完成运行。所有50个本地求解器运行都收敛于一个积极的本地求解器退出标志。
xmultinonlin =1×4-2.9852 -0.2472 -0.4968 -1.0438
error多国onlin = 1.6464
再一次,MultiStart
找到比单独的局部解更好的解。