Какие хорошие библиотеки существуют для решения системы нелинейных уравнений в C ++? - PullRequest
9 голосов
/ 20 ноября 2010

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

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

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

Ответы [ 8 ]

3 голосов
/ 20 ноября 2010

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

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

2 голосов
/ 21 ноября 2010

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

1 голос
/ 20 ноября 2010

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

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

1 голос
/ 20 ноября 2010

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

1 голос
/ 20 ноября 2010

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

0 голосов
/ 01 сентября 2018

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;
0 голосов
/ 20 ноября 2010

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

0 голосов
/ 20 ноября 2010

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

...