2

我正在使用fsolve最小化 MATLAB 中的能量函数。我正在使用的算法将网格拟合到嘈杂的格子数据,并以网格到每个数据点的距离为代价。

目标函数用平方误差项来表示,以允许使用Gauss-Newton 算法。但是,该程序恢复为 Levenberg-Marquardt:

Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems;
using Levenberg-Marquardt algorithm instead. 

我意识到这可能是因为虽然成本有平方误差,但目标(成本)函数中有一个阶段选择离每个数据点最近的网格中心,从而使算法非平方。

我想要做的是分别执行最近网格中心的分配更新,以评估成本函数的雅可比行列式。我相信这将允许使用 Gauss-Newton,并显着提高算法的速度。

目前,我相信有这样的事情发生:

while i < options.MaxIter && threshold has not been met
    Compute Jacobian of cost function (which includes assignment routine)
    Move down the slope in the direction of highest gradient
end

我想发生的事情是:

while i < options.MaxIter && threshold has not been met
    Perform assignment routine
    Compute Jacobian of cost function (which is now square, as no assignment occurs)
    Move down the slope
end

有没有办法在不分离整个算法的情况下将这样的函数插入到迭代中fsolve?即使我手动编辑 fsolve,Gauss-Newton 算法的性质是否允许我添加这个额外的步骤?

谢谢

4

1 回答 1

1

由于您正在处理平方误差,因此您可以使用LSQNONLIN而不是fsovle. 这允许您在目标函数中计算雅可比行列式(以及所有必要的准备工作)。然后将 Jacobian 作为第二个输出参数返回。

于 2011-04-05T13:55:39.310 回答