Какие хорошие библиотеки существуют для решения системы нелинейных уравнений на C++?

в приложении C++, которое я кодирую, мне нужно решить систему non - линейные уравнения (N уравнений, N неизвестных).

системы, которые я решаю, будут довольно маленькими (до 10 уравнений/неизвестных), поэтому производительность не будет реальной проблемой. Я немного искал в интернете нелинейную библиотеку решателей, и я не мог добраться до чего-то, что выглядит простым в использовании (got to NOX и C / C++ Minpack, но оба кажутся излишним для моего потребность.)

любые мысли и идеи простых в использовании библиотек для этой цели?

8 ответов


есть два варианта для вас, вы можете использовать пакеты солнечных часов, которые включают нелинейный решатель, написанный на C, я думаю. Единственная проблема, которую я нашел, заключается в том, что вам нужно дать ему хорошие начальные оценки. Второй вариант-использовать NLEQ или NLEQ2, которые, я думаю, превосходят (writtein в FORTRAN, но легко связать с C, как langages. Однако у меня были некоторые проблемы с его обнаружением. Есть хороший веб-сайт со списком возможных вариантов: http://plato.asu.edu/sub/zero.html


одна вещь должна быть ясна: нелинейное решение уравнения не легко. Это не то же самое, что решать линейные уравнения. Вы не всегда гарантированно получите решение. И ваш выбор начального условия и стратегии приращения может оказать глубокое влияние на решение, которое вы получите.

с учетом сказанного, я не могу рекомендовать конкретную библиотеку, но вы должны быть в поиске пакета линейной алгебры, который включает итерацию Ньютона-Рафсона в своем меню выбор.


численные рецепты имеет процедуру, которая будет делать работу за вас.


Это зависит от того, как нелинейные уравнения. Если они обладают некоторыми "хорошими" свойствами...наиболее очевидным является положительная полуопределенная матрица или выпуклость, могут быть специализированные алгоритмы. Я использую IBM / ILOG CPLEX для большинства моих потребностей линейного программирования. Предоставляются библиотеки, которые можно использовать в приложениях C++. Хотя я не использовал их квадратичный модуль программирования, это действительно современное состояние в высокой мощности линейной и (хорошо себя ведет) нелинейной программирование.


всегда есть GSL, но все комментарии, сделанные в других ответах, относятся и к этому:

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


вы смотрели МОНЕТА-ИЛИ? Это может помочь, если вы отправите свой вопрос или обмена.


Это не бесплатно, но решатель будет работать здесь.


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

также рассмотрим omnn:: math: https://github.com/ohhmm/openmind/blob/master/omnn/math/test/08_System.cpp

скажем, система уравнений выглядит так:

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

затем у вас есть пара вариантов:

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;

альтернативный способ-сделать одно уравнение (см. почему):

((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;