Biblioteca C/C++ para resolver sistemas de ecuaciones no lineales

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?

Escribí una implementación del método Newton-Raphson, vea aquí para más detalles: dilawarnotes.wordpress.com/2016/04/14/… . No está bien probado.

Respuestas (3)

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:

  1. Relojes de sol: 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

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

  • Eigen Eigen es una biblioteca de plantillas de C++ para álgebra lineal: matrices, vectores, solucionadores numéricos y algoritmos relacionados. Admite todos los tamaños de matriz, desde matrices pequeñas de tamaño fijo hasta matrices densas arbitrariamente grandes e incluso matrices dispersas. Admite todos los tipos numéricos estándar, incluidos std::complex, integers, y es fácilmente extensible a tipos numéricos personalizados. Varias descomposiciones de matrices y funciones de geometría. Su ecosistema de módulos no compatibles proporciona muchas funciones especializadas, como optimización no lineal, funciones de matriz, un solucionador de polinomios, FFT y mucho más.
  • Trilinos Proporciona una gran cantidad de clases y funciones para manejar vectores y matrices en paralelo, resolver sistemas lineales y no lineales, resolver ecuaciones diferenciales ordinarias y calcular autovalores, etc.
  • 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

¿Tienes una versión de Linux? Solo quiero probar rápidamente tus códigos. No hay ventanas aquí :(
Sí, es multiplataforma con cmake. Si tiene dificultades para compilar, intente configurar el compilador clang durante la configuración. Rellene gratis para enviar solicitudes de extracción. La rama de desarrollo actual es 'ts'.
¿Realmente necesito clang? Creo que clang es principalmente para usuarios de mac. Uso códigos VS y ::codeblock para cpp en linux... no creo que tenga un compilador clang aquí :(
estoy en ubuntu 20.04. ¿Quizás debería obtener clang-9?
Actualmente se puede construir con GCC en Ubuntu 20.04