主要内容

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 *兰德(N, 2);%的数据点ydata = fitfcn(preal,xdata) + 0.1*randn(N,1); / /响应数据带噪声

步骤3。设置边界和起始点。

设置范围lsqcurvefit.没有理由 d 超过 π 用绝对值表示,因为正弦函数在它的整个范围内取任意宽度区间内的值 2 π .假设系数 c 绝对值必须小于20,因为允许高频可能导致不稳定的响应或不准确的收敛。

磅=(负负无穷,-20年,-π);乌兰巴托=(π正无穷,正无穷,20日);

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

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

步骤4。找到最适合当地的。

将参数与数据匹配,从p0

[xfitted, errorfitted] = lsqcurvefit (p0, fitfcn xdata, ydata,磅,乌兰巴托)
局部最小值。Lsqcurvefit停止是因为相对于初始值的平方和的最终变化小于函数公差的值。
xfitted =1×46.0191 -1.6998
errorfitted = 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迭代。

= MultiStart(女士“PlotFcns”, @gsplotbestf);[xmulti, errormulti] =运行(ms,问题,50)

图MultiStart包含一个轴对象。标题为Best Function Value: 1.6464的轴对象包含两个类型为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 (p0, fitfcn2磅,乌兰巴托)
局部最小值。Lsqnonlin停止的原因是相对于初始值的平方和的最终变化小于函数的容差值。
xlsqnonlin =1×46.0191 -1.6998
errorlsqnonlin = 28.2524

从相同的起始点开始p0lsqnonlin找到与。相同的相对较差的解决方案lsqcurvefit

运行MultiStart使用lsqnonlin作为本地解算器。

问题2 = createOptimProblem (“lsqnonlin”“x0”p0,“目标”fitfcn2,“磅”磅,乌兰巴托的乌兰巴托的);[xmultinonlin, errormultinonlin] =运行(女士,问题2,50)

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

MultiStart完成了所有起点的运行。所有50个本地求解器都以一个正的本地求解器退出标志运行。
xmultinonlin =1×4-2.9852 -0.2472 -0.4968 -1.0438
errormultinonlin = 1.6464

再一次,MultiStart找到一个比本地求解器更好的解。

相关的话题