Какие хорошие библиотеки существуют для решения системы нелинейных уравнений на 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++. Хотя я не использовал их квадратичный модуль программирования, это действительно современное состояние в высокой мощности линейной и (хорошо себя ведет) нелинейной программирование.
вы смотрели МОНЕТА-ИЛИ? Это может помочь, если вы отправите свой вопрос или обмена.
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;