|
Текст подпрограммы и версий afg6r_p.zip , afg6e_p.zip , afg6c_p.zip , afg6z_p.zip |
Тексты тестовых примеров tafg6r_p.zip , tafg6e_p.zip , tafg6c_p.zip , tafg6z_p.zip |
Приведение вещественной матрицы к верхней форме Хессенберга элементарными неортогональными преобразованиями подобия.
Подпрограмма АFG6R осуществляет приведение вещественной матрицы А порядка N к верхней форме Хессенберга Н.
Подпрограмма АFG6R требует задания чисел LОW и IGН, удовлетворяющих условию
ai j = 0 , ecли i > j и ecли 1 ≤ j < LOW или IGH < i ≤ N ,
которое означает, что первые (LОW - 1) столбцов и последние (N - IGН) строк матрицы А имеют верхнюю треугольную форму.
Тогда достаточно будет привести к верхней форме Хессенберга только подматрицу матрицы А, расположенную в строках и столбцах с номерами от LОW до IGН.
Приведение к форме Хессенберга осуществляется с помощью последовательности элементарных устойчивых преобразований подобия
Aj = Nj-1 Ij j ' Aj -1 Ij j ' Nj , j = LOW+1, LOW+2, ... , IGH-1 ,
где
АLОW = А ,
Ij j ' - элементарная матрица перестановок ,
Nj - элементарная матрица с элементами
{ Nj }i j = ni j , i = j +1, j +2, ... , IGH ,
{ Nj }i k = δi k в остальных позициях .
Информация о выполненных преобразованиях запоминается и может быть использована потом для восстановления собственных векторов исходной матрицы.
Уилкинсон, Райнш. "Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра." М.: Машиностроение, 1976.
procedure AFG6R(NM :Integer; N :Integer; LOW :Integer; IGH :Integer;
var A :Array of Real; var INT :Array of Integer);
Параметры
| NM - | число строк двумерного массива А, указанное при описании этого массива в вызывающей подпрограмме (тип: целый); |
| N - | порядок исходной матрицы, N ≤ NМ (тип: целый); |
|
LOW - IGH |
заданные граничные индексы строк и столбцов
подматрицы исходной матрицы, которую
требуется привести к форме Хессенберга (тип: целый); если матрица масштабировалась, то LОW, IGН - выходные параметры подпрограммы AMB1R , в общем случае можно взять LОW = 1, IGН = N; |
| A - | вещественный двумерный массив размерности NM * N, содержащий в своих первых N строках исходную матрицу; в результате работы подпрограммы массив А содержит вычисленную матирцу Хессенберга, а в остальной части массива А в столбцах с номерами j = LОW, LОW + 1, ..., IGН - 2 запоминается информация об использованных элементарных преобразованиях, причем элементы ni j, i = j + 1, j + 2, ..., IGН, определяющие матрицу Nj, запоминаются в ( j - 1) - ом столбце; |
| INT - | целочисленный вектор длины IGН, в котором запоминается информация о выполненных перестановках строк и столбцов, причем элемент вектора INТ ( j ), j = LОW + 1, LОW + 2, ..., IGН - 1 содержит номер строки, переставленной с j - ой строкой текущей матрицы на j - ом шаге преобразования. |
Версии
| AFG6E - | приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями вещественной матрицы, заданной с расширенной (Extended) точностью. |
| AFG6C - | приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями комплексной матрицы (см. замечания по использованию). |
| AFG6Z - | приведение к верхней форме Хессенберга элементарными неортогональными (неунитарными) преобразованиями комплексной матрицы, заданной с расширенной (Extended) точностью (см. замечения по использованию). |
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
В подпрограмме АFG6E параметр А имеет тип Extended. | |
| 2. |
В подпрограмме АFG6С исходная комплексная матрица
порядка N задается в двух вещественных массивах АR и
АI размеров NМ * N, содержащих в своих первых N
строках ее вещественную и мнимую части соответственно. procedure AFG6C(NM :Integer; N :Integer; LOW :Integer; IGH :Integer;
var AR :Array of Real; var AI :Array of Real;
var INT :Array of Integer);
| |
| 3. | Подпрограмма АFG6Р имеет такие же параметры, как и подпрограмма АFG6С, только при этом АR и АI имеют тип Extended. |
Unit tafg6r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG6R_p;
function tafg6r: String;
implementation
function tafg6r: String;
var
J,I,_i :Integer;
INT :Array [0..3] of Integer;
const
A :Array [0..15] of Real = ( 8.0,16.0,64.0,32.0,-4.0,12.0,16.0,16.0,1.0,21.0,
28.0,20.0,16.0,48.0,64.0,64.0 );
begin
Result := ''; { результат функции }
INT[0] := 0;
INT[3] := 0;
AFG6R(4,4,1,4,A,INT);
Result := Result + #$0D#$0A;
for I:=1 to 4 do
begin
for J:=1 to 4 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',[' INT=']);
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
begin
Result := Result + Format('%10d ',[INT[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('tafg6r',Result); { вывод результатов в файл tafg6r.res }
exit;
end;
end.
Результаты:
| 8.00 8.00 8. 16. |
| 64.00 64.00 64. 64. |
A = | 0.25 32.00 32. 32. | ,
| 0.50 0.75 8. 8. |
INT = (0, 3, 3, 0)T .
Это означает, что
H = N3- 1 I3, 3 N2- 1 I2, 3 A I2, 3 N2 I3, 3 N3 =
| 8. 8. 8. 16 |
| 64. 64. 64. 64. |
= | 0. 32. 32 32. | ,
| 0. 0. 8. 8. |
при этом
| 1 0 0 0 |
| 0 1 0 0 |
N2 = | 0 0.25 1 0 | ,
| 0 0.5 0 1 |
| 1 0 0 0 |
| 0 1 0 0 |
N3 = | 0 0 1 0 | .
| 0 0 0.75 1 |