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?
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:
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 :)
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
Dilawar