Текст подпрограммы и версий 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 |