Текст подпрограммы и версий
afj0c_p.zip , afj0z_p.zip
Тексты тестовых примеров
tafj0c_p.zip , tafj0z_p.zip

Подпрограмма:  AFJ0C (модуль AFJ0C_p)

Назначение

Приведение комплексной матрицы Якоби к симметрической трехдиагональной матрице преобразованием подобия.

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

Пусть Т - матрица Якоби, т.е. трехдиагональная матрица, у которой диагональные элементы являются вещественными, а произведения пар внедиагональных элементов все неотрицательны и равны нулю только тогда, когда оба сомножителя равны нулю.

Подпрограмма AFJ0C приводит матрицу Т к вещественной симметрической матрице Н преобразованием подобия Н = D - 1ТD , где D - комплексная диагональная матрица. При этом используются лишь внедиагональные элементы матрицы Т, т.к. диагональные элементы матриц Т и Н совпадают.

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

procedure AFJ0C(var BR :Array of Real; var BI :Array of Real;
                var CR :Array of Real; var CI :Array of Real;
                N :Integer; var IERR :Integer);

Параметры

BR, BI - вещественные векторы длины N, в последних N - 1 компонентах которых содержатся соответственно вещественные и мнимые части наддиагональных элементов исходной матрицы Якоби; на выходе подпрограммы в последних N - 1 компонентах вектора ВR запоминаются вычисленные наддиагональные элементы трехдиагональной матрицы Н;
CR, CI - вещественные векторы длины N, в последних N - 1 компонентах которых содержатся соответственно вещественные и мнимые части поддиагональных элементов; на выходе подпрограммы в векторах СR и СI запоминаются соответственно вещественные и мнимые части вычисленных диагональных элементов диагональной матрицы D;
N - заданный порядок исходной матрицы Якоби (тип: целый);
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IЕRR=66 - если не все попарные произведения соответствующих элементов побочных диагоналей исходной матрицы неотрицательны;
IЕRR=67 - если имеется равное нулю произведение соответствующих элементов побочных диагоналей, причем сомножители равны нулю неодновременно;
IЕRR=68 - если матрица Н получена, но матрица преобразования D не вычислена, т.к. она или обратная к ней матрица алгоритмически вырождена.

Версии

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

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

UTAF12 - подпрограмма выдачи диагностических сообщений при работе подпрограмм АFJ0С и АFJ0Z.

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

  В подпрограмме АFJ0Z параметры ВR, ВI, СR, СI должны иметь тип Extended.

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

Unit tafj0c_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFJ0C_p;

function tafj0c: String;

implementation

function tafj0c: String;
var
_i,IERR :Integer;
const
BR :Array [0..3] of Real = ( 0.0,0.0,1.0,-4.0 );
CI :Array [0..3] of Real = ( 0.0,1.0,8.0,0.0 );
BI :Array [0..3] of Real = ( 0.0,-1.0,-1.0,0.0 );
CR :Array [0..3] of Real = ( 0.0,0.0,8.0,-4.0 );
begin
Result := '';  { результат функции }
AFJ0C(BR,BI,CR,CI,4,IERR);
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 ',[CR[_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 ',[CI[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format(' %10d ',[IERR]) + #$0D#$0A;
UtRes('tafj0c',Result);  { вывод результатов в файл tafj0c.res }
exit;
end;

end.


Результаты:

      BR  =   (0., 1., 4., 4.), 
      CR  =   (1., 0., -2., 2.), 
      CI  =   (0., 1., 2., -2.), 

      IERR  =  0