C/C++-Bibliothek zum Lösen nichtlinearer Gleichungssysteme

Mein Gleichungssystem sieht so aus:

(x - a 1 ) 2 + (y - b 1 ) 2 = c 1

(x - a 2 ) 2 + (y - b 2 ) 2 = c 2

Ich weiß, dass es mit Matlab einfach ist:

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

Aber wie löst man dieses Problem mit C/C++? Ich kenne eine Mathematikbibliothek namens lapack, aber für lineare Gleichungen. Irgendwelche Vorschläge?

Ich habe eine Implementierung der Newton-Raphson-Methode geschrieben, siehe hier für Details: dilawarnotes.wordpress.com/2016/04/14/… . Es ist nicht gut getestet.

Antworten (3)

Referenz: Welche guten Bibliotheken gibt es zum Lösen eines Systems nichtlinearer Gleichungen in C++?

Ich nehme an, Sie meinen freie Software. Unter Bezugnahme auf die obige Stackoverflow-Frage könnten Sie Folgendes verwenden:

  1. Sonnenuhren: https://computation.llnl.gov/casc/sundials/main.html
  2. GNU: http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Root_002dFinding.html#index-nonlinear-systems-of-equations_002c-solution-of-2426

Der Rest, der in der referenzierten Stackoverflow-Frage aufgeführt ist, basiert auf Fortran. Sie können sie nur verwenden, wenn Sie f2c (Fortran to C-Programm) verwenden.

Ich möchte einige Antworten vorschlagen, die ich nach ein wenig Suche im Internet gefunden habe. Aber es ist immer die Tatsache, dass die Bibliothek von Ihren individuellen Bedürfnissen abhängt :)

  • Eigen Eigen ist eine C++-Vorlagenbibliothek für lineare Algebra: Matrizen, Vektoren, numerische Löser und verwandte Algorithmen. Es unterstützt alle Matrizengrößen, von kleinen Matrizen fester Größe bis hin zu beliebig großen dichten Matrizen und sogar Matrizen mit geringer Dichte. Es unterstützt alle standardmäßigen numerischen Typen, einschließlich std::complex, Ganzzahlen, und ist leicht erweiterbar auf benutzerdefinierte numerische Typen und verschiedene Matrixzerlegungen und Geometriefunktionen. Sein Ökosystem aus nicht unterstützten Modulen bietet viele spezialisierte Funktionen wie nichtlineare Optimierung, Matrixfunktionen, einen Polynomlöser, FFT und vieles mehr.
  • Trilinos Es bietet viele Klassen und Funktionen, um Vektoren und Matrizen parallel zu verwalten, lineare und nichtlineare Systeme zu lösen, gewöhnliche Differentialgleichungen zu lösen und Eigenwerte zu berechnen usw .
  • ALIAS-C++ Eine C++-Algorithmenbibliothek zur Intervallanalyse für Gleichungssysteme zum Lösen von Systemen mit linearen und nichtlinearen Termen

  • MINPACK Dies ist eine Bibliothek von FORTRAN-Subroutinen für das Lösen von Systemen nichtlinearer Gleichungen oder die Minimierung der kleinsten Quadrate des Residuums eines Satzes von linearen oder nichtlinearen Gleichungen.

Quelle: Liste numerischer Bibliotheken

Betrachten Sie omnn::math https://github.com/ohhmm/openmind/blob/master/omnn/math/test/08_System.cpp

    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, eine einzige Gleichung zu erstellen:

((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;

Hier ist das CMake-Beispielprojekt: https://github.com/ohhmm/NonLinearSystem

hast du eine Linux-Version? Ich möchte nur schnell Ihre Codes testen. Keine Fenster hier :(
Ja, es ist plattformübergreifend mit cmake. Wenn Sie beim Kompilieren auf Schwierigkeiten stoßen, versuchen Sie, den Clang-Compiler während der Konfiguration festzulegen. Füllen Sie kostenlos aus, um Pull-Requests zu senden. Aktueller Entwicklungszweig ist 'ts'.
@math101, Abzug-fw.org
brauche ich wirklich clang? Ich denke, Clang ist hauptsächlich für Mac-Benutzer. Ich verwende VS-Codes und :: Codeblock für cpp unter Linux ... glaube nicht, dass ich hier einen Clang-Compiler habe: (
Ich bin auf Ubuntu 20.04. Vielleicht sollte ich clang-9 bekommen?
Es kann derzeit mit GCC auf Ubuntu 20.04 erstellt werden