2013-07-30 1 views
1

Я использую библиотеку Armadillo C++ для решения линейных систем средних/больших размеров (1000-5000 уравнений).Разложение Armadillo C++ LU

Так как я должен решать различные линейные системы

AX = B

, в которой А всегда одни и те же и B изменения, я хотел бы LU факторизовать A только один раз и повторно использовать LU разложение с различными б. К сожалению, я не знаю, как выполнять такие операции в Армадилло.

Что я сделал только LU факторизация матрицы:

Но теперь я хотел бы использовать матрицы P, L и U решить несколько линейных систем с различными б векторов.

Не могли бы вы помочь мне, пожалуйста?

+0

Возможно, вы могли бы рассказать нам, что уже пробовали? Возможно, вы можете отредактировать свой вопрос, включив в него [SSCCE] (http://sscce.org/) вашу попытку? –

+0

Спасибо Joachim, я добавил то, что я пробовал ... –

ответ

2

Поскольку A = P.t()*L*U (где равенство лишь приблизительным из-за ошибок округления), решения для x в P.t()*L*U*x = b требует, чтобы переставить строки B и выполнения вперед и назад замену:

x = solve(trimatu(U), solve(trimatl(L), P*b)); 

Из-за отсутствия истинной треугольный решатель в armadillo и быстрый способ выполнения перестановки строк, эта процедура не будет очень эффективной в отношении прямого вызова соответствующих вычислительных подпрограмм LAPACK.

Генеральный совет заключается в том, чтобы избежать явного разложения LU в библиотеках более высокого уровня, таких как armadillo.

  1. , если все различные b «ы известны в то же время, хранить их в виде столбцов в виде прямоугольной матрицы B и X = solve(A,B);
  2. если различные b» ы известны по одному за раз, а затем предварительного вычисления AINV = A.i(); и x = AINV*b; будет более эффективным, если количество различных rhs векторы достаточно велики. См. Это answer к аналогичному question.

 Смежные вопросы

  • Нет связанных вопросов^_^