Текст подпрограммы и версий aet1r_p.zip , aet1e_p.zip |
Тексты тестовых примеров taet1r_p.zip , taet1e_p.zip |
Вычисление всех собственных значений и собственных векторов вещественной верхней матирцы Хессенберга QR - алгоpитмом с двойным сдвигом.
Подпрограмма AET1R вычисляет собственные значения верхней матрицы Хессенберга QR - алгоpитмом с двойным сдвигом, информация о выполняемых преобразованиях запоминается и используется потом для вычисления собственных векторов матрицы Хессенберга.
Уилкинсон, Райнш. Справочник алгоритмов на языке АЛГОЛ. Линейная алгебра, М.: "Машиностроение", 1976.
procedure AET1R(NM :Integer; N :Integer; LOW :Integer; IGH :Integer; var H :Array of Real; var WR :Array of Real; var WI :Array of Real; var Z :Array of Real; var IERR :Integer);
Параметры
NM - | число строк двумерных массивов Н и Z, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый); |
N - | порядок исходной матрицы (тип: целый); |
LOW - IGH | выходные параметры подпрограммы АМВ1R (тип: целый); если матрица не масштабировалась, то можно взять LОW := 1, IGН := N; |
H - | вещественный двумерный массив размерности NМ на N, содержащий на входе в подпрограмму в своих первых N строках исходную матрицу Хессеберга; |
WR, WI - | вещественные векторы длины N, содержащие на выходе из подпрограммы соответственно вещественные и мнимые части вычисленных собственных значений, при этом комплексно - сопряженные собственные значения располагаются последовательно, причем первым идет собственное значение с положительной мнимой частью; |
Z - | вещественный двумерный массив размерности NМ на N, содержащий на выходе из подпрограммы вычисленные собственные векторы, при этом: |
если WI (J) = 0 , | то соответствующий собственный вектор расположен в J - ом столбце массива Z; |
если WI (J) > 0 , | то в J - ом и (J + 1) - ом столбцах располагаются соответственно вещественная и мнимая части собственного вектора; |
если WI (J) < 0 , | то собственный вектор не запоминается, т.к. может быть получен как сопряженный собственному вектору, соответствующему (J - 1) - ому собственному значению; |
собственные векторы не нормируются; | |
IERR - | целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; на выходе из подпрограммы IЕRR равно индексу собственного значения для вычисления которого требуется более 30 итераций, при этом собственные значения с индексами IЕRR + 1, IЕRR + 2, ...,N вычислены правильно, а собственные векторы не вычисляются; если вычислены все собственные значения и собственные векторы, то IЕRR := 0. |
Версии
AET1E - | вычисление всех собственных значений и собственных векторов вещественной матрицы Хессенберга, заданной с расширенной (Extended) точностью, с помощью QR - алгоритма с двойным сдвигом. |
Вызываемые подпрограммы
UTAE12 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм АЕТ1R и АЕТ1E. |
Замечания по использованию
1. |
В подпрограмме АЕТ1E параметры Н, WR, WI, Z имеют тип Extended. | |
2. | Подпрограмма АЕТ1R (АЕТ1E) не сохраняет исходный массив Z. |
Unit TAET1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AET1R_p; function TAET1R: String; implementation function TAET1R: String; var N,_i,J,I,IERR :Integer; WR :Array [0..2] of Real; WI :Array [0..2] of Real; Z :Array [0..8] of Real; const H :Array [0..8] of Real = ( 2.0,0.0,0.0,4.0,3.0,1.0,4.0,1.0,3.0 ); begin Result := ''; { результат функции } N := 3; AET1R(N,N,1,N,H,WR,WI,Z,IERR); Result := Result + Format('%5d ',[IERR]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 2 DО beGIN Result := Result + Format('%20.16f ',[WR[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[WI[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to N do begin for J:=1 to N do begin Result := Result + Format('%20.16f ',[Z[(I-1)+(J-1)*3]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; UtRes('TAET1R',Result); { вывод результатов в файл TAET1R.res } exit; end; end. Результаты: IERR = 0 , WR = (2., 4., 2.) , WI = (0., 0., 0.) | 1 4a 0 | Z = | 0 a -a | | 0 a a | где a = 0.707106781187