在MATLAB的fsolve的每次迭代之间运行一个函数

时间:2011-04-05 13:43:34

标签: matlab least-squares nonlinear-optimization

我正在使用fsolve来最小化MATLAB中的能量函数。我正在使用的算法适合网格到噪声的网格数据,网格距离每个数据点的成本。

目标函数采用平方误差项来表达,以允许使用Gauss–Newton algorithm。然而,该计划恢复到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算法的性质是否允许我添加这个额外的步骤?

由于

1 个答案:

答案 0 :(得分:1)

由于您正在使用平方误差,因此您可以使用LSQNONLIN代替fsovle。这允许您在目标函数中计算雅可比(以及所有必要的准备)。雅各比派然后作为第二输出参数返回。