用“lsqcurvefit”拟合高斯时的初始点的局部最小值

时间:2017-08-28 17:39:19

标签: matlab model-fitting

我正在编写MATLAB代码,目的是做一些配件。我使用二阶高斯模拟了一个图(参见下面的代码)并尝试使用lsqcurvefit函数进行拟合。不幸的是,MATLAB返回的猜测值与“优化”相同。参数和显然卡在局部最小值。

有人可以就这里可能出现的问题提供一些建议吗?我知道,如果猜测远离“真实”的话。那么这可能会发生,但我希望MATLAB能够返回一个更接近真值的答案。将初始猜测提高到[29,0](更接近实际值)会产生相同的输出:初始值是局部最小值。

%%%%%%%%%%

function z= testfunction(x, xdata);

sigma=x(1)/(2*sqrt(2*log(2)));

z=((xdata.^2-2*x(2)*xdata-sigma.^2+x(2)^2)./(sigma^5*sqrt(2*pi))).*exp(-(xdata-x(2)).^2/(2.*sigma.^2));

end
%%%%%%%%


% Simulate Data

xdata= -50:1:50;

ydata = testfunction([30,0],xdata);

% Fit Data 

xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata );

xfit(1)
xfit(2)

yfit=testfunction([xfit(1),xfit(2)],xdata);

% Plot Data;
plot(xdata,yfit);
hold on;
plot(xdata,ydata,'o')

输出:

Initial point is a local minimum.

Optimization completed because the size of the gradient at the initial point 
is less than the default value of the optimality tolerance.

<stopping criteria details>


ans =

    19


ans =

    -4

1 个答案:

答案 0 :(得分:2)

简答:检查停止条件详情并相应更改停止条件:

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16, 'FunctionTolerance', 1e-16);
xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata, [], [], options);

有什么问题?

lsqcurvefit是一个数值求解器,因此使用停止标准来确定是否已充分达到局部最小值。一般来说,您永远无法达到确切的解决方案。因此,您的问题的解决方案是更改停止条件以请求更准确的解决方案。

如何解决?

点击停止条件详情,您会收到以下说明:

  

优化完成:最后一点是初始点。该   一阶最优度度量7.254593e-07小于   options.OptimalityTolerance = 1.000000e-06

Optimization Metric                                       Options 
relative first-order optimality =   7.25e-07  OptimalityTolerance =   1e-06 (default)

所以,你应该减少OptimalityTolerance(f.e。到1e-16):

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16);
xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata, [], [], options);

enter image description here

上面的图像显示了新结果,这比前一个更好,但还不是很好。通过再次检查停止标准,您将看到您还需要更改FunctionTolerance

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16, 'FunctionTolerance', 1e-16);

enter image description here

为什么默认选项不好?

请注意,您需要调整停止条件,因为您的函数返回相对较小的值。将z乘以因子1000,而不使用任何选项规范也会产生合适的效果:

enter image description here