Текст подпрограммы и версий afg7r_p.zip afg7e_p.zip afg7c_p.zip afg7z_p.zip |
Тексты тестовых примеров tafg7r_p.zip tafg7e_p.zip tafg7c_p.zip tafg7z_p.zip |
Приведение вещественной матрицы к верхней форме Хессенберга методом отражений.
Подпрограмма AFG7R осуществляет приведение вещественной матрицы А порядка N к верхней форме Хессенберга Н = Р А P, где Р - произведение матриц отражения.
Подпрограмма AFG7R требует задания чисел LОW и IGН, удовлетворяющих условию
ai j = 0 , ecли i > j и ecли 1 ≤ j < LOW или IGH < i ≤ N ,
которое означает, что первые (LОW - 1) столбцов и последние (N - IGН) строк матрицы А имеют верхнюю треугольную форму.
Тогда достаточно будет привести к верхней форме Хессенберга только подматрицу матрицы А, расположенную в строках и столбцах с номерами от LОW до IGН.
Приведение к форме Хессенберга осуществляется с помощью следующей последовательности преобразований отражения
Ai = Pi Ai -1 Pi , i = LOW, LOW +1, ..., IGH - 2 , где ALOW - 1 = A , Pi = I - ui uiH / hi , hi = uiH ui / 2 ,
а векторы ui выбираются таким образом, чтобы первые
i столбцов матрицы Аi имели бы форму Хессенберга.
При этом у векторов ui отличными от нуля являются только
компоненты с номерами
i + 1, i + 2, ..., IGН.
Информация о выполненных преобразованиях, а именно векторы ui, порождающие матрицы отражения Рi, запоминается и впоследствии может быть использована для восстановления собственных векторов исходной матрицы.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра. М.: Машиностроение, 1976.
procedure AFG7R(NM :Integer; N :Integer; LOW :Integer; IGH :Integer; var A :Array of Real; var ORT :Array of Real);
Параметры
NM - | число строк двумерного массива А, указанное при описании этого массива в вызывающей подпрограмме (тип: целый); |
N - | порядок исходной матрицы, N ≤ NМ (тип: целый); |
LOW - IGH | заданные граничные индексы строк и столбцов подматрицы исходной матрицы, которую требуется привести к форме Хессенберга (тип: целый); если матрица масштабировалась, то LОW, IGН - выходные параметры подпрограммы AMB1R , в общем случае можно взять LОW = 1, IGН = N; |
A - | вещественный двумерный массив размерности NМ * N, содержащий в своих первых N строках исходную матрицу; в результате работы подпрограммы А содержит вычисленную матрицу Хессенберга, а в остальной части массива А в столбцах с номерами i = LОW, LОW + 1, ..., IGН - 2 запоминаются ненулевые компоненты векторов ui (см. математическое описание), начиная со 2 - ой ненулевой, т.е. с ( i + 2) - ой компоненты; |
ORT - |
вещественный вектор длины IGН, содержащий в
результате работы подпрограммы оставшуюся
часть информации о векторах ui, при этом
компонента ОRТ ( i ) содержит i - ую компоненту
вектора ui - 1,
i = LОW + 1, ..., IGН - 1,
т.е. первую ненулевую компоненту вектора
ui - 1; подпрограмма использует только компоненты вектора ОRТ с номерами LОW + 1, LОW + 2, ..., IGН. |
Версии
AFG7E - | приведение к верхней форме Хессенберга методом отражений вещественной матрицы, заданной с расширенной (Extended) точностью. |
AFG7C - | приведение к верхней форме Хессенберга методом отражений комплексной матрицы (см. замечания по использованию). |
AFG7Z - | приведение к верхней форме Хессенберга методом отражений комплексной матрицы, заданной с расширенной (Extended) точностью (см. замечания по использованию). |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме АFG7E параметры А, ОRТ имеют тип Extended. | |
2. |
В подпрограмме АFG7С исходная комплексная матрица
порядка N задается в двух вещественных массивах АR и
АI размеров NМ * N, содержащих в своих первых N
строках ее вещественные и мнимые части
соответственно. Первый оператор подпрограммы АFG7С имеет вид: procedure AFG7C(NM :Integer; N :Integer; LOW :Integer; IGH :Integer; var AR :Array of Real; var AI :Array of Real; var ORTR :Array of Real; var ORTI :Array of Real); | |
3. | Подпрограмма АFG7Z имеет такие же параметры, как и подпрограмма АFG7С, только при этом АR, АI, ОRТR и ОRТI имеют тип Extended. |
Unit TAFG7R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AFG7R_p; function TAFG7R: String; implementation function TAFG7R: String; var N,J,I,_i :Integer; ORT :Array [0..3] of Real; const A :Array [0..15] of Real = ( 2.0,0.0,3.0,4.0,1.0,1.0,-0.6,-0.8,1.0,-0.6,1.64, -0.48,1.0,-0.8,-0.48,1.36 ); begin Result := ''; { результат функции } N := 4; ORT[0] := 0.0; AFG7R(4,4,1,4,A,ORT); Result := Result + #$0D#$0A; for I:=1 to N do begin for J:=1 to N do begin Result := Result + Format(' A= + #$0D#$0A %20.16f ', [A[(I-1)+(J-1)*4]]) + #$0D#$0A; eND; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' ORT=' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%20.16f ',[ORT[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TAFG7R',Result); { вывод результатов в файл TAFG7R.res } exit; end; end. Результаты: | 2 - 1.4 1 - 0.22 | - 5 1. 1 - 9.1E - 13 A = | 3 1. 1 + 9.1E - 13 | 4 - 0.8 0 2. (ORT( I ), I = 1, 3) = 0., 5., - 1.6 Это означает, что | 2 - 1.4 1 - 0.2 | - 5 1 1 - 9.1E - 13 H = | 0 1 1 9.1E - 13 | 0 0 0 2. Pi = I - ui uiT / hi , hi = uiT ui / 2 , i = 1, 2 , где u1T = ( 0., 5., 3., 4 ) , u2T = ( 0., 0., - 1.6, - 0.8 ) .