Текст подпрограммы и версий afg5r_p.zip , afg5e_p.zip , afg5c_p.zip |
Тексты тестовых примеров tafg5r_p.zip , tafg5e_p.zip , tafg5c_p.zip |
Треугольное разложение вещественной матрицы общего вида методом Гаусса с выбором ведущего элемента по столбцу.
Для заданной квадратной вещественной матрицы А порядка N выполняется треугольная факторизация А = LU , где U - верхняя треугольная матрица, причем матрица L- 1 имеет вид:
L-1 = LN-1 * PN-1 *...* L1 * P1 ,
где Рi, i = 1, ..., N - 1, суть матрицы перестановок, обеспечивающие стратегию выбора ведущего элемента по столбцам; Li, i = 1, ..., N - 1, суть элементарные матрицы исключения в методе Гаусса.
Все матрицы Li, i = 1, ..., N - 1, имеют нижне - треугольный вид с единичными диагональными элементами.
Дж. Форсайт, М. Малькольм, К. Моулер. Машинные методы математических вычислений. М.: Мир, 1980.
procedure AFG5R(var A :Array of Real; M :Integer; N :Integer; var NLEAD :Array of Integer; var IERR :Integer);
Параметры
A - | вещественный двумерный массив размера М*N, в котором задается исходная квадратная матрица порядка N; на выходе на соответствующих местах массива находятся элементы матрицы U и поддиагональные элементы матриц Li, i = 1, ..., N - 1; |
M - | первая размерность массива А в вызывающей программе (тип: целый); |
N - | порядок матрицы А (тип: целый); |
NLEAD - | целый вектор длины N, содержащий на выходе информацию о выполненных в процессе исключения перестановках (см. замечания по использованию); |
IERR - | целая переменная, содержащая на выходе информацию о прохождении счета, при этом: |
IЕRR=65 - | если М ≤ 0 или N ≤ 0; |
IЕRR=66 - | если в процессе работы подпрограммы произошло переполнение (это говорит о том, что некоторые элементы матрицы U превосходят по абсолютной величине максимально представимое на данной машине число); |
IЕRR=-К - | если в результате факторизации диагональный элемент в К - ой строке матрицы U равен нулю (это свидетельствует о вырожденности матрицы А). Если таких строк у матрицы U несколько, то значение К полагается равным номеру последней из них. |
Версии
AFG5E - | треугольное разложение вещественной матрицы, заданной с расширенной (Extended) точностью методом Гаусса с выбором ведущего элемента по столбцу. |
AFG5C - | треугольное разложение комплексной матрицы методом Гаусса с выбором ведущего элемента по столбцу. |
Вызываемые подпрограммы
UTAFSI - | подпрограмма выдачи диагностических сообщений. |
Замечания по использованию
1. |
В подпрограмме АFG5С массив А имеет тип Complex. | |
2. |
В подпрограмме АFG5E массив А имеет тип Extended. | |
3. |
На выходе К - ый элемент вектора NLЕАE равен номеру строки, переставленной на К - ом шаге факторизации с К - ой строкой матрицы А. Поскольку факторизация Гаусса требует N - 1 шагов, то NLЕАD (N) = N. | |
4. |
В отличие от подпрограммы АFG1R, матрицы Li, i = 1, ..., N - 1 состоят из множителей, используемых в методе Гаусса, взятых со знаком минус, а исключение производится с использованием сложения, а не вычитания. Кроме того, элементы матриц Li, i = 1, ..., N - 1 не подвергаются выполняемым в процессе исключения перестановкам, как это происходит в подпрограмме АFG1R. | |
5. | Диагностическое сообщение выдается, если переменной IЕRR присвоено значение, отличное от нуля. При этом, если IЕRR = 65 или 66, то выполнение факторизации прекращается, если же IЕRR < 0, то не прекращается. |
Unit TAFG5R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, AFG5R_p; function TAFG5R: String; implementation function TAFG5R: String; var M,N,J,I,_i,IERR :Integer; NLEAE :Array [0..3] of Integer; const A :Array [0..15] of Real = ( 7.9,8.5,4.3,3.2,5.6,-4.8,4.2,-1.4,5.7,0.8,-3.2, -8.9,-7.2,3.5,9.3,3.3 ); begin Result := ''; { результат функции } M := 4; N := M; AFG5R(A,M,N,NLEAE,IERR); Result := Result + #$0D#$0A; for J:=1 to N do begin for I:=1 to N do begin Result := Result + Format(' РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ AFG5R: %20.16f ', [A[(I-1)+(J-1)*4]]) + #$0D#$0A; end; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%10d ',[NLEAD[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%5d ',[IERR]) + #$0D#$0A; UtRes('TAFG5R',Result); { вывод результатов в файл TAFG5R.res } exit; end; end. Результаты: | 8.500 -4.800 0.800 3.500 | | -0.929 10.061 4.956 -10.453 | A = | -0.506 -0.659 -9.402 2.405 | | -0.376 -0.040 -0.731 12.658 | NLEAD = (2, 2, 4, 4) Это означает, что | 1 0 0 0 | | -0.929 1 0 0 | L1*L2*L3 = | -0.506 -0.659 1 0 | | -0.376 -0.040 -0.731 1 | | 8.500 -4.800 0.800 3.500 | | 0 10.061 4.956 -10.453 | U = | 0 0 -9.402 2.405 | | 0 0 0 12.658 |