|
Текст подпрограммы и версий afg3c_p.zip |
Тексты тестовых примеров tafg3c_p.zip |
Приведение пары комплексных матриц к верхней почти треугольной форме элементарными преобразованиями с помощью LZ - алгоритма.
Для заданных комплексных матриц А и В размера N*N вычисляются такие элементарные матрицы L и Z размера N*N, что матрица LАZ является верхней почти треугольной, а матрица LВZ - верхней треугольной.
В результате работы подпрограммы AFG3C матрица LАZ помещается на место матрицы А, матрица LВZ - на место матрицы В. Левостороннее преобразование L не сохраняется, правостороннее преобразование Z по желанию пользователя может сохраняться.
R.S.Мartin, J.Н.Wilkinson, Tне Мodified LR - Аlgorithm for Сomplex Нessenberg Мatrices, Numer.Мath., 12, 1968.
С.В.Мoler, G.W.Stewart, Аn Аlgorithm for тне Generalized Мatrix Еigenvalue Рrodlems, SIАМ J. Numer. Аnal., 10, 1973.
procedure AFG3C(var A :Array of Complex; var B :Array of Complex;
var Z :Array of Complex; N :Integer; M :Integer);
Параметры
| A, B - | комплексные двумерные массивы размера N*N, в которых задаются исходные матрицы А и В; в результате работы подпрограммы в массивы А и В записываются соответственно верхняя почти треугольная матрица LАZ и верхняя треугольная матрица LВZ; |
| Z - | комплексный двумерный массив размера N*N, который содержит вычисленное правостороннее преобразование Z; если преобразование не нужно, то параметр Z в подпрограмме не используется; |
| N - | заданный порядок матриц А, В и Z (тип: целый); |
| M - | задает режим работы подпрограммы (тип: целый); причем |
| М = 0 - | если преобразование Z сохраняется, |
| М = 1 - | если преобразование Z не сохраняется. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
Матрица преобразования Z необходима для вычисления собственных векторов обобщенной проблемы Аx = λВx по правилу x = Zy, где y - собственные векторы обобщенной проблемы LАZy =λLВZy . | |
| 2. | Если матрица преобразования Z не нужна, т.е. когда М = 1, то в качестве фактического параметра Z можно использовать параметр А. |
Unit TAFG3C_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG3C_p;
function TAFG3C: String;
implementation
function TAFG3C: String;
var
J,I,N,M,IERR :Integer;
Z :Array [0..8] of Complex;
const
A :Array [0..8] of Complex = ( ( re:1.0; im:0.0 ),( re:-10.0; im:0.0 ),(
re:5.0; im:0.0 ),( re:0.5; im:0.0 ),( re:2.0;
im:0.0 ),( re:1.0; im:0.0 ),( re:0.0; im:0.0 ),(
re:0.0; im:0.0 ),( re:0.5; im: 0.0 ) );
B :Array [0..8] of Complex = ( ( re:0.5; im:0.0 ),( re:3.0; im:0.0 ),( re:4.0;
im:0.0 ),( re:0.0; im:0.0 ),( re:3.0; im:0.0 ),(
re:0.5; im:0.0 ),( re:0.0; im:0.0 ),( re:0.0;
im:0.0 ),( re:1.0; im: 0.0 ) );
begin
Result := ''; { результат функции }
Result := Result + Format('%s',
[' ПРИВЕДЕНИЕ ДВУХ КОМПЛЕКСНЫХ МАТРИЦ К ВЕРХНЕТРЕУГОЛЬНОЙ ' + #$0D#$0A +
' И ВЕРХНЕЙ ПОЧТИ ТРЕУГОЛЬНОЙ ФОРМЕ ОРТОГОНАЛЬНЫМИ ' + #$0D#$0A +
' ПРЕОБРАЗОВАНИЯМИ']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
begin
for I:=1 to 3 do
begin
Result := Result + Format(' A%20.16f ',
[A[(I-1)+(J-1)*3].re,A[(I-1)+(J-1)*3].im]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
begin
for I:=1 to 3 do
begin
Result := Result + Format(' B%20.16f ',
[B[(I-1)+(J-1)*3].re,B[(I-1)+(J-1)*3].im]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
N := 3;
M := 0;
AFG3C(A,B,Z,N,M);
Result := Result + Format('%s',[' PEЗYЛЬTAT']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
begin
for I:=1 to 3 do
begin
Result := Result + Format(' A%20.16f ',
[A[(I-1)+(J-1)*3].re,A[(I-1)+(J-1)*3].im]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
begin
for I:=1 to 3 do
begin
Result := Result + Format(' B%20.16f ',
[B[(I-1)+(J-1)*3].re,B[(I-1)+(J-1)*3].im]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for J:=1 to 3 do
begin
for I:=1 to 3 do
begin
Result := Result + Format(' Z%20.16f ',
[Z[(I-1)+(J-1)*3].re,Z[(I-1)+(J-1)*3].im]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' IERR']);
Result := Result + Format('%8d ',[IERR]) + #$0D#$0A;
UtRes('TAFG3C',Result); { вывод результатов в файл TAFG3C.res }
exit;
end;
end.
Результаты:
| 5.00000 + 0.0 i 1.03125 + 0.0 i 0.50000 + 0.0 i |
A = |-13.75000 + 0.0 i 1.22056 + 0.0 i -0.37500 + 0.0 i |
| 0.0 + 0.0 i 0.40455 + 0.0 i -0.07273 + 0.0 i |
| 4.00000 + 0.0 i 0.56250 + 0.0 i 1.00000 + 0.0 i |
B = | 0.0 + 0.0 i 2.57812 + 0.0 i -0.75000 + 0.0 i |
| 0.50000 + 0.0 i 0.0 + 0.0 i -0.14545 + 0.0 i |
| 1.0 + 0.0 i 0.0 + 0.0 i 0.0 + 0.0 i |
Z = | 0.0 + 0.0 i 1.0 + 0.0 i 0.0 + 0.0 i |
| 0.0 + 0.0 i 0.06250 + 0.0 i 1.0 + 0.0 i |