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

在MATLAB中每次迭代fsolve之间运行一个函数,matlab,least-squares,nonlinear-optimization,Matlab,Least Squares,Nonlinear Optimization,我在MATLAB中使用最小化能量函数。我使用的算法将网格与嘈杂的晶格数据相匹配,计算网格与每个数据点之间的距离 目标函数用平方误差项表示,以允许使用。但是,该程序恢复为Levenberg Marquardt: Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems; using Levenberg-Marquardt algorithm instead. 我意识到这可能是因为,虽然成本

我在MATLAB中使用最小化能量函数。我使用的算法将网格与嘈杂的晶格数据相匹配,计算网格与每个数据点之间的距离

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

Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems;
using Levenberg-Marquardt algorithm instead. 
我意识到这可能是因为,虽然成本有平方误差,但目标(成本)函数中有一个阶段选择了距离每个数据点最近的网格中心,从而使算法非平方

我想做的是分别对最近的网格中心进行分配更新,以评估成本函数的雅可比矩阵。我相信这将允许使用高斯-牛顿,并显著提高算法的速度

目前,我相信有类似的事情正在发生:

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
而i
我希望发生的是:

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
而i
有没有一种方法可以将这样的函数插入到迭代中,而不必分离整个
fsolve
算法?即使我手动编辑了fsolve,Gauss-Newton算法的性质是否允许我添加这一额外步骤


谢谢

因为您正在处理平方误差,无论如何,您可以使用而不是
fsovle
。这允许您计算目标函数中的雅可比矩阵(以及所有必要的准备)。然后将雅可比矩阵作为第二个输出参数返回

太好了,谢谢。它的性能比默认的fsolve算法要好得多,而且我怀疑,当我开始整理自己的雅可比矩阵时,节省的时间会大大减少。Cheers@BillCheatham:你可能还对@woodchips感兴趣,它包括
pless.m
,以及分区最小二乘算法。如果你同时拥有线性和非线性未知数,这个算法可以在速度和稳定性方面产生巨大的差异。