Наиболее эффективный способ решения системы линейных уравнений

У меня есть (n x n) симметричная матрица A и a (n x 1) вектор B. В принципе, мне просто нужно решить Ax = b для x. Проблема в том, что A будет потенциально массовым. Поэтому я ищу наиболее эффективный алгоритм решения линейных уравнений в С++. Я просмотрел библиотеку Эйгена. По-видимому, у него есть метод SVD, но мне сказали, что он медленный. Решение x = обратное (A) * b также похоже на субоптимальное. UBLAS быстрее? Есть ли более эффективные методы? Благодарю.

Изменить: матрица A положительно определена и не разрежена.

Ответы

Ответ 1

Лучший способ решить систему линейных уравнений формы Ax = b состоит в том, чтобы сделать следующее.

  • разложите A в формат A = M1 * M2 (где M1 и M2 треугольные)
  • Решите M1 * y = b для y с помощью обратной подстановки
  • Решите M2 * x = y для x с помощью обратной подстановки

Для квадратных матриц, шаг 1 будет использовать LU Decomposition.

Для неквадратных матриц, шаг 1 будет использовать QR Decomposition.

Если матрица A положительно определена и не разрежена, вы должны использовать разложить его, а затем треугольный решить его.

Если это все еще медленно, к счастью, существует множество библиотек линейной алгебры, которые позволяют вам это делать. Процедура, которую вы должны искать, - dpotrs. Некоторые библиотеки, которые реализованы, следующие:

Если вы используете eigen в общем проекте, вы можете связать необходимую процедуру LAPACK, как описано здесь.