|
Текст подпрограммы и версий aet1c_p.zip , aet1z_p.zip |
Тексты тестовых примеров taet1c_p.zip , taet1z_p.zip |
Вычисление всех собственных значений и собственных векторов комплексной верхней матрицы Хессенберга QR - алгоpитмом.
Подпрограмма AET1C вычисляет собственные значения комплексной верхней матрицы Хессенберга QR - алгоpитмом со сдвигом; информация о выполняемых преобразованиях запоминается и используется потом для вычисления собственных векторов матрицы Хессенберга.
Если рассматриваемая матрица Хессенберга была получена в результате унитарного подобного преобразования некоторой комплексной матрицы общего вида с помощью подпрограммы AFG7C, то подпрограмма AET1C может вычислить непосредственно собственные векторы исходной комплексной матрицы общего вида.
Уилкинсон Дж.Х. Алгебраическая проблема собственных значений. М.: "Наука", 1970.
procedure AET1C(NM :Integer; N :Integer; LOW :Integer;
IGH :Integer; var ORTR :Array of Real;
var ORTI :Array of Real; var HR :Array of Real;
var HI :Array of Real; var WR :Array of Real;
var WI :Array of Real; var ZR :Array of Real;
var ZI :Array of Real; var IERR :Integer);
Параметры
| NM - | число строк двумерных массивов НR, НI, ZR, ZI, указанное при описании этих массивов в вызывающей подпрограмме (тип: целый); |
| N - | порядок исходной матрицы (тип: целый); |
|
LOW - IGH | выходные параметры подпрограммы АМВ1С (тип: целый); если матрица не масштабировалась, то можно взять LОW := 1, IGН := N; |
|
ORTR - ORTI |
вещественные векторы длины IGН; первые
LОW - 1 компонент этих векторов подпрограммой
АЕТ1С не используются; если требуется
вычислить собственные векторы матрицы
Хессенберга, то на входе в подпрограмму должно выполняться ОRТR (I) = ОRТI (I) = 0.0, I = LОW, LОW + 1, ..., IGН; если требуется вычислить собственные векторы комплексной матрицы общего вида (к которой была предварительно применена подпрограмма АFG7С), то ОRТR и ОRТI являются выходными параметрами подпрограммы АFG7С и содержат часть информации о выполненном унитарном преобразовании; |
| HR, HI - | вещественные двумерные массивы размерности NМ на N, содержащие на входе в подпрограмму в своих первых N строках соответственно вещественную и мнимые части исходной матрицы Хессенберга; если требуется вычислить собственные векторы матрицы Хессенберга, то остальные элементы массивов НR и НI (лежащие ниже поддиагонали) могут быть произвольными; если же требуется вычислить собственные векторы комплексной матрицы общего вида, то НR и НI - выходные параметры подпрограммы АFG7С, которые кроме матрицы Хессенберга содержат еще оставшуюся информацию о выполненном унитарном преобразовании; |
| WR, WI - | вещественные векторы длины N, содержащие на выходе из подпрограммы соответственно вещественные и мнимые части вычисленных собственных значений; |
| ZR, ZI - | вещественные двумерные массивы размерности NM на N, содержащие на выходе из подпрограммы в своих столбцах соответственно вещественные и мнимые части вычисленных собственных векторов; собственные векторы не нормируются; |
| IERR - | целочисленная переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; на выходе из подпрограммы IЕRR равно индексу собственного значения для вычисления которого требуется более 30 итераций, при этом собственные значения с индексами IЕRR + 1, IЕRR + 2, ..., N вычислены правильно, а собственные векторы не вычисляются; если вычислены все собственные значения и соответствующие собственные векторы, то IЕRR := 0. |
Версии
| AET1Z - | вычисление всех собственных значений и собственных векторов комплексной матрицы Хессенберга, заданной с расширенной (Extended) точностью, с помощью QR - алгоpитма со сдвигом. |
Вызываемые подпрограммы
| UTAE12 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм АЕТ1С и АЕТ1Z. |
Замечания по использованию
| 1. |
В подпрограмме АЕТ1Z параметры ОRТR, ОRТI, НR, НI, WR, WI, ZR, ZI имеют тип Extended. | |
| 2. | Подпрограмма АЕТ1С (АЕТ1Z) не сохраняет исходные массивы НR и НI. |
Unit TAET1C_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AET1C_p;
function TAET1C: String;
implementation
function TAET1C: String;
var
N,I,J,IERR :Integer;
WR :Array [0..2] of Real;
WI :Array [0..2] of Real;
ZR :Array [0..8] of Real;
ZI :Array [0..8] of Real;
ORTR :Array [0..2] of Real;
ORTI :Array [0..2] of Real;
cОNSt
HR :Array [0..8] of Real = ( 6.0,0.0,0.0,0.0,3.0,1.0,0.0,1.0,3.0 );
HI :Array [0..8] of Real = ( 1.0,0.0,0.0,-2.0,1.0,0.0,2.0,0.0,1.0 );
label
_10;
begin
Result := ''; { результат функции }
N := 3;
for I:=1 to N do
begin
ORTR[I-1] := 0.0;
ORTI[I-1] := 0.0;
_10:
end;
AET1C(N,N,1,N,ORTR,ORTI,HR,HI,WR,WI,ZR,ZI,IERR);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for I:=1 to N do
begin
Result := Result + Format('%20.16f ',[WR[I-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for I:=1 to N do
begin
Result := Result + Format('%20.16f ',[WI[I-1]]) + #$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 ',[ZR[(I-1)+(J-1)*3]]) + #$0D#$0A;
end;
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 ',[ZI[(I-1)+(J-1)*3]]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
UtRes('TAET1C',Result); { вывод результатов в файл TAET1C.res }
exit;
end;
end.
Результаты:
IERR = 0 , WR = (6., 4., 2.) , WI = (1., 1., 1.)
| 1. 0. 0. |
ZR = | 0. a -a |
| 0. a a |
| 0. 0. -a |
ZI = | 0. 0. 0. |
| 0. 0. 0. |
где a = 0.707106781187