Quelles sont les bonnes bibliothèques sont là pour résoudre un système d'équations non-linéaires en C ++?

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

Question

Dans une application C ++ je codage, je dois résoudre un système de non équations -Linear (équations N, N inconnues).

Les systèmes que je suis la résolution sera assez faible (jusqu'à 10 équations / inconnues), de sorte que la performance ne va pas être un vrai problème. Je l'ai cherché sur le web un peu pour une bibliothèque de solveur non-linéaire, et je ne pouvais pas arriver à quelque chose qui semble facile à utiliser (a à NOX et C / C ++ MINPACK , mais les deux semblent être un surpuissant pour mes besoins).

Toutes les pensées et les idées des bibliothèques faciles à utiliser à cette fin?

Était-ce utile?

La solution

Il y a deux options pour vous, vous pouvez utiliser les packages de cadrans solaires qui comprend un solveur non linéaire, écrit en C, je pense. Le seul problème que je l'ai trouvé avec ce que vous devez donner de bonnes estimations initiales. La deuxième option consiste à utiliser NLEQ ou NLEQ2 que je pense sont supérieurs (writtein en FORTRAN, mais facile à lien vers C comme langages. Cependant j'ai eu quelques difficultés à localiser tout à l'heure. Il y a un bon site web avec une liste d'options possibles à: http://plato.asu.edu/sub/zero.html

Autres conseils

Une chose doit être claire: solution d'équation non linéaire n'est pas facile. Ce n'est pas la même chose que la résolution des équations linéaires. Vous n'êtes pas toujours assuré d'obtenir une solution. Et votre choix de la stratégie de condition initiale et peut avoir un incrémentation effet profond sur la solution que vous obtenez.

Cela dit, je ne peux pas recommander une bibliothèque particulière, mais vous devriez être à la recherche d'un ensemble d'algèbre linéaire qui comprend l'itération de Newton-Raphson dans son menu de choix.

Numerical Recipes a une routine qui va faire le travail pour vous.

Cela dépend de la façon dont les équations sont non linéaires. Si elles possèdent des « belles » propriétés ... la plus évidente étant matrice positive semi-définie ou convexité, on peut algorithmes spécialisés disponibles. J'utilise IBM / ILOG CPLEX pour la plupart de mes besoins de programmation linéaire. Les bibliothèques sont fournies qui peut être tiré dans des applications C ++. Bien que je ne l'ai pas utilisé leur module de programmation quadratique, il est vraiment l'état de l'art en linéaire de haute puissance de cheval et (bien comportés) programmation non linéaire.

Il y a toujours GSL, mais tous les commentaires dans les autres réponses s'appliquent à ce ainsi:

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

Avez-vous regardé COIN-OR ? Il peut être utile si vous soumettez votre question au OU-échange.

Il est pas libre par tout moyen, mais Solver travaillerait ici.

https: // github .com / Z3Prover / z3 / blob / maître / exemples / c% 2B% 2B / example.cpp

considèrent également omnn :: mathématiques: https://github.com/ohhmm/openmind/ blob / maître / omnn / math / test / 08_System.cpp

Permet de système d'équations est par exemple comme ceci:

(x-a1)^2 + (y-b1)^2 = c1
(x-a2)^2 + (y-b2)^2 = c2

Ensuite, vous avez des options couple:

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;

alternative est de faire simple équation (voir pourquoi ) :

((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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top