C++ で非線形方程式系を解くための優れたライブラリにはどのようなものがありますか?
-
26-09-2019 - |
質問
私がコーディングしている C++ アプリケーションでは、次のシステムを解決する必要があります。 非- 線形方程式 (N 個の方程式、N 個の未知数)。
私が解いているシステムはかなり小さいので (方程式/未知数が 10 個まで)、パフォーマンスは大きな問題にはなりません。Web で非線形ソルバー ライブラリを少し検索しましたが、使いやすそうなものを見つけることができませんでした ( NOX そして C/C++ ミンパック, 、しかしどちらも私のニーズには過剰なようです)。
この目的のために使いやすいライブラリに関する考えやアイデアはありますか?
解決
あなたのための2つのオプションがあり、あなたは私が考えてCで書かれた非線形ソルバーを備え日時計パッケージを使用することができます。私はそれを見つけた唯一の問題は、あなたがそれを良い初期推定値を与える必要があるということです。 2番目のオプションは、私が(優れたFORTRANでwritteinしかしlangagesなどのCへのリンクに簡単です。しかし、私はちょうど今それを見つけるいくつかの問題があったと思うNLEQまたはNLEQ2を使用することです。可能なオプションのリストとの良好なウェブサイトがあります時: http://plato.asu.edu/sub/zero.htmlする
他のヒント
は一つのことは明らかである:非線型方程式の解は容易ではありません。これは、一次方程式を解くことと同じではありません。あなたは常に解を得ることが保証されていません。そして、初期条件とインクリメント戦略のあなたの選択は、あなたが得るか解決策に大きな影響を持つことができます。
ということで、私は特定のライブラリをお勧めすることはできませんが、あなたは選択肢のそのメニューにニュートン・ラプソン反復を含み、線形代数パッケージに目を光らせする必要があります。
数値レシピ、あなたのために仕事をするルーチンを持っています。
これは、非線型方程式である方法によって異なります。彼らはいくつかの「良い」性質を持っている場合は...最も明白なビーイングの正半定値行列や凸部は、アルゴリズムが利用可能に特化することができます。私は私の線形計画ニーズのほとんどのためにIBM / ILOG CPLEXを使用します。ライブラリは、C ++アプリケーションに引き込むことができるように提供されています。私は彼らの二次計画モジュールを使用していないが、それは本当に高馬力の線形および(行儀)非線形計画における最先端のです。
常に GSL がありますが、他の回答で行われたコメントはすべてこれにも当てはまります。
あなたは COIN-OR のを見たことがありますか?それはあなたがOR-Exchangeにあなたの質問を提出した場合に役立つかもしれない。
これは、任意の手段によって無料ではないですが、ソルバーにここに働くだろう。
マイクロソフトZ3 ます。https:// githubの.COM / Z3Prover / Z3 / BLOB /マスター/例/ C%2B%2B / example.cpp の
またomnn考える::数学: https://github.com/ohhmm/openmind/ブロブ/マスター/ omnn /数学/テスト/ 08_System.cppする
は方程式の言うシステムは、このようなものですします
(x-a1)^2 + (y-b1)^2 = c1
(x-a2)^2 + (y-b2)^2 = c2
そして、あなたはカップルのオプションがあります:
Valuable a1, a2, b1, b2; // init with values
System sys;
Variable x,y;
sys << (x-a1)^2 + (y-b1)^2 - c1; // addin an equation as an equality to 0
sys << (x-a2)^2 + (y-b2)^2 - c2;
for(auto& solution : sys.Solve(x))
std::cout << solution;
別の方法は、単一の方程式は(理由のを参照)を作ることです:
((X-A1)^ 2 +(Y-B1)^ 2 - C1)^ 2 +((X-A2)^ 2 +(Y-B2)^ 2 - C2)^ 2 = 0
Variable x,y;
Valuable a1, a2, b1, b2; // init with values
auto eq = ((x-a1)^2 + (y-b1)^2 - c1)^2 + ((x-a2)^2 + (y-b2)^2 - c2)^2;
eq.SetView(Valuable::View::Equation); // optional: equation optimizations
// get y function:
auto fn = eq(y);
// show
std::cout << fn << std::endl;
// evaluate
auto evaluate = fn;
evaluate.eval(x, 10);
evaluate.optimize(); // calculate
// show calculated value at x=10:
std::cout << evaluate << std::endl;