Подпрограмма: ASG9R (модуль ASG9R_p)
Назначение
Решение вещественной системы линейных алгебраических
уравнений А*x = b или AT*x = b
с матрицей A общего вида
методом Гаусса с выбором ведущего элемента по столбцу.
Математическое описание
Для заданной вещественной квадратной матрицы А порядка N
выполняется треугольная факторизация
L- 1*А = U ,
где U - веpхняя тpеугольная матpица, и затем последовательно
pешаются системы:
L*Y = B
(для системы АT*x = b решается UT*y = b) и
U*x = y
(для АT*x = b решается LT*x = y) .
Дж.Форсайт, М.Малькольм, К.Моулер. Машинные методы
математических вычислений. М., Мир, 1980.
Использование
procedure ASG9R(var A :Array of Real; M :Integer; N :Integer;
var NLEAD :Array of Integer; var B :Array of Real;
LTR :Integer; L :Integer; var IERR :Integer);
Параметры
A -
|
вещественный двумерный массив размера М на N, в
котором задается исходная матрица; на выходе на
соответствующих местах находятся элементы
матрицы U и поддиагональные элементы матрицы
исключения метода Гаусса Li ,
i = 1, ..., N - 1 ;
|
M -
|
первая размерность массива А в вызывающей
подпрограмме (тип: целый);
|
N -
|
порядок матрицы системы (тип: целый);
|
NLEAD -
|
целый вектор длины N, содержащий на выходе
информацию о выполненных в ходе факторизации
перестановках (см. замечания по использованию);
|
B -
|
вещественный вектор длины N, в котором задается
правая часть системы; на выходе содержит
вычисленное решение системы (см. замечания по использованию);
|
LTR -
|
задается вид решаемой системы (тип: целый), при этом:
|
LТR = 0 -
|
если решается система А*x = b ;
|
LТR ≠ 0 -
|
если решается система АT*x = b;
|
L -
|
признак решаемой системы (тип: целый), при этом:
|
L = 0 -
|
если система с данной матрицей решается впервые;
|
L ≠ 0 -
|
если система с данной матрицей решается повторно;
|
IERR -
|
целая переменная, содержащая на выходе
информацию о прохождении счета, при этом:
|
IЕRR=65 -
|
если М ≤ 0 или
N ≤ 0 ;
|
IЕRR=66 -
|
если в процессе счета возникло
переполнение (это говорит о том, что либо
некоторые элементы матрицы U, либо
некоторые компоненты решения превосходят
по абсолютной величине максимальное
представимое на данной машине число);
|
IЕRR=-К -
|
если в результате факторизации в К - ой
строке матрицы U диагональный элемент
равен нулю (это свидетельствует о
вырожденности матрицы А). Если таких
строк у матрицы U несколько, то
значение К полагается равным номеру последней из них;
|
IЕRR=67 -
|
если система несовместна (см. замечания по использованию).
|
Версии
ASG9E -
|
решение системы линейных алгебраических
уравнений А*x = b или АT*x = b
методом Гаусса с выбором ведущего элемента по столбцу для
вещественных А и b, заданных с расширенной (Extended) точностью.
|
ASG9C -
|
решение системы линейных алгебраических
уравнений А*x = b или АT*x = b
методом Гаусса с выбором ведущего элемента по столбцу для
комплексных А и b.
|
Вызываемые подпрограммы
AFG5R -
|
подпрограмма треугольной факторизации матрицы А.
|
UTAFSI -
|
подпрограмма выдачи диагностических сообщений.
|
Замечания по использованию
| 1.
|
В подпрограмме АSG9E массивы А и В имеют тип Extended,
для треугольного разложения матрицы А
вызывается подпрограмма АFG5E.
|
| 2.
|
В подпрограмме АSG9С массивы А и В имеют тип
Complex, для треугольного разложения матрицы А
вызывается подпрограмма АFG5С.
|
| 3.
|
На выходе К - ый элемент вектора NLЕАD равен номеру
строки, переставленной на К - ом шаге факторизации с
К - й строкой матрицы А. Так как факторизация Гаусса
требует N - 1 шагов, то NLЕАD (N) = N .
|
| 4.
|
Если задано L ≤ 0, т.е.
система решается повторно,
то треугольная факторизация не выполняется, и
поэтому в качестве матрицы А при обращении к подпрограмме
нужно взять результат предыдущего обращения к АSG9R
или к АFG5R.
|
| 5.
|
Если вырабатывается значение переменной IЕRR,
отличное от нуля, то выдается соответствующее
диагностическое сообщение и, если IЕRR > 0, то происходит
выход из подпрограммы. Если система совместна, но матрица
А вырождена (IЕRR < 0), т.е. для некоторых номеров К
U (К, К) = 0., то полагается
Х (К) = 1.
|
Пример использования
Unit TASG9R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ASG9R_p;
function TASG9R: String;
implementation
function TASG9R: String;
var
M,N,LTR,L,J,I,JI,JJ,II,IERR :Integer;
NLEAD :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 );
B :Array [0..3] of Real = ( 7.0,7.0,7.0,7.0 );
begin
Result := ''; { результат функции }
M := 4;
N := M;
LTR := 0;
L := 0;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A=' + #$0D#$0A]);
for I:=1 to M do
begin
for J:=1 to N do
begin
RЕSult := Result + Format(' %20.16f ',
[A[(I-1)+(J-1)*4]]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' B=' + #$0D#$0A]);
for J:=1 to N do
begIN
Result := Result + Format(' %20.16f ',[B[J-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
ASG9R(A,M,N,NLEAD,B,LTR,L,IERR);
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' NLEAD=' + #$0D#$0A]);
for JI:=1 to N do
begin
Result := Result + Format(' %3d ',[NLEAD[JI-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A=' + #$0D#$0A]);
for II:=1 to M do
begin
for JJ:=1 to N do
begin
Result := Result + Format(' %20.16f ',
[A[(II-1)+(JJ-1)*4]]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%3d ',[IERR]) + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' B=' + #$0D#$0A]);
for J:=1 to N do
begin
Result := Result + Format(' %20.16f ',[B[J-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TASG9R',Result); { вывод результатов в файл TASG9R.res }
exit;
end;
end.
Результат:
| 8.5 -4.8 0.8 3.5 |
| -0.92941 10.06118 4.95647 -10.45294 |
A = | -0.50588 -0.65879 -9.40171 2.40526 |
| -0.37647 -0.04046 -0.73072 12.65817 |
NLEAD = (2, 2, 4, 4)
| 1.023054 |
| 0.273777 |
B = | -0.462957 |
| -0.003275 |