Текст подпрограммы и версий aeb1r_p.zip , aeb1e_p.zip |
Тексты тестовых примеров taeb1r_p.zip , taeb1e_p.zip |
Вычисление собственных значений вещественной симметрической ленточной матрицы с помощью Q*L - алгоритма.
Симметричная ленточная матрица приводится ортогональными преобразованиями Гивенса к симметрической трехдиагональной форме, которая используется для вычисления собственных значений исходной матрицы Q*L - алгоритмом.
Дж.Х.Уилкинсон, Агебраическая проблема собственных значений, "Наука", М., 1970.
procedure AEB1R(N :Integer; MB :Integer; var A :Array of Real; var EV :Array of Real; var RAB :Array of Real; var IERR :Integer);
Параметры
N - | порядок исходной матрицы (тип: целый); |
NC - | заданное число кодиагоналей исходной матрицы, включая главную диагональ (тип: целый); |
A - | вещественный двумерный массив размера N*NС, в котором задается исходная симметричная ленточная матрица в компактной форме; |
EV - | вещественный вектор длины N, содержащий вычисленные в возрастающем порядке собственные значения; |
RAB - | вещественный вектор длины 2 на N, используемый как рабочий; |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом значение IЕRR полагается равным номеру собственного значения, для вычисления которого потребовалось более 30 итераций; в этом случае собственные значения с индексами 1, 2, ..., IЕRR - 1 вычислены правильно и расположены в возрастающем порядке, но они не обязательно являются самыми меньшими из всех N собственных значений. |
Версии
AEB1E - | вычисление собственных значений вещественной симметрической ленточной матрицы с помощью QL - алгоритма с расширенной (Extended) точностью. |
Вызываемые подпрограммы
UTAE10 - | подпрограмма выдачи диагностических сообщений при работе подпрограмм АЕВ1R, AEB1E. |
Замечания по использованию
Подпрограммы АЕВ1R, AEB1E не сохраняют исходную ленточную матрицу, но в последних двух столбцах массива А запоминается ее трехдиагональная форма. | |
В подпрограмме AEB1E параметры A, EV, RAB имеют тип Extended . |
Unit TAEB1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AEB1R_p; function TAEB1R: String; implementation function TAEB1R: String; var I,NC,N,_i,IERR :Integer; A :Array [0..20] of Real; EV :Array [0..6] of Real; RАВ :Array [0..13] of Real; label _11; begin Result := ''; { результат функции } for I:=1 to 7 do begin A[(I-1)+14] := Power(10.0,7-I); A[(I-1)+7] := 10.0; _11: A[(I-1)+0] := 1.0; end; NC := 3; N := 7; AEB1R(N,NC,A,EV,RAB,IERR); Result := Result + #$0D#$0A; for _i:=0 to 20 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 + Format('%s',[' IERR=']); Result := Result + Format('%2d ',[IERR]) + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 6 do begin Result := Result + Format('%20.16f ',[EV[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TAEB1R',Result); { вывод результатов в файл TAEB1R.res } exit; end; end. Результаты:
Собственные значения:
| -5.67229125355E+00 | | 1.55306255671E+01 | | 1.01029233155E+02 | EV = | 1.00010119681E+03 | | 1.00000101005E+04 | | 1.00000001008E+05 | | 1.00000000011E+06 | IERR = 0