линейная алгебра — разложение Armadillo C ++ LU

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

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

AX = Ь

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

То, что я сделал, было только факторизацией LU матрицы A:

arma::mat A;
// ... fill the A matrix ...
arma::mat P,L,U;
arma::lu(L, U, P, A);

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

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

1

Решение

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

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

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

Общий совет — избегать явного разложения LU в библиотеках более высокого уровня, таких как броненосец.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]