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

StackOverflow https://stackoverflow.com/questions/4233964

Вопрос

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

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

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

Это было полезно?

Решение

Для вас есть два варианта, вы можете использовать пакеты Sundials, которые включают нелинейный решатель, написанный в CI DUSH. Единственная проблема, которую я нашел с этим, это то, что вам нужно дать ей хорошие первоначальные оценки. Второй вариант состоит в том, чтобы использовать Nleq или Nleq2, который, я думаю, является превосходным (Writtein в Fortran, но легко ссылаться на C в нём лагуна. Однако у меня были некоторые проблемы, располагающие его только сейчас. Есть хороший веб-сайт со списком возможных вариантов в: http://plato.asu.edu/sub/zero.html.

Другие советы

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

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

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

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

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

http://www.gnu.org/software/gsl/manual/html_node/multiDimension-root_002dfinding.html#index-nonlinear-sistems-of-equations_002c-solution-of-2426.

Вы смотрели на Монета или? Это может помочь, если вы отправите свой вопрос к или обмену.

Это не бесплатно бесплатно, но Решающий будет работать здесь.

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

Также рассмотрим Omnn :: Math:https://github.com/ohhmmm/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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top