Текст подпрограммы и версий af10r_p.zip , af10e_p.zip |
Тексты тестовых примеров taf10r_p.zip , taf10e_p.zip |
QR - разложение вещественной прямоугольной матрицы размера M*K (M ≥ K) методом отражений, при этом ортогональная матрица Q запоминается в явном виде.
Выполняется факторизация матрицы А вида А = QR, где Q - oртогональная, R - верхняя треугольная матрица. Матрица R получается в результате умножения матрицы А на последовательность преобразований отражения Q1, Q2, ..., QК таких, что QКQК - 1 ... Q1А = R , при этом
Q = Q1T Q2T ... QKT .
Подпрограмма вычисляет матрицу Q в явном виде.
В.В.Воеводин. Ошибки округления и устойчивость в прямых методах линейной алгебры, Изд. МГУ, М., 1969.
procedure AF10R(M :Integer; K :Integer; var A :Array of Real; var U :Array of Real; var T :Array of Real);
Параметры
M, K - | размеры матрицы А, т.е. число строк и столбцов матрицы, соответственно (тип: целый); |
A - | двумерный массив, в котором задается исходная матрица; в результате работы подпрограммы в первых (К - 1) столбцах массива А запоминаются первые (К - 1) ортонормированных столбцов матрицы Q, на месте К - го столбца А запоминается К - ый столбец матрицы Q, умноженный на последний диагональный элемент треугольной матрицы R; |
U - | двумерный вещественный рабочий массив размера М*М; в результате работы подпрограммы в массиве U запоминается ортогональная матрица QT; |
T - | одномерный вещественный массив длины К * (К + 1) / 2; в результате работы подпрограммы в массиве Т запоминается верхняя треугольная матрица R. |
Версии
AF10E - | QR - разложение вещественной прямоугольной матрицы размера М*К, заданной с расширенной (Extended) точностью, методом отражений. При этом параметры А, U и Т должны иметь тип Extended. |
Вызываемые подпрограммы: нет
Замечания по использованию
Подпрограмма предназначена для факторизации таких матриц А, для которых К ≤ М и ранг которых равен К. | |
Подпрограмма может применяться для ортогонализации системы линейно - независимых векторов, расписанных в виде матрицы по столбцам; ортогональная система векторов запоминается в массиве А, при этом первые (К - 1) векторов будут нормированы. Значения параметров М и К сохраняются. | |
В этой подпрограмме вычисляемая в процессе разложения верхняя треугольная матрица R хранится в компактной форме в массиве Т по строкам (а не по столбцам в соответствии с общим правилом). |
Unit TAF10R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AF10R_p; function TAF10R: String; implementation function TAF10R: String; var M,K,_i :Integer; U :Array [0..8] of Real; T :Array [0..5] of Real; const A :Array [0..8] of Real = ( 1.0,1.0,1.0,2.0,3.0,0.0,3.0,2.0,2.0 ); begin Result := ''; { результат функции } M := 3; K := 3; AF10R(M,K,A,U,T); Result := Result + #$0D#$0A; for _i:=0 to 8 do begin Result := Result + Format('%20.16f ',[A[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 8 do begin Result := Result + Format('%20.16f ',[U[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 5 do begin Result := Result + Format('%20.16f ',[T[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TAF10R',Result); { вывод результатов в файл TAF10R.res } exit; end; end. Результаты: Матрица A -0.5773502692 -0.1543033500 0.6428571429 -0.5773502692 -0.6172133998 -0.4285714286 -0.5773502692 0.7715167498 -0.2142857143 Матрица U -0.5773502692 -0.5773502692 -0.5773502692 -0.1543033500 -0.6172133998 0.7715167498 0.8017837257 -0.5345224838 -0.2672612419 Матрица T -1.732050808 -2.886751346 -4.041451884 -2.160246899 -0.1543033500 0.8017837257