主要内容

MultiStart使用lsqcurvefitlsqnonlin

这个例子展示了如何使用函数来适应数据lsqcurvefit在一起MultiStart.示例的最后显示了使用的相同解决方案lsqnonlin

许多拟合问题有多个局部解决方案。金宝搏官方网站MultiStart可以帮助找到全球解决方案,这意味着最适合。本例首先使用lsqcurvefit因为它的语法方便。

模型是

y 一个 + b x 1 c x 2 + d

输入数据在哪里 x x 1 x 2 ,和参数 一个 b c , d 为未知模型系数。

步骤1。创建目标函数。

编写一个接受数据矩阵的匿名函数xdataN行和两列,并返回一个响应向量N行。这个函数也有一个系数矩阵p,对应于系数向量 一个 b c d

xdata fitfcn = @ (p), p (1) + (2) * xdata(: 1)。*罪(p (3) * xdata(:, 2) +(4)页);

步骤2。创建培训数据。

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

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.没有理由 d 超过 π 在绝对值上,因为正弦函数在任何宽度区间内都取它的取值范围 2 π .假设系数 c 绝对值必须小于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。找到一个全球性的解决方案。

解决安装问题MultiStart50次迭代。将最小误差绘制为的数MultiStart迭代。

ms = MultiStart(“PlotFcns”, @gsplotbestf);[xmulti,errormulti] = run(ms,problem,50)

图MultiStart包含一个axis对象。标题为Best Function Value: 1.6464的axes对象包含2个类型为line, text的对象。

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

从相同的起始点出发p0lsqnonlin得到相同的相对较差的解lsqcurvefit

运行MultiStart使用lsqnonlin作为局部求解器。

问题2 = createOptimProblem(“lsqnonlin”“x0”p0,“目标”fitfcn2,...“磅”磅,乌兰巴托的乌兰巴托的);[x多onlin,error多onlin] = run(ms,problem2,50)

图MultiStart包含一个axis对象。标题为Best Function Value: 1.6464的axes对象包含2个类型为line, text的对象。

MultiStart从所有起始点完成运行。所有50个本地求解器运行都收敛于一个积极的本地求解器退出标志。
xmultinonlin =1×4-2.9852 -0.2472 -0.4968 -1.0438
error多国onlin = 1.6464

再一次,MultiStart找到比单独的局部解更好的解。

相关的话题