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

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

(х - а 1 ) 2 + (у - б 1 ) 2 = с 1

(х - а 2 ) 2 + (у - б 2 ) 2 = с 2

Я знаю, что это просто с помощью Matlab:

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

Но как решить эту проблему с помощью C/C++? Я знаю математическую библиотеку под названием lapack, но для линейного уравнения. Какие-либо предложения?

Я написал одну реализацию метода Ньютона-Рафсона, подробности см. здесь: dilawarnotes.wordpress.com/2016/04/14/… . Это не очень хорошо проверено.

Ответы (3)

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

Я предполагаю, что вы имеете в виду бесплатное программное обеспечение. Ссылаясь на приведенный выше вопрос stackoverflow, вы можете использовать:

  1. Солнечные часы: https://computation.llnl.gov/casc/sundials/main.html
  2. GNU: http://www.gnu.org/software/gsl/manual/html_node/Multidirectional-Root_002dFinding.html#index-nonlinear-systems-of-equations_002c-solution-of-2426 .

Остальные из них, перечисленные в упомянутом вопросе stackoverflow, основаны на Fortran. Вы можете использовать их, только если используете f2c (программа Fortran to C)

Я хотел бы предложить несколько ответов, которые я нашел в Интернете после небольшого поиска. Но всегда факт, что библиотека зависит от ваших индивидуальных потребностей :)

  • Eigen Eigen — это библиотека шаблонов C++ для линейной алгебры: матрицы, векторы, численные решатели и связанные алгоритмы. Он поддерживает все размеры матриц, от небольших матриц фиксированного размера до произвольно больших плотных матриц и даже разреженных матриц. И поддерживает все стандартные числовые типы, включая std::complex, целые числа, и легко расширяется до пользовательских числовых типов. Различные декомпозиции матриц и функции геометрии. Его экосистема неподдерживаемых модулей предоставляет множество специализированных функций, таких как нелинейная оптимизация, матричные функции, полиномиальный решатель, БПФ и многое другое.
  • Trilinos предоставляет множество классов и функций для параллельного управления векторами и матрицами, решения линейных и нелинейных систем, решения обыкновенных дифференциальных уравнений и вычисления собственных значений и т . д .
  • ALIAS-C++ Библиотека алгоритмов C++ интервального анализа для систем уравнений для решения систем с линейными и нелинейными условиями

  • MINPACK Это библиотека подпрограмм FORTRAN для решения систем нелинейных уравнений или минимизации по методу наименьших квадратов невязки набора линейных или нелинейных уравнений.

Источник: Список числовых библиотек.

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

    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;

Вот пример проекта CMake: https://github.com/ohhmm/NonLinearSystem .

у тебя линуксовая версия? Просто хочу быстро проверить ваши коды. Здесь нет окон :(
Да, он кроссплатформенный с cmake. Если у вас возникли трудности с компиляцией, попробуйте установить компилятор clang при настройке. Заполните бесплатно, чтобы отправить запрос на вытягивание. Текущая ветка разработки — «ts».
Мне действительно нужен лязг? Я думаю, что clang в основном для пользователей Mac. Я использую коды VS и ::codeblock для cpp в Linux... не думаю, что у меня есть компилятор clang :(
у меня убунту 20.04. Возможно, я должен получить clang-9?
В настоящее время его можно собрать с помощью GCC на Ubuntu 20.04.