Текст подпрограммы и версий afg3r_p.zip |
Тексты тестовых примеров tafg3r_p.zip |
Приведение пары вещественных матриц к верхней почти треугольной форме ортогональными преобразованиями с помощью QZ - алгоритма.
Для заданных вещественных матриц А и В размера N*N вычисляются такие ортогональные матрицы Q и Z размера N*N, что матрица QАZ является верхней почти треугольной, а матрица QВZ - верхней треугольной.
В результате работы подпрограммы АFG3R матрица QАZ помещается на место матрицы А, матрица QВZ - на место матрицы В. Левостороннее преобразование Q не сохраняется, правостороннее преобразование Z по желанию пользователя может сохраняться.
С.В.Мoler and G.W.Stewart, Аn Аlgorithm for Generalized Mатrix Еigenvalue Рroblems, SIАМ J. Numer.Аnal., 10, 1973.
procedure AFG3R(var A :Array of Real; var B :Array of Real; var Z :Array of Real; N :Integer; M :Integer);
Параметры
A, B - | вещественные двумерные массивы размера N*N, в которых задаются исходные матрицы А и В; в результате работы подпрограммы в массивы А и В записываются соответственно верхняя почти треугольная матрица QАZ и верхняя треугольная матрица QВZ ; |
Z - | вещественный двумерный массив размера N*N, который в результате работы подпрограммы по желанию пользователя может содержать матрицу Z правостороннего преобразования; если матрица Z не нужна, параметр Z в подпрограмме не используется; |
N - | заданный порядок исходных матриц А и В (тип: целый); |
M - | задает режим работы подпрограммы (тип:целый); при этом |
М = 0 - | если преобразование Z сохраняется, |
М = 1 - | если преобразование Z не сохраняется. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
Матрица преобразования Z необходима для вычисления соответственных векторов обобщенной проблемы Аx = λВx по правилу x = Zy, где y - собственные векторы обобщенной проблемы QАZy = λQВZy . | |
2. | Если матрица преобразования Z не нужна, т.е. когда М = 1, то в качестве фактического параметра Z можно использовать параметр А. |
Unit tafg3r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AFG3R_p; function tafg3r: String; implementation function tafg3r: String; var J,I,N,M :Integer; Z :Array [0..8] of Real; const A :Array [0..8] of Real = ( 1.0,-10.0,5.0,0.5,2.0,1.0,0.0,0.0,0.5 ); B :Array [0..8] of Real = ( 0.5,3.0,4.0,0.0,3.0,0.5,0.0,0.0,1.0 ); begin Result := ''; { результат функции } Result := Result + Format('%s', [' ПРИВЕДЕНИЕ ПАРЫ ВЕЩЕСТВЕННЫХ МАТРИЦ К ВЕРХНЕТРЕУГОЛЬНОЙ ' + #$0D#$0A + ' И ВЕРХНЕЙ ПОЧТИ ТРЕУГОЛЬНОЙ ФОРМЕ ОРТОГОНАЛЬНЫМИ ' + #$0D#$0A + ' ПРЕОБРАЗОВАНИЯМИ']) + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 3 do begin for J:=1 to 3 do begin Result := Result + Format(' A %20.16f ', [A[(I-1)+(J-1)*3]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 3 do begin for J:=1 to 3 do begin Result := Result + Format(' B %20.16f ', [B[(I-1)+(J-1)*3]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; N := 3; M := 0; AFG3R(A,B,Z,N,M); Result := Result + Format('%s',[' PEЗYЛЬTAT' + #$0D#$0A]) + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 3 do begin for J:=1 to 3 do begin Result := Result + Format(' A %20.16f ', [A[(I-1)+(J-1)*3]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 3 do begin for J:=1 to 3 do begin Result := Result + Format(' B %20.16f ', [B[(I-1)+(J-1)*3]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for I:=1 to 3 do begin for J:=1 to 3 do begin Result := Result + Format(' Z %20.16f ', [Z[(I-1)+(J-1)*3]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; UtRes('tafg3r',Result); { вывод результатов в файл tafg3r.res } exit; end; end. Результаты: | 1.89057 -2.06068 0.27000 | A = | -11.06462 0.94174 0.35338 | | 0.00000 -0.39941 -0.09705 | | -5.02494 -2.23447 0.65793 | B = | 0.00000 2.07058 0.71846 | | 0.00000 0.00000 -0.14417 | | 1.00000 0.00000 0.00000 | Z = | 0.00000 0.99805 0.06238 | | 0.00000 0.06238 -0.99805 |