Текст подпрограммы и версий asg6r_p.zip , asg6c_p.zip , asg6e_p.zip |
Тексты тестовых примеров tasg6r_p.zip , tasg6c_p.zip , tasg6e_p.zip |
Решение системы линейных алгебраических уравнений методом отражений.
Находится решение системы A*X = B, где А - невырожденая квадратная матрица порядка N, В - заданный вектор длины N. Для решения используется нормализованное приведение матрицы системы А к верхней треугольной форме R с помощью последовательности преобразований отражения
(1) QN-1 ... Q2*Q1*A*S = R ,
где Qi - соответствующие матрицы отражения, S - результирующая матрица перестановок, R - верхняя треугольная матрица.
Из полученной треугольной системы
R*Y = QN-1 ... Q2*Q1*B
находится решение Y, по которому затем определяется искомое решение Х = S*Y.
Дж.Х.Уилкинсон. Алгебраическая проблема собственных значений. Изд."Наука", М., 1970.
procedure ASG6R(var A :Array of Real; var B :Array of Real; var X :Array of Real; var T :Array of Real; var IS_ :Array of Integer; N :Integer; L :Integer);
Параметры
A - | вещественный двумерный массив размера N на N, в котором задается исходная матрица; в результате работы подпрограммы в массиве А на соответствующих местах запоминаются наддиагональные элементы вычисленной верхней треугольной матрицы R, в остальной части массива А в последовательных столбцах запоминаются векторы, порождающие соответствующие матрицы отражения; |
B - | вещественный вектор длины N, в котором задается правая часть системы; |
X - | вещественный вектор длины N, в котором запоминается полученное решение системы; |
T - | вещественный вектор длины N, в котором запоминаются диагональные элементы верхней треугольной матрицы R; |
IS - | целый вектор длины N, в котором запоминаются перестановки столбцов при проведении нормализованного процесса (1); в IS (k) запоминается номер столбца, переставленного с k - ым столбцом на k - ом шаге преобразования; |
N - | порядок исходной матрицы (тип: целый); |
L - | задает режим работы подпрограммы (тип: целый); при этом: |
L = 1 - | если система с данной матрицей А решается впервые; |
L ≠ 1 - | если повторно решается система с матрицей А, но другой правой частью; в этом случае факторизация (1) матрицы А не выполняется. |
Версии
ASG6C - | решение комплексной системы линейных алгебраических уравнений методом отражений. |
ASG6E - | решение системы линейных алгебраических уравнений, заданной с расширенной (Extended) точностью, методом отражений. |
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В подпрограмме АSG6С параметры А, В, Х, Т имеют тип Complex. | |
2. |
В подпрограмме АSG6E параметры А, В, Т, Х имеют тип Extended. | |
3. | При повторном решении системы с той же матрицей А, но с другой правой частью, информация, полученная ранее в массивах А, Т, IS не должна портиться. |
Unit TASG6R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, ASG6R_p; function TASG6R: String; implementation function TASG6R: String; var N,L,K,J,I,KH,_i :Integer; A :Array [0..35] of Real; X :Array [0..5] of Real; T :Array [0..5] of Real; IS_ :Array [0..5] of Integer; const B :Array [0..5] of Real = ( 1.0,2.0,3.0,4.0,5.0,1.0 ); label _21,_20; begin Result := ''; { результат функции } N := 6; L := 1; K := N+1; for J:=1 to N do begin for I:=J to N do begin КН := K-I; A[(I-1)+(J-1)*6] := KH; _21: A[(J-1)+(I-1)*6] := KH; end; _20: end; Result := Result + Format('%s', [' ИСХОДНЫЕ ДAHHЫE:' + #$0D#$0A]) + #$0D#$0A; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' A' + #$0D#$0A]); for I:=1 to 6 do begin for J:=1 to 6 do begin Result := Result + Format('%20.16f ',[A[(I-1)+(J-1)*6]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' B' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 5 do 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 + Format('%s',[' PEЗYЛЬTAT:']) + #$0D#$0A; ASG6R(A,B,X,T,IS_,N,L); Result := Result + Format('%s',[' A' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 35 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',[' T' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 5 do begin Result := Result + Format('%20.16f ',[T[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[#$0D#$0A + ' B' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 5 do 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 + Format('%s',[' X' + #$0D#$0A]); Result := Result + #$0D#$0A; for _i:=0 to 5 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; Result := Result + #$0D#$0A; for _i:=0 to 5 do begin Result := Result + Format('%10d ',[IS_[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TASG6R',Result); { вывод результатов в файл TASG6R.res } exit; end; end. Результат: X = (-1., 0., 0., 0., 5., -3.)