lsqcurvefit
或lsqnonlin
这个例子展示了如何使用函数来适应数据lsqcurvefit
在一起MultiStart
.示例的最后显示了使用相同的解决方案lsqnonlin
.
许多拟合问题有多个局部解。金宝搏官方网站MultiStart
可以帮助找到全球解决方案,也就是最合适的。本示例首先使用lsqcurvefit
因为它的语法很方便。
模型是
输入数据在哪里 ,参数 , , , 为未知模型系数。
编写一个匿名函数,接受一个数据矩阵xdata
与N
行和两列,并返回响应向量N
行。这个函数也需要一个系数矩阵p
,对应于系数向量
.
xdata fitfcn = @ (p), p (1) + (2) * xdata(: 1)。*罪(p (3) * xdata(:, 2) +(4)页);
创建200个数据点和响应。使用的值 .在响应中包含随机噪声。
rng默认的%的再现性N = 200;%数据点个数preal =[3、1/4、1/2,1];%的系数xdata = 5 *兰德(N, 2);%的数据点ydata = fitfcn(preal,xdata) + 0.1*randn(N,1); / /响应数据带噪声
设置范围lsqcurvefit
.没有理由
超过
用绝对值表示,因为正弦函数在它的整个范围内取任意宽度区间内的值
.假设系数
绝对值必须小于20,因为允许高频可能导致不稳定的响应或不准确的收敛。
磅=(负负无穷,-20年,-π);乌兰巴托=(π正无穷,正无穷,20日);
任意设置初始点为(5,5,5,0)。
p0 = 5 * 1 (1,4);任意起始点%p0 (4) = 0;%确保初始点满足边界
将参数与数据匹配,从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)的局部解。
MultiStart
.创建一个问题结构MultiStart
可以解决同样的问题。
问题= createOptimProblem (“lsqcurvefit”,“x0”p0,“目标”fitfcn,…“磅”磅,乌兰巴托的乌兰巴托,“xdata”xdata,“ydata”, ydata);
解决了装配问题的使用MultiStart
和50个迭代。将最小的误差绘制为MultiStart
迭代。
= MultiStart(女士“PlotFcns”, @gsplotbestf);[xmulti, errormulti] =运行(ms,问题,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 (p0, fitfcn2磅,乌兰巴托)
局部最小值。Lsqnonlin停止的原因是相对于初始值的平方和的最终变化小于函数的容差值。
xlsqnonlin =1×46.0191 -1.6998
errorlsqnonlin = 28.2524
从相同的起始点开始p0
,lsqnonlin
找到与。相同的相对较差的解决方案lsqcurvefit
.
运行MultiStart
使用lsqnonlin
作为本地解算器。
问题2 = createOptimProblem (“lsqnonlin”,“x0”p0,“目标”fitfcn2,…“磅”磅,乌兰巴托的乌兰巴托的);[xmultinonlin, errormultinonlin] =运行(女士,问题2,50)
MultiStart完成了所有起点的运行。所有50个本地求解器都以一个正的本地求解器退出标志运行。
xmultinonlin =1×4-2.9852 -0.2472 -0.4968 -1.0438
errormultinonlin = 1.6464
再一次,MultiStart
找到一个比本地求解器更好的解。