Текст подпрограммы и версий ash0r_p.zip , ash0c_p.zip , ash0e_p.zip |
Тексты тестовых примеров tash0r_p.zip , tash0c_p.zip , tash0e_p.zip |
Решение системы линейных алгебраических уравнений с симметричной матрицей модифицированным методом квадратного корня (модифицированным методом Холецкого).
Подпрограмма ASH0R модифицированным методом квадратного корня осуществляет разложение заданной симметричной матрицы А в произведение
A = UT*D*U ,
где U - верхняя треугольная матрица, на диагонали которой стоят единицы, D - диагональная матрица, и затем решает две треугольные системы
UT*y = b , D*U*x = y .
При повторном решении системы с той же матрицей и другой правой частью подпрограмма позволяет использовать полученное ранее разложение.
Главные миноры матрицы А должны быть отличными от нуля.
R.S.Мartin, G.Рeters, J.Н.Wilkinson, Symmetric_p Decomposition of a Рositive Definite Мatrix, Numer. Матн., 7, 1965.
procedure ASH0R(var A :Array of Real; var B :Array of Real; var X :Array of Real; var S :Array of Real; N :Integer; L :Integer);
Параметры
A - | вещественный двумерный массив размера N на N, содержащий исходную матрицу; в результате работы подпрограммы над главной диагональю матрицы А запоминается верхняя треугольная матрица U без диагональных элементов; нижняя треугольная часть матрицы А, включая главную диагональ, сохраняется; |
B - | вещественный вектор длины N, в котором задается правая часть; |
X - | вещественный вектор длины N, в котором запоминается вычисленное решение; |
S - | вещественный вектор длины N, содержащий величины, обратные диагональным элементам диагональной матрицы D; |
N - | порядок симметричной матрицы А (тип: целый); |
L - | задает режим работы подпрограммы (тип: целый); при этом: |
L = 1 - | если система с данной матрицей А решается впервые; |
L ≠ 1 - | если система с данной матрицей А решается повторно. |
Версии
ASH0C - | решение системы линейных алгебраических уравнений с эрмитовой матрицей модифицированным методом квадратного корня. |
ASH0E - | решение системы линейных алгебраических уравнений с симметричной матрицей, заданной с расширенной (Extended) точностью, модифицированным методом квадратного корня. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме АSН0E параметры А, В, S, Х имеют тип Extended. | |
2. | В подпрограмме АSН0С параметры А, В, Х имеют тип Complex. |
Unit TASH0R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, ASH0R_p, ASH0E_p; function TASH0R: String; implementation function TASH0R: String; var N,I,J,_i :Integer; A1 :Array [0..24] of Extended; A :Array [0..24] of Real; В :Array [0..4] of Real; B1 :Array [0..4] of Extended; X :Array [0..4] of Real; X1 :Array [0..4] of Extended; S :Array [0..4] of Real; S1 :Array [0..4] of Extended; LАBel _1,_3; begin Result := ''; { результат функции } N := 5; for I:=1 to 5 do begin for J:=1 to 5 do begin A1[(I-1)+(J-1)*5] := 2520.0/(I+J-1.0); _1: A[(I-1)+(J-1)*5] := A1[(I-1)+(J-1)*5]; end; end; for I:=1 to 5 do begin B1[I-1] := 0.0; _3: B[I-1] := 0.0; end; B[0] := 1.0; B1[0] := 1.0; ASH0R(A,B,X,S,N,1); Result := Result + #$0D#$0A; for _i:=0 to 4 do begin Result := Result + Format('%20.16f ',[S[_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 ',[X[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; ASH0E(A1,B1,X1,S1,N,1); Result := Result + #$0D#$0A; for _i:=0 to 4 do begin Result := Result + Format('%20.16f ',[S1[_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 ',[X1[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TASH0R',Result); { вывод результатов в файл TASH0R.res } exit; end; end. Результаты: X = (1.359751359*10-4, -3.26340326*10-3, 2.44755244*10-2, -8.1585081*10-2, 1.34615384*10-1, -1.07692307*10-1, 3.33333333*10-2)