Domanda

In un'applicazione C ++ sto codifica, ho bisogno di risolvere un sistema di equazioni -Lineare non (N equazioni, n incognite).

I sistemi che sto risolvendo sarà piuttosto piccole (fino a 10 equazioni / incognite), quindi le prestazioni non sta per essere un vero problema. Ho cercato sul web un po 'per una libreria solutore non lineare, e non ho potuto ottenere a qualcosa che sembra facile da usare (avuto modo di NOX e C / C ++ minpack , ma entrambi sembrano essere un eccessivo per il mio bisogno).

Tutti i pensieri e le idee di librerie facili da usare per questo scopo?

È stato utile?

Soluzione

Ci sono due opzioni per voi, è possibile utilizzare i pacchetti di meridiane che comprende un risolutore non lineare, scritto in C penso. L'unico problema che ho trovato con esso è che avete bisogno di dare buone stime iniziali. La seconda opzione è quella di utilizzare NLEQ o NLEQ2 che credo siano superiori (writtein in FORTRAN, ma facile da link per C come langages. Tuttavia ho avuto alcuni problemi localizzare solo ora. C'è un buon sito web con un elenco di possibili opzioni a: http://plato.asu.edu/sub/zero.html

Altri suggerimenti

Una cosa deve essere chiara: la soluzione dell'equazione non lineare non è facile. Non è la stessa risoluzione di equazioni lineari. Non siete sempre garantiti per ottenere una soluzione. E la scelta di strategia iniziale, condizioni e Incremento può avere un profondo effetto sulla soluzione si ottiene.

Detto questo, non posso raccomandare una particolare libreria, ma si dovrebbe essere alla ricerca di un pacchetto di algebra lineare che include Newton-Raphson iterazione nel suo menu di scelte.

Numerical Recipes ha una routine che farà il lavoro per voi.

Dipende da come non lineare delle equazioni sono. Se possiedono alcune "belle" proprietà ... più ovvia è di matrice positiva semi-definita o convessità, ci possono essere specializzati algoritmi disponibili. Io uso IBM / ILOG CPLEX per la maggior parte dei miei bisogni di programmazione lineare. Le biblioteche sono a condizione che può essere tirato in applicazioni C ++. Anche se non ho usato il loro modulo di programmazione quadratica, è davvero lo stato-of-the-art in alta lineare cavalli potenza e (ben educati) programmazione non lineare.

C'è sempre GSL, ma tutte le osservazioni formulate nelle altre risposte si applicano a questo così:

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

Hai guardato COIN-OR ? Potrebbe essere utile se si invia la tua domanda al OR-Exchange.

Non è gratuito con qualsiasi mezzo, ma Risolutore avrebbe funzionato qui.

https: // GitHub com / Z3Prover / z3 / blob / master / examples / c% 2B% 2B / example.cpp

considerare anche omnn :: matematica: https://github.com/ohhmm/openmind/ blob / master / omnn / math / test / 08_System.cpp

Consente di sistema di equazioni dire è come questo:

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

Poi ci sono le opzioni di coppia:

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;

modo alternativo è quello di rendere singola equazione (vedi perché ) :

((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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top