Я пытаюсь реализовать некоторые базовые операции линейной алгебры, и одна из этих операций - инверсия треугольной (верхней и / или нижней) матрицы. Есть ли для этого простой и стабильный алгоритм?
Спасибо.





Да, используйте обратная замена. Стандартный алгоритм инвертирования матрицы состоит в том, чтобы найти ее LU-разложение (разложение на нижнетреугольную и верхнетреугольную матрицу), использовать обратную подстановку на треугольных частях, а затем объединить результаты, чтобы получить инверсию исходной матрицы.
Я пытаюсь получить обратную матрицу треугольный, а не квадратную матрицу. Как обратная подстановка должна помочь мне в получении обратных треугольников?
По определению треугольные матрицы квадратные.
Причем только квадратные матрицы имеют обратные.
Вау, это почти половина содержания курса численного анализа. Стандартные алгоритмы сделают это, и есть куча стандартного кода здесь. Конечным источником для этой и большинства других обычных задач численного анализа является Числовые рецепты.
Обращение треугольной матрицы - это не половина содержания курса численного анализа. Обращение треугольной матрицы тривиально, а наивный алгоритм стабилен.
Надо сделать поворот ряда. Наивность не будет стабильной.
Поворот (например, с помощью исключения Гаусса) переводит линейную систему в треугольную форму, которая затем решается с помощью обратной подстановки. Что касается стабильности, см., Например, книгу Николаса Хайэма «Точность и стабильность численных алгоритмов», стр. 140 второго издания.
Учитывая нижнюю треугольную матрицу L, обратная подстановка позволяет решить систему L x = b быстро для любой правой части b.
Чтобы инвертировать L, вы можете решить эту систему для правых частей e1 = (1,0, ..., 0), e2 = (0,1, ..., 0), ..., en = (0 , 0, ..., 1) и объединить полученные векторы решений в единую (обязательно нижнюю треугольную) матрицу.
Если вас интересует решение в замкнутой форме, диагональные элементы обратного преобразования являются обратными по отношению к исходным диагональным элементам, а формула для остальных элементов обратного преобразования становится все более и более сложной по мере удаления от диагонали. .
Не переворачивайте его, если можете. Это одна из основных заповедей числовой линейной алгебры.
Гораздо быстрее и стабильнее в числовом отношении хранить саму матрицу L в памяти и вычислять
inv(L)b with back-substitution whenever you need to do something else with inv(L).
Отметим, что обычный алгоритм его инвертирования требует решения систем
inv(L)[1 0 0 ...],
inv(L)[0 1 0 ....],
inv(L)[0 0 1 ....] and so on, so you see it is much easier not to invert it at all.
Будучи B инверсией A, треугольной матрицы, вы можете использовать следующий код MATLAB:
n = size(A,1);
B = zeros(n);
for i=1:n
B(i,i) = 1/A(i,i);
for j=1:i-1
s = 0;
for k=j:i-1
s = s + A(i,k)*B(k,j);
end
B(i,j) = -s*B(i,i);
end
end
Взгляните на этот пост: math.stackexchange.com/questions/1143214/… Bests