|
Текст подпрограммы и версий ast2r_p.zip , ast2e_p.zip , ast2c_p.zip |
Тексты тестовых примеров tast2r_p.zip , tast2e_p.zip , tast2c_p.zip |
Решение вещественной системы линейных алгебраических уравнений AX = b с трехдиагональной матрицей A.
Для заданной в компактной форме вещественной трехдиагональной матрицы А порядка N выполняется треугольная факторизация Гаусса L- 1А = U, где U - верхняя треугольная ленточная матрица, и затем решается система Ux = L- 1b.
Дж.Форсайт, М.Малькольм, К.Моулер. Машинные методы математических вычислений. М.: Мир, 1980.
procedure AST2R(var A :Array of Real; M :Integer; N :Integer;
var B :Array of Real; var IERR :Integer);
Параметры
| A - | вещественный двумерный массив размера М на 3, в котором задается в компактном виде исходная трехдиагональная матрица порядка N; на выходе содержит в компактном виде верхнюю треугольную ленточную матрицу U; |
| M - | первая размерность массива А в вызывающей программе (тип: целый); |
| N - | порядок матрицы А (тип: целый); |
| B - | вещественный вектор длины N, в котором задается правая часть системы; на выходе содержит вычисленное решение системы (см. замечания по использованию); |
| IERR - | целая переменная, содержащая на выходе информацию о прохождении счета, при этом: |
| IЕRR=65 - | если М ≤ 0 или N ≤ 0; |
| IЕRR=66 - | если в процессе работы произошло переполнение (это говорит о том, что некоторые элементы матрицы U, либо некоторые компоненты решения системы превосходят по абсолютной величине максимальное представимое на данной машине число); |
| IЕRR=-К - | если в результате факторизации в К - ой строке матрицы U диагональный элемент равен нулю (это свидетельствует о вырожденности матрицы А); если таких строк у матрицы U несколько, то значение К полагается равным номеру последней из них (см. замечания по использованию); |
| IЕRR=67 - | если система несовместна. |
Версии
| AST2E - | решение системы линейных алгебраических уравнений Аx = b с трехдиагональной матрицей А, заданной в компактной форме, для вещественных А и b, заданных с расширенной (Extended) точностью. |
| AST2C - | решение системы линейных алгебраических уравнений Аx = b с трехдиагональной матрицей А, заданной в компактной форме, для комплексных А и b. |
Вызываемые подпрограммы
| UTAFSI - | подпрограмма выдачи диагностических сообщений. |
Замечания по использованию
| 1. |
В подпрограмме АSТ2E массивы А и В имеют тип Extended. | |
| 2. |
В подпрограмме АSТ2С массивы А и В имеют тип Complex. | |
| 3. | Если вырабатывается значение переменной IЕRR, отличное от нуля, то выдается соответствующее диагностическое сообщение, и если IЕRR > 0, то происходит выход из подпрограммы. Если система совместна, но матрица А вырождена, т.е. для некоторых номеров К существуют U (К, К) = 0., то полагается В (К) = 1. |
Unit TAST2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, AST2R_p;
function TAST2R: String;
implementation
function TAST2R: String;
var
M,N,I,J0,J1,J,K,IERR :Integer;
A :Array [0..14] of Real;
B :Array [0..4] of Real;
Z :Array [0..4] of Real;
label
_3,_4,_5,_6;
begin
Result := ''; { результат функции }
M := 5;
N := 5;
for I:=1 to 15 do
A[I-1] := 0.0;
for I:=1 to M do
begin
Z[I-1] := (I);
J0 := Max0(1,I-1);
J1 := Min0(N,I+1);
for J:=J0 to J1 do
begin
K := J-I+2;
A[(I-1)+(K-1)*5] := (I*10+J);
_3:
end;
_4:
end;
A[0] := 0.0;
A[14] := 0.0;
for I:=1 to M do
begin
B[I-1] := 0.0;
for K:=1 to 3 do
begin
J := K+I-2;
B[I-1] := B[I-1]+A[(I-1)+(K-1)*5]*Z[J-1];
_5:
end;
_6:
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' A=' + #$0D#$0A]);
for I:=1 to M do
begin
for J:=1 to 3 do
begin
Result := Result + Format(' %20.16f ',
[A[(I-1)+(J-1)*5]]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' ТОЧНОЕ PEШEHИE' + #$0D#$0A]);
for J:=1 to N do
begin
Result := Result + Format(' %20.16f ',[Z[J-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' ПРАВАЯ ЧACTЬ' + #$0D#$0A]);
for J:=1 to N do
begin
Result := Result + Format(' %20.16f ',[B[J-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
AST2R(A,M,N,B,IERR);
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' PEЗYЛЬTAT' + #$0D#$0A]);
for J:=1 to N do
begin
Result := Result + Format(' %20.16f ',[B[J-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%3d ',[IERR]) + #$0D#$0A;
UtRes('TAST2R',Result); { вывод результатов в файл TAST2R.res }
exit;
end;
end.
Результат:
B = ( 1., 2., 3., 4., 5. )