levmarは、アルゴンヌ国立研究所で80年代初期に実装さMINPACKから
はLMDERルーチン、C / C ++でのレーベンバーグ·マルカート非線形最小二乗アルゴリズムの実装ですおそらくです最も広くLMアルゴリズムのフリーな実装を使用していました。 LMDERはFORTRAN77で書かれており、年間のソフトウェアの信頼性の高い作品であることが証明された。 FORTRANルーチンは、C / C ++から呼び出すことができることを考えると、1は、問題はFORTRANがCから呼び出されたときに、プログラマが知っておくべきであることであるC.さてにおけるLMのバージョンを記述するための動機についてのだろうか(とに適合可能性があります)通常のCのルールに比べて不自然であるなどの名前の符号化、引数の受け渡し、多次元配列のメモリレイアウト、リンケージ規則、に関するいくつかのルール、。第二の理由は、このアプローチは、ターゲットプログラミング環境のためのFORTRANコンパイラは必ずしもそうではないかもしれない、利用可能であることを当然のかかることである。もう一つの理由は、FORTRAN実装の内部の仕組みを理解するために失敗に関係しています:それは正確にFORTRANコードが何をするかを理解する必要がある場合には時折、それの特定の部分は、FORTRANの知識がなくても、プログラマに不可解に思えるかもしれない。生産されたCコードは "初心者"人間にはかなり読みにくいですので、C言語の翻訳者への自動FORTRAN(例えばF2C)は、問題を解決しない。また、実装の基礎となる数学を記述するドキュメントが不明瞭またはアクセスできない可能性があります。最後になりましたが、Cにおける候補LMの実装では、無料で、技術的に音にする必要があります。たとえば、「数値レシピ "本(すなわちmrqmin)で提示LMアルゴリズムのC変異体は常に実行可能な選択肢ではありません。そのは著作権法により保護されている以外にも、それは堅牢性を欠いていると評されている
は。上記の理由から、私はまた、C ++で使用可能なLMフレーバーのC言語実装が含まlevmarパッケージを開発した。 levmarは、解析と有限差分との両方がヤコビアンを近似し、ダブルとシングル精密LM実装が含まれています。それは、GNU General Public Licenseの下で、無料で提供されています。制約のないlevmarの背後にある数学理論はK·マドセン、HBにより、非線形最小二乗問題のための方法を題し講義ノートに詳しく記載されているニールセンとO. Tingleff、デンマーク工科大学。講義ノートで提示アルゴリズムのMatlabの実装も可能です。ここで採用最小化問題の製剤は講義ノートに記載されたものとは若干異なることに注意してください
は、関数の使用を:。
はlevmarは従ういくつかのユーザから呼び出し可能な関数を提供しています最初の文字(DまたはS)ダブルまたは単精度を指定し、サフィックス(_derまたは_dif)が解析的または近似ヤコビアンを表す:命名規則を次のよう。存在する場合、LEC、BCとblecコンポーネントはそれぞれ、一次方程式、ボックスと同時ボックスと一次方程式の制約を意味している。
は制約なし最適化
はdlevmar_der():具体的には、levmarは、以下の機能が含まれてい倍精度、解析的ヤコビアンに
dlevmar_dif():倍精度、近似有限差分ヤコビアンの
のslevmar_der():単精度、解析的ヤコビアンに
のslevmar_dif():単精度、有限差分がヤコビアン
は制約付き最適
はdlevmar_lec_der()に近似:倍精度、一次方程式の制約、解析的ヤコビアンに
dlevmar_lec_dif():倍精度、一次方程式の制約は、有限差分がヤコビアンに
slevmar_lec_der()に近似:単精度、一次方程式の制約を、解析的ヤコビアンに
slevmar_lec_dif():単精度、一次方程式の制約、有限差分は近似ヤコビアン
はdlevmar_bc_der():倍精度、箱の制約、解析的ヤコビアンに
dlevmar_bc_dif():倍精度、箱の制約、有限単精度、箱の制約、解析的ヤコビアンに
slevmar_bc_dif():差がヤコビアンに
slevmar_bc_der()を近似単精度、ボックス制約、有限差分がヤコビアン
はdlevmar_blec_der()に近似:ダブル精度、ボックス&一次方程式の制約、解析的ヤコビアンに
のdlevmar_blec_dif():単精度、ボックス&一次方程式の制約、解析的ヤコビアン:倍精度、ボックス&一次方程式の制約は、有限差分がヤコビアンに
slevmar_blec_derを()で近似
はslevmar_blec_dif():単精度、ボックス&一次方程式の制約、有限差分が嵌合する機能の反復的な評価でヤコビアン結果を近似する有限差分を使用していることをヤコビアン
は注意して近似していた。これらの評価の合計数を減らすことを目指し、xxxxxxx_dif機能がブロイデンの順位1の更新プログラムを使用してヤコビ行列に割線近似を実装する。彼らは最高の(L2ノルムの点で)説明したパラメータベクトルpの測定値ベクトルxを求める。すなわちすべての関数は、同じ問題を解決。より正確には、ベクトル関数f所与:R ^メートル - > R ^ nのnが> = mで、それらをf(p)は〜= xは、自乗ノルム||電子|| ^ 2 =すなわちようにpを計算| |のxf(p)は|| ^ 2が最小化される。また、フォームのLBのボックスの制約[i]が
のこのリリースのの新機能は次のとおりです。
- このバージョンでは、のためのサポートが追加されています出発点は、真の最小解から遠いときの収束を向上させることができますxlevmar_bc_der()、対角スケーリングします。
- プラズマ、マルチコアプロセッサのための線形代数ライブラリと並列コレスキー分解をサポートしている線形システムソルバーます。
- は線形ソルバーは優れたキャッシュ·パフォーマンス、その結果、修正されています。
- は、プロジェクトを構築するためのCMakeの設定ファイルが修正されている。
- は他のいくつかのマイナーな変更が行われました。
- 注意:
- 同時ボックス、線形方程式と不等式制約(関数xlevmar_bleic_der()&xlevmar_bleic_dif()を参照)の下で最小化のサポートを追加します。
- (xlevmar_bleic_derする便利なラッパーを実装)&xlevmar_bleic_dif()簡単な制約のケースを扱って、例えばボックスの下xlevmar_blic_der()&xlevmar_blic_dif()のサポートの最小化と線形不等式制約のみます。
- はUDUt分解(すなわち、SQRTフリーコレ)に基づく線形システムソルバーを追加しました。
- ほとんどの線形ソルバからいくつかの不要なメモリコピーを削除します。
- 新しいデータ近似テスト問題(オズボーン)を加えます。
- 他のいくつかのマイナーな変更を加えます。
彼らは対称行列の下の三角形に動作するように
以前のバージョンのユーザーのための
のバージョン2.5でのどのような新機能は、より良い一貫性とを避けるために競合は、levmarのヘッダファイルの名前は、levmar.hするlm.hから変更されました。それに応じてソースファイルを更新してくださいます。
のバージョン2.4での新機能:以前のバージョンのユーザーのための
- 注意:info引数のサイズ(すなわち、LM_INFO_SZ)(すなわち、インフォ[9])の最小化の過程で解決線形システムの総数に対応する新しいリターン·フィールドを収容するために1つ増加した。情報·アレイ内の以前に返されるフィールドのインデックスは変更されません。
- は小型の最小化問題に対する近似ヘッセ行列J ^ T * JとJ ^ T *がeを計算するための複数のキャッシュ·効率的なスキームを実装します。
- は線形ソルバーの呼び出しの間に保持すべての作業メモリがlevmarルーチンの終了時に解放されることを保証します。
- 線形ソルバーが過配分時折を避け、補助メモリの最小必要量を採用することを保証します。
- は、E = xで-HXの計算を高速化するためのループ展開スキームを実装します。
- 64ビットシステム上のメモリ配置の問題のカップルを修正します。
- 決定係数の計算のための機能を追加しました。
- は、いくつかのマイナーな問題に対処しました。
コメントが見つかりません