|
Текст подпрограммы и версий afg1r_p.zip , afg1e_p.zip , afg1c_p.zip |
Тексты тестовых примеров tafg1r_p.zip , tafg1e_p.zip , tafg1c_p.zip |
Треугольное разложение вещественной матрицы методом Гаусса с выбором ведущего элемента по столбцу.
Для заданной матрицы А выполняется факторизация вида QА = LU, где Q - вычисляемая матрица перестановок, L - нижняя, U - верхняя треугольная матрицы. Матрица L имеет единичные диагональные элементы. Матрица Q осуществляет перестановку строк исходной матрицы и обеспечивает стратегию выбора ведущего элемента по столбцам.
В.В.Воеводин, Р.В.Петрина, Комплекс алгоритмов, основанных на преобразованиях типа Гаусса, в пакете линейной алгебры, Сб. "Численный анализ на ФОРТРАНе", вып.3, Изд-во МГУ, 1973.
procedure AFG1R(var A :Array of Real; var S :Array of Integer;
N :Integer);
Параметры
| A - | двумерный N*N массив, в котором задается исходная матрица (тип: Real); по окончании работы подпрограммы в массиве А на соответствующих местах запоминаются элементы матрицы U и поддиагональные элементы матрицы L; |
| S - | вектор длины N, в котором запоминается вектор, порождающий матрицу перестановок; при этом в S (К) запоминается номер строки, переставленной на К - ом шаге с К - ой строкой (тип: целый); |
| N - | заданный порядок исходной матрицы (тип: целый). |
Версии
| AFG1E - | треугольное разложение матрицы, заданной с расширенной (Extended) точностью методом Гаусса с выбором ведущего элемента по столбцу. |
| AFG1C - | треугольное разложение комплексной матрицы методом Гаусса с выбором ведущего элемента по столбцу. |
Вызываемые подпрограммы: нет
Замечания по использованию
| 1. |
В подпрограмме АFG1С массив А имеет тип Complex. | |
| 2. |
В подпрограмме АFG1E массив А имеет тип Extended. | |
| 3. | Поскольку факторизация Гаусса требует N - 1 шагов, то S (N) = 0. |
Unit TAFG1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AFG1R_p;
function TAFG1R: String;
implementation
function TAFG1R: String;
var
J,I,_i :Integer;
S :Array [0..3] of Integer;
const
РА :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
for _i:=0 to 4 do
S[_i] := 0; //начальное обнуление массива
Result := ''; { результат функции }
AFG1R(PA,S,4);
Result := Result + #$0D#$0A;
for I:=1 to 4 do
begin
for J:=1 to 4 do
begin
Result := Result + Format('%20.16f ',[PA[(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('%d ',[S[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TAFG1R',Result); { вывод результатов в файл TAFG1R.res }
exit;
end;
end.
Результат:
| 8.500 -4.800 0.800 3.500 |
| 0.929 10.061 4.956 -10.453 |
A = | 0.376 0.040 -9.402 2.405 | ;
| 0.506 0.659 0.731 12.658 |
S = (2, 2, 4, 0);
это означает, что
| 1 0 0 0 |
| 0.929 1 0 0 |
L = | 0.376 0.040 1 0 | ;
| 0.506 0.659 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 |