Qué buenas bibliotecas están ahí para resolver un sistema de ecuaciones no lineales en C ++?

StackOverflow https://stackoverflow.com/questions/4233964

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?

¿Fue útil?

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

http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Root_002dFinding.html#index-nonlinear-systems-of-equations_002c-solution-of-2426

¿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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top