2010-11-20 5 views
8

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

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

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

ответ

2

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

+0

Спасибо.Я использовал пакет sundials (KINSOL), и он работает как шарм из C++-программы в Windows 64. – hoffer

+0

hi @hoffer, меня также очень интересует решение нелинейных систем методом Ньютона. Что касается использования NLEQ и NLEQ2, есть ли у вас какой-либо простой рабочий пример для демонстрации реализации алгоритма? Спасибо – LCFactorization

+0

hi @rhody, как я могу связать NLEQ/NLEQ2 в Fortran с C++? У меня есть Visual C++ 9.0 Express в ОС Win32. Нужен ли мне какой-либо корректор Fortran77? спасибо – LCFactorization

0

Вы посмотрели COIN-OR? Это может помочь, если вы отправляете свой вопрос на OR-Exchange.

3

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

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

+0

Соответствующий раздел численных рецептов особенно ясно на вашу первую точку –

+0

Например, GSL – sitilge

+0

Для тех, кто не владеют аббревиатурами, GSL == GNU Scientific Library https://www.gnu.org. /software/gsl/manual/html_node/Multidimensional-Root_002dFinding.html – duffymo

1

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

+0

+1 - да, точно. – duffymo

+0

Отличным источником кода является netlib. В основном это FORTRAN, но f2c скоро это увидит. Кстати, я бы сказал, что f2c один из лучших программ всех времен! Я бы рекомендовал Numericical Recipes как отличный способ получить хорошую ориентацию во многих областях численного анализа wit hout нужно быть экспертом. –

1

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

0

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

1

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

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

+0

GSL Ch 38. [Линейная установка наименьших квадратов] (http://www.gnu.org/software/gsl/manual/html_node/Nonlinear-Least_002dSquares-Fitting.html#Nonlinear-Least_002dSquares-Fitting) –