Текст подпрограммы и версий
afe1r_p.zip , afe1e_p.zip
Тексты тестовых примеров
tafe1r_p.zip , tafe1e_p.zip

Подпрограмма:  AFE1R (модуль AFE1R_p)

Назначение

Одновременное приведение вещественной симметрической трехдиагональной матрицы и диагональной положительно определенной матрицы двусторонним диагональным преобразованием соответственно к вещественной симметрической трехдиагональной и единичной матрицам.

Математическое описание

Пусть Т - заданная вещественная симметрическая трехдиагональная матрица, D - диагональная положительно определенная матрица. Подпрограмма AFE1R получает вещественную симметрическую трехдиагональную матрицу Н и диагональную матрицу D1 = D - 1/2, такие что  Н = D1ТD1 и  D1DD1 = Е .

Эта подпрограмма может быть использована для сведения обобщенной проблемы собственных значений вида Тx = λDx , где Т - вещественная симметрическая трехдиагональная, D - диагональная, D > 0, к стандартной проблеме Нz = λz с вещественной симметрической трехдиагональной матрицей Н; при этом собственные значения этих задач совпадают, а соответствующие собственные векторы связаны следующим образом :  x = D1z .

Использование

procedure AFE1R(var A :Array of Real; var B :Array of Real;
                var D :Array of Real; N :Integer; var IERR :Integer);

Параметры

A - вещественный вектор длины N, содержащий диагональные элементы исходной трехдиагональной матрицы Т; на выходе из подпрограммы на соответствующих местах вектора А запоминаются вычисленные диагональные элементы матрицы Н;
B - вещественный вектор длины N, в последних N - 1 компонентах которого содержатся наддиагональные элементы исходной трехдиагональной матрицы Т; на выходе из подпрограммы на соответствующих местах вектора В запоминаются вычисленные наддиагональные элементы вещественной симметрической трехдиагональной матрицы Н;
D - вещественный вектор длины N, содержащий диагональные элементы исходной диагональной матрицы D; на выходе из подпрограммы на соответствующих местах вектора D запоминаются вычисленные диагональные элементы матрицы D1;
N - заданный порядок исходных матриц Т и D (тип: целый);
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IЕRR=65 - если исходная диагональная матрица D не является положительно определенной.

Версии

AFE1E - одновременное приведение вещественной симметрической трехдиагональной и диагональной положительно определенной матриц, заданных с расширенной (Extended) точностью, двусторонним диагональным преобразованием к вещественной симметрической трехдиагональной и единичной матрицам.

Вызываемые подпрограммы

UTAF12 - подпрограмма выдачи диагностических сообщений при работе подпрограмм АFЕ1R и АFЕ1E.

Замечания по использованию

  В подпрограмме АFЕ1E параметры А, В, D должны иметь тип Extended.

Пример использования

Unit TAFE1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFE1R_p;

function TAFE1R: String;

implementation

function TAFE1R: String;
var
_i,IERR :Integer;
const
A :Array [0..4] of Real = ( 1.0,2.0,2.0,2.0,1.0 );
B :Array [0..4] of Real = ( 0.0,2.0,2.0,2.0,2.0 );
D :Array [0..4] of Real = ( 1.0,4.0,4.0,4.0,4.0 );
begin
Result := '';  { результат функции }
AFE1R(A,B,D,5,IERR);
Result := Result + Format('%s',[' А,В,D,IЕRR:']) + #$0D#$0A; 
Result := Result + #$0D#$0A;
for _i:=0 to 4 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 4 dО
 begin
  Result := Result + Format('%20.16f ',[B[_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 4 do
 begin
  Result := Result + Format('%20.16f ',[D[_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('TAFE1R',Result);  { вывод результатов в файл TAFE1R.res }
exit;
end;

end.


Результаты:

      A  =   (1., 0.5, 0.5, 0.5, 0.25) ,
      B  =   (0., 1., 0.5, 0.5, 0.5) ,
      D  =   (1., 0.5, 0.5, 0.5, 0.5) ,

      IERR  =  0 .