Was gute Bibliotheken gibt es für ein System von nicht-linearen Gleichungen in C ++ zu lösen?

StackOverflow https://stackoverflow.com/questions/4233964

Frage

In einer C ++ Anwendung ich bin Codierung, ich brauche ein System von nicht -linear Gleichungen (N Gleichungen, N Unbekannten) zu lösen.

Die Systeme, die ich zu lösen habe sein wird eher klein (bis zu 10 Gleichungen / Unbekannte), so dass Leistung wird nicht ein echtes Problem sein. Ich habe gesucht, das Web ein wenig für eine nichtlinearen Solver-Bibliothek, und ich konnte nicht, um etwas zu bekommen, das leicht zu bedienen sieht (GOT auf NOX und C / C ++ minpack , aber beide scheinen zuviel des Guten für mein Bedürfnis zu sein).

Alle Gedanken und Ideen von einfach zu bedienende Bibliotheken für diesen Zweck?

War es hilfreich?

Lösung

Es gibt zwei Möglichkeiten für Sie, können Sie die Sonnenuhren Pakete verwenden, die einen nichtlinearen Solver enthält, geschrieben in C, denke ich. Das einzige Problem, das ich mit ihm gefunden habe, ist, dass Sie es gut, erste Schätzungen geben müssen. Die zweite Option ist NLEQ oder NLEQ2 zu verwenden, die ich denke, sind überlegen (writtein in Fortran, aber leicht zu Link zu C wie langages. Allerdings habe ich einige Probleme hat es gerade jetzt zu lokalisieren. Es gibt eine gute Website mit einer Liste der möglichen Optionen an: http://plato.asu.edu/sub/zero.html

Andere Tipps

Man sollte klar sein: Nicht-lineare Gleichung Lösung ist nicht einfach. Es ist nicht die gleiche wie lineare Gleichungen zu lösen. Sie sind nicht immer eine Lösung erhalten garantiert. Und Ihre Wahl der Ausgangszustand und Inkrementierung Strategie eine starke Wirkung auf die Lösung haben, können Sie nun tun.

Mit diesem wird gesagt, ich kann nicht eine bestimmte Bibliothek empfehlen, aber Sie sollten für ein lineares Algebra-Paket auf der Suche sein, die Newton-Raphson Iteration in seinem Auswahlmenü enthält.

Numerical Recipes hat eine Routine, die die Arbeit für Sie tun wird.

Es hängt davon ab, wie nicht-lineare Gleichungen sind. Wenn sie ein paar „nette“ Eigenschaften ... offensichtlichste ist positiv semi-definite Matrix oder Konvexität besitzen, kann es spezialisierte Algorithmen verfügbar werden. Ich verwende IBM / ILOG CPLEX für die meisten meiner linearen Programmierung benötigt. Bibliotheken bereitgestellt, die in C ++ Anwendungen gezogen werden kann. Obwohl ich nicht ihre quadratische Programmiermodul verwendet habe, ist es wirklich das state-of-the-art in hohen Pferdestärken linear und (artig) nicht-lineare Programmierung.

Haben Sie unter COIN-OR geschaut? Es könnte helfen, wenn Sie Ihre Frage an den OR-Austausch einreichen.

Es ist nicht frei von irgendwelchen Mitteln, aber Solver würde hier arbeiten.

Microsoft Z3 https: // Github .com / Z3Prover / z3 / Blob / Master / Beispiele / C% 2B% 2B / example.cpp

Sehen Sie auch omnn :: Mathematik: https://github.com/ohhmm/openmind/ Blob / Master / omnn / math / test / 08_System.cpp

Lassen Sie uns sagen Gleichungssystem ist wie folgt:

(x-a1)^2 + (y-b1)^2 = c1
(x-a2)^2 + (y-b2)^2 = c2

Dann haben Sie einige Optionen:

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;

alternativer Weg ist, einzelne Gleichung (siehe warum ) zu machen :

((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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top