Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.ru/lib_na/cat/ae_htm_p/aee8r_p.htm
Дата изменения: Thu Oct 29 14:48:07 2015 Дата индексирования: Sun Apr 10 04:00:46 2016 Кодировка: Windows-1251 |
Текст подпрограммы и версий aee8r_p.zip , aee8e_p.zip |
Тексты тестовых примеров taee8r_p.zip , taee8e_p.zip |
Вычисление собственных значений симметричной трехдиагональной матрицы, принадлежащих данному полуинтервалу, и определение номеров этих собственных значений.
Пусть все собственные значения заданной симметричной трехдиагональной матрицы Т порядка N перенумерованы в порядке неубывания :
λ1 ≤ λ2 ≤ ... ≤ λN-1 ≤ λN
Подпрограмма AEE8R определяет номера собственных значений матрицы Т, принадлежащих данному полуинтервалу (V, U), и производит вычисление этих собственных значений методом бисекций.
Дж.Х.Уилкинсон, Алгебраическая проблема собственных значений, "Наука", М., 1970.
procedure AEE8R(var A :Array of Real; var B :Array of Real; N :Integer; var L :Real; var U :Real; var M1 :Integer; var M2 :Integer; var RU :Array of Real; var W :Array of Real);
Параметры
A - | вещественный вектор длины N, содержащий диагональные элементы симметричной трехдиагональной матрицы; |
B - | вещественный вектор длины N, содержащий в последних N - 1 компонентах поддиагональные элементы симметричной трехдиагональной матрицы; |
N - | заданный порядок симметричной трехдиагональной матрицы (тип: целый); |
V, U - | соответственно нижняя и верхняя границы заданного полуинтервала (тип: вещественный); |
M1, M2 - | номера соответственно наименьшего и наибольшего собственных значений, принадлежащих данному полуинтервалу (тип: целый); |
RU - | вещественный вектор длины N, используемый как рабочий; |
W - | вектор длины N, с М1 - й по М2 - ю компоненту которого содержатся вычисленные собственные значения принадлежащие заданному полуинтервалу. |
Версии
AEE8E - | вычисление собственных значений симметричной трехдиагональной матрицы, заданной с расширенной (Extended) точностью, принадлежащих данному полуинтервалу, и определение номеров этих собственных значений. |
Вызываемые подпрограммы : нет
Замечания по использованию
1. |
Подпрограмма АЕЕ8R не сохраняет исходные векторы А и В. | |
2. |
Если заданный полуинтервал не содержит ни одного собственного значения симметричной трехдиагональной матрицы, то подпрограмма АЕЕ8R присваивает М1 и М2 нулевые значения. | |
3. |
В подпрограмме АЕЕ8E параметры А, В, V, U, RU, W должны иметь тип Extended. | |
4. | Подпрограмма АЕЕ8R может быть использована для вычисления собственных значений комплексной эрмитовой трехдиагональной матрицы, принадлежащих данному полуинтервалу, и определения номеров этих собственных значений. Для этого нужно предварительно привести комплексную эрмитовую трехдиагональную матрицу к вещественной симметричной трехдиагональной матрице преобразованиями подобия (например, обратиться к подпрограмме АFЕ0С). | |
5. |
Подпрограмма АЕE8R использует служебную подпрограмму AMA1R. Подпрограмма АЕE8E использует служебную подпрограмму AMA1E. |
Unit TAEE8R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AEE8R_p; function TAEE8R: String; implementation function TAEE8R: String; var N,_i,M1,M2 :Integer; L,U :Real; RU :Array [0..49] of Real; W :Array [0..49] of Real; const A :Array [0..49] of Real = ( 1.0,49.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0 ); B :Array [0..49] of Real = ( 0.0,7.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0.0,0.0 ); begin for _i:=0 to 49 do W[_i] := 0.0; //начальное обнуление массива Result := ''; { результат функции } N := 50; L := -2.0; U := 7.0; AEE8R(A,B,N,L,U,M1,M2,RU,W); Result := Result + #$0D#$0A; for _i:=0 to 49 do begin Result := Result + Format('%20.16f ',[W[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format(' %5d %5d ',[M1,M2]) + #$0D#$0A; UtRes('TAEE8R',Result); { вывод результатов в файл TAEE8R.res } exit; end; end. Результаты: M1 = 1, M2 = 49 , W(1) = W(2) = ... = W(49) = -1.34*10-11