Подпрограмма: AFE1C (модуль AFE1C_p)
Назначение
Одновременное приведение эрмитовой трехдиагональной и
диагональной положительно определенной матриц двусторонним
диагональным преобразованием соответственно к вещественной
симметрической трехдиагональной и единичной матрицам.
Математическое описание
Пусть Т - заданная эрмитова трехдиагональная матрица, D -
диагональная положительно определенная матрица. Подпрограмма
AFE1C получает вещественную симметрическую трехдиагональную
матрицу Н и диагональную матрицу D1, такие, что
Н = D2ТD1 и
D2DD1 = Е ,
где D2 - диагональная матрица.
Эта подпрограмма может быть использована для сведения
обобщенной проблемы собственных значений вида
Тx = λDx ,
где D > 0, к стандартной проблеме
Нz = λz с вещественной
симметрической трехдиагональной матрицей Н; при этом
собственные значения этих задач совпадают, а соответствующие
собственные векторы связаны следующим образом:
x = D1z .
Использование
procedure AFE1C(var A :Array of Real; var BR :Array of Real;
var BI :Array of Real; var D :Array of Real;
var FR :Array of Real; var FI :Array of Real;
N :Integer; var IERR :Integer);
Параметры
A -
|
вещественный вектор длины N, содержащий
диагональные элементы исходной трехдиагональной
матрицы Т; на выходе из подпрограммы на месте
вектора А запоминаются вычисленные диагональные
элементы матрицы Н;
|
BR, BI -
|
вещественные векторы длины N, в последних N - 1
компонентах которых содержатся соответственно
вещественные и мнимые части наддиагональных
элементов исходной трехдиагональной матрицы Т;
на выходе из подпрограммы в последних N - 1
компонентах вектора ВR запоминаются вычисленные
наддиагональные элементы трехдиагональной матрицы Н;
|
D -
|
вещественный вектор длины N, содержащий
диагональные элементы исходной диагональной матрицы D;
|
FR, FI -
|
вещественные векторы длины N, содержащие
соответственно вещественные и мнимые части
диагональных элементов диагональной матрицы перехода
D1;
|
N -
|
заданный порядок исходных матриц Т и D (тип: целый);
|
IERR -
|
целая переменная, служащая для сообщения об
ошибках, обнаруженных в ходе работы
подпрограммы; при этом:
|
IЕRR=65 -
|
если исходная диагональная матрица D
не является положительно определенной.
|
Версии
AFE1Z -
|
одновременное приведение эрмитовой
трехдиагональной и диагональной положительно
определенной матриц, заданных с расширенной (Extended) точностью,
двусторонним диагональным преобразованием
соответственно к вещественной симметрической
трехдиагональной и единичной матрицам.
|
Вызываемые подпрограммы
UTAF12 -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограмм АFЕ1С и АFЕ1Z.
|
Замечания по использованию
|
В подпрограмме АFЕ1Z параметры А, ВR, ВI, D, FR, FI
должны иметь тип Extended.
|
Пример использования
Unit tafe1c_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFE1C_p;
function tafe1c: String;
implementation
function tafe1c: String;
var
_i,IERR :Integer;
FR :Array [0..3] of Real;
FI :Array [0..3] of Real;
const
A :Array [0..3] of Real = ( 4.0,4.0,4.0,4.0 );
BR :Array [0..3] of Real = ( 0.0,0.0,-4.0,2.0 );
BI :Array [0..3] of Real = ( 0.0,2.0,0.0,2.0 );
D :Array [0..3] of Real = ( 1.0,4.0,4.0,2.0 );
begin
Result := ''; { результат функции }
AFE1C(A,BR,BI,D,FR,FI,4,IERR);
Result := Result + Format('%s',[' A,BR,FR,FI,IERR:']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
begin
Result := Result + Format('%20.16f ',[A[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
begin
Result := Result + Format('%20.16f ',[BR[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
begin
Result := Result + Format('%20.16f ',[FR[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
begin
Result := Result + Format('%20.16f ',[FI[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format(' %5d ',[IERR]) + #$0D#$0A;
UtRes('tafe1c',Result); { вывод результатов в файл tafe1c.res }
exit;
end;
end.
Результаты:
A = (4., 1., 1., 2.) , BR = (0., 1., 1., 1.) ,
FR = (1., 0., 0., 0.5) , FI = (0., -0.5, 0.5, 0.5) ,
IERR = 0 .