我正在使用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 算法的性质是否允许我添加这个额外的步骤?
谢谢