Qué buenas bibliotecas están ahí para resolver un sistema de ecuaciones no lineales en C ++?
-
26-09-2019 - |
Pregunta
En una aplicación de C ++ que estoy de codificación, necesito resolver un sistema de no ecuaciones -linear (N ecuaciones, N incógnitas).
Los sistemas Estoy Resolver será bastante pequeña (hasta 10 ecuaciones / incógnitas), por lo que el rendimiento no va a ser un problema real. He buscado en la web un poco para una biblioteca solucionador no lineal, y no podía llegar a algo que parece fácil de usar (tiene que NOX y C / C ++ minpack , pero ambos parecen ser una exageración para mi necesidad).
Cualquier pensamiento y las ideas de las bibliotecas y fácil de usar para este propósito?
Solución
Hay dos opciones para usted, puede utilizar los paquetes de relojes de sol, que incluye un solucionador no lineal, escrito en C que pienso. El único problema que he encontrado con él es que se necesita para darle buenas estimaciones iniciales. La segunda opción es utilizar NLEQ o NLEQ2 que creo que son superiores (writtein en FORTRAN, pero fácil de enlace a C como Langages. Sin embargo, he tenido algunos problemas situándolo en este momento. No es un buen sitio web con una lista de posibles opciones en: http://plato.asu.edu/sub/zero.html
Otros consejos
Una cosa debe quedar claro: solución ecuación no lineal no es fácil. No es lo mismo que resolver ecuaciones lineales. Puede que no siempre está garantizado para conseguir una solución. Y su elección de la estrategia inicial de incremento estado y puede tener un profundo efecto en la solución que te dan.
Dicho esto, no puedo recomendar una biblioteca particular, sino que debe estar en la búsqueda de un paquete de álgebra lineal que incluye iteración de Newton-Raphson en su menú de opciones.
Numerical Recipes tiene una rutina que va a hacer el trabajo para usted.
Depende de lo no lineal de las ecuaciones son. Si poseen algunas propiedades "buenos" ... la mayor parte de la matriz o convexidad positiva semi-definida ser obvio, no pueden ser especializados algoritmos disponibles. Yo uso IBM / ILOG CPLEX para la mayoría de mis necesidades de programación lineal. Las bibliotecas están siempre que se pueda tirar en las aplicaciones C ++. Aunque no he utilizado su módulo de programación cuadrática, es realmente el estado de la técnica en alta lineal caballos de fuerza y ??el (buen comportamiento) de programación no lineal.
Siempre hay GSL, pero todos los comentarios hechos en las otras respuestas se aplican a este, así:
¿Has mirado en COIN-O ? Podría ayudar si envía tu pregunta a la O-Exchange.
No es gratis, por cualquier medio, pero Solver trabajaría aquí.
https: // github .com / Z3Prover / z3 / blob / master / examples / c% 2B% 2B / example.cpp
también consideran omnn :: matemáticas: https://github.com/ohhmm/openmind/ blob / maestro / omnn / matemáticas / test / 08_System.cpp
Permite sistema de ecuaciones es decir como esto:
(x-a1)^2 + (y-b1)^2 = c1
(x-a2)^2 + (y-b2)^2 = c2
A continuación, usted tiene opciones par:
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 sola ecuación (ver qué ) :
((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;