Решение линейных систем уравнений - PullRequest
6 голосов
/ 24 июля 2010

У меня есть система из 6 уравнений, которую мне нужно снова и снова решать в программе (конечно, с разными входами). В настоящее время я использую метод правил Крамера для решения системы, и он работает довольно хорошо (кажется, что мой процессор действительно любит операции сложения и умножения, он получает решения за 1 микросекунду, несмотря на то, что явные уравнения имеют длину более 2 страниц). Однако количество раз, которое мне нужно решить, огромно, и я ищу еще более быстрый метод.

Вопрос в том, есть ли еще более быстрый или более эффективный метод для решения этих уравнений или что-то вроде CUDA будет здесь полезным?

Ответы [ 6 ]

3 голосов
/ 24 июля 2010

возможно, вы могли бы попробовать http://arma.sourceforge.net/docs.html.

Он предоставляет готовую функцию разрешения, http://arma.sourceforge.net/docs.html#solve., однако он использует атлас / заднюю руку, которая больше ориентирована на более крупные функции.

Вы также можете попробовать умножение на обратное, http://arma.sourceforge.net/docs.html#inv,, которое является шаблоном времени компиляции и может быть быстрее для ваших целей.

попробуйте это: x = inv (A) * b.Поскольку A не изменяется, инверсия выполняется только один раз.Тогда вы свободны с простым умножением матрицы на вектор, что будет очень быстро

3 голосов
/ 24 июля 2010

Правило Крамера плохо масштабируется.Для небольшой системы уравнений с двумя или тремя неизвестными это хорошо, но если система становится больше, другие методы более эффективны, например: декомпозиция LU + прямая замена + обратная замена.

2 голосов
/ 24 июля 2010

Вы можете проверить UBLAS Boost .

Однако этот метод не так прост; Вы захотите посмотреть на LU разложение .

1 голос
/ 24 июля 2010

Если вы хотите запустить CUDA, вам нужна приличная видеокарта Nvidia

Если у вас есть процессор Intel, я рекомендую вам использовать Intel MKL http://software.intel.com/en-us/intel-mkl/, оптимизированный для процессора Intel,

Если вы используете CUDA, у вас могут возникнуть проблемы с плавающей запятой или с двойной точностью

Плюс, если вы не знакомы с программированием на GPU, вы потратите больше времени на решение CUDA

0 голосов
/ 26 июля 2010

Если вы не можете решить свое уравнение в непоследовательном порядке, CUDA не поможет. На самом деле, CUDA может быть медленнее. Все, что не смущает параллельно, не получит пользу от CUDA. Включение SSE2 через переключатель компилятора недостаточно. Вам нужна библиотека, которая закодирована для использования SSE2. На мой вкус, лучшая библиотека линейной алгебры - Eigen . Он очень прост в использовании и поддерживает SIMD (не только SSE2).

0 голосов
/ 24 июля 2010

Вы можете получить хотя бы удвоение, используя SSE2 или выше.Но это бледнеет по сравнению с портом CUDA или OpenCL, который, если все сделано правильно, может дать ускорение на один или два порядка.

Если вы знаете Python, PyCUDA может быть хорошей отправной точкой.

...