Pergunta

Em um aplicativo C ++ que estou codificando, preciso resolver um sistema de não-Equações lineares (n equações, n incógnitas).

Os sistemas que estou resolvendo serão bastante pequenos (até 10 equações/incógnitas), portanto o desempenho não será um problema real. Eu procurei na web um pouco por uma biblioteca de solucionador não linear e não consegui chegar a algo que parece fácil de usar (consegui NOX e C/C ++ Minpack, mas ambos parecem ser um exagero para minha necessidade).

Algum pensamento e idéias de bibliotecas fáceis de usar para esse fim?

Foi útil?

Solução

Existem duas opções para você, você pode usar os pacotes de sol que incluem um solucionador não linear, escrito no CI Think. O único problema que encontrei é que você precisa dar boas estimativas iniciais. A segunda opção é usar NLEQ ou NLEQ2 que eu acho que são superiores (Writtein em Fortran, mas fácil de vincular a C, como Langages. No entanto, tive alguns problemas para localizá -lo agora. Existe um bom site com uma lista de possíveis opções no: http://plato.asu.edu/sub/zero.html

Outras dicas

Uma coisa deve ficar clara: a solução de equação não linear não é fácil. Não é o mesmo que resolver equações lineares. Você nem sempre é garantido para obter uma solução. E sua escolha de condição inicial e estratégia de incremento pode ter um efeito profundo na solução que você obtém.

Com isso dito, não posso recomendar uma biblioteca específica, mas você deve estar à procura de um pacote de álgebra linear que inclua a iteração de Newton-Raphson em seu menu de opções.

Receitas numéricas tem uma rotina que fará o trabalho por você.

Depende de quão não linear as equações são. Se eles possuem algumas propriedades "agradáveis" ... mais óbvias sendo a matriz ou convexidade positiva-semi-definida, pode haver algoritmos especializados disponíveis. Eu uso o IBM/ILOG CPLEX para a maioria das minhas necessidades de programação linear. São fornecidas bibliotecas que podem ser puxadas para aplicativos C ++. Embora eu não tenha usado o módulo de programação quadrático, é realmente o estado da arte em programação linear de alta potência e (bem-comportada) não linear.

Sempre há GSL, mas todos os comentários feitos nas outras respostas também se aplicam a isso:

http://www.gnu.org/software/gsl/manual/html_node/multidimensional-root_002dfinding.html#index-nonlinear-systems-of-equations_002c-solution-of-1426

Você já olhou Moeda-ou? Pode ajudar se você enviar sua pergunta ao OR-Exchange.

Não é gratuito de forma alguma, mas Solucionador funcionaria aqui.

Microsoft Z3 https://github.com/z3prover/z3/blob/master/examples/c%2b%2b/example.cpp

Considere também Omnn :: Math:https://github.com/ohhmm/openmind/blob/master/omnn/math/test/08_system.cpp

Digamos que o sistema de equações é assim:

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

Então você tem duas opções:

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;

maneira alternativa é fazer uma única equação (ver Por 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top