Mi sistema de ecuaciones es así:
(x - un 1 ) 2 + (y - segundo 1 ) 2 = c 1
(x - un 2 ) 2 + (y - segundo 2 ) 2 = c 2
Sé que es simple usando matlab:
solve((x-a1)^2 + (y-b1)^2 - c1, (x-a2)^2 + (y-b2)^2 - c2)
Pero, ¿cómo resolver este problema usando C/C++? Conozco una biblioteca matemática llamada lapack
, pero es para ecuaciones lineales. ¿Alguna sugerencia?
Referencia: ¿Qué buenas bibliotecas existen para resolver un sistema de ecuaciones no lineales en C++?
Supongo que te refieres al software libre. Haciendo referencia a la pregunta anterior de stackoverflow, podría usar:
El resto de ellos que se enumeran en la pregunta de stackoverflow a la que se hace referencia están basados en Fortran. Solo puede usarlos si usa f2c (programa Fortran to C)
Me gustaría sugerir algunas respuestas que encontré en la web después de hacer un poco de búsqueda, pero siempre es el hecho de que la biblioteca depende de sus necesidades individuales :)
ALIAS-C++ A C++ Algorithms Library of Interval Analysis for Equation Systems for Resolver sistemas con términos lineales y no lineales
MINPACK Es una librería de subrutinas FORTRAN para la resolución de sistemas de ecuaciones no lineales, o la minimización por mínimos cuadrados del residual de un conjunto de ecuaciones lineales o no lineales.
Fuente: Lista de bibliotecas numéricas
considere 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;
forma alternativa es hacer una sola ecuación:
((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;
Aquí está el proyecto CMake de muestra: https://github.com/ohhmm/NonLinearSystem
Dilawar