2

私はfsolveMATLABのエネルギー関数を最小化するために使用しています。私が使用しているアルゴリズムは、グリッドをノイズの多い格子データに適合させますが、各データポイントからのグリッドの距離にコストがかかります。

目的関数は、ガウス・ニュートンアルゴリズムを使用できるように、二乗誤差項で定式化されます。ただし、プログラムはLevenberg-Marquardtに戻ります。

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

これはおそらく、コストに二乗誤差がある一方で、各データポイントに最も近いグリッド中心を選択する目的(コスト)関数のステージがあり、アルゴリズムが非二乗になるためであることに気付きました。

私がやりたいのは、コスト関数のJacobianの評価とは別に、最も近いグリッド中心のこの割り当ての更新を実行することです。これにより、ガウス・ニュートン法を使用できるようになり、アルゴリズムの速度が大幅に向上すると思います。

現在、私はこのようなことが起こっていると信じています:

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を手動で編集した場合でも、ガウス-ニュートンアルゴリズムの性質により、この追加の手順を追加できますか?

ありがとう

4

1 に答える 1

1

とにかく、二乗誤差を処理しているので、の代わりにLSQNONLINを使用できますfsovle。これにより、目的関数でJacobian(および必要なすべての準備)を計算できます。次に、Jacobianが2番目の出力引数として返されます。

于 2011-04-05T13:55:39.310 に答える