Я использую библиотеку 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 векторами.
Не могли бы вы мне помочь, пожалуйста?
поскольку A = P.t()*L*U
(где равенство только приблизительное из-за ошибок округления), решение для x
в P.t()*L*U*x = b
требует переставлять ряды B
и выполнение прямой и обратной замены:
x = solve(trimatu(U), solve(trimatl(L), P*b) );
Из-за отсутствия истинного треугольного решателя в броненосце и быстрого способа перестановки строк эта процедура не будет очень эффективной в отношении прямого вызова соответствующих вычислительных подпрограмм LAPACK.
Общий совет — избегать явного разложения LU в библиотеках более высокого уровня, таких как броненосец.
b
известны одновременно, хранят их как столбцы в прямоугольной матрице B
а также X = solve(A,B);
b
известны по одному, затем предварительные вычисления AINV = A.i();
а также x = AINV*b;
будет эффективнее, если количество разных ч.ч. векторы достаточно велики. Видеть это ответ к подобному вопрос.Других решений пока нет …