|
Текст подпрограммы и версий ass1r_p.zip , ass1e_p.zip |
Тексты тестовых примеров tass1r_p.zip , tass1e_p.zip |
Решение систем линейных алгебраических уравнений с разреженными матрицами методом сопряженных градиентов.
ASS1R вычисляет решение системы линейных алгебраических уравнений Ax = b (где A - квадратная матрица общего вида, в том числе разреженная, порядка N) с заданной точностью EPS методом сопряженных градиентов, а также сумму квадратов компонент вектора невязки Ax - b .
Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1973.
procedure ASS1R(var B :Array of Real; N :Integer; SUBA :Proc_FA;
SUBAT :Proc_FA; var X :Array of Real; var RSQ :Real;
ITMAX :Integer; EPS :Real; var G :Array of Real;
var H :Array of Real; var XI :Array of Real;
var XJ :Array of Real; var IERR :Integer);
Параметры
| B - | вещественный вектор длины N, содержащий компоненты вектора правой части системы; |
| N - | порядок матрицы системы (тип: целый); |
| SUBA - |
подпрограмма вычисления вектора Ax, первый оператор
которой имеет вид: procedure SUBA (var X :Array of Real; var AX :Array of Real); где X - вещественный вектор длины N, содержащий текущий вектор решения X; AX - вещественный вектор длины N, содержащий результирующий вектор Ax; |
| SUBAT - |
подпрограмма вычисления вектора ATx, первый оператор
которой имеет вид: procedure SUBAT (var X :Array of Real; var ATX :Array of Real); где X - вещественный вектор длины N, содержащий текущий вектор решения X; ATX - вещественный вектор длины N, содержащий результирующий вектор ATx; |
| X - | вещественный вектор длины N, содержащий на входе в подпрограмму начальное приближение к решению системы, а на выходе - вычисленное решение системы; |
| RSQ - | вещественная переменная, содержащая вычисленную сумму квадратов компонент вектора невязки Ax - b; |
| ITMAX - | заданное максимальное допустимое количество итераций метода сопряженных градиентов (тип: целый); |
| EPS - | заданная точность, с которой необходимо вычислить решение системы (тип: вещественный); |
|
G, H, - XI, XJ | вещественные векторы длины N, используемые в подпрограмме в качестве рабочих; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом |
| IERR=65 - | когда матрица системы вырождена; |
| IERR=66 - | когда заданная точность не может быть достигнута за максимальное количество итераций. |
Версии
| ASS1E - | решение систем линейных алгебраических уравнений с разреженными матрицами методом сопряженных градиентов в режиме расширенной (Extended) точности. При этом параметры B, X, RSQ, EPS, G, H, XI, XJ должны иметь тип Extended. |
Вызываемые подпрограммы
| UTAS10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ASS1R. |
| UTAS11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ASS1D. |
Замечания по использованию
|
В качестве начального приближения к решению системы может быть взят нулевой вектор. Все особенности структуры матрицы A системы должны учитываться в подпрограммах SUBA и SUBAT. Если значение RSQ велико, то это означает, что матрица системы близка к вырожденной и полученный вектор x представляет собой наилучшее приближение к решению в смысле наименьших квадратов. В подпрограммах ASS1R и ASS1E имеется глобальная запись (структура данных) с именем _ASS1RR и элементом ITER. По окончании работы этих подпрограмм значение переменной ITER полагается равной количеству выполненных итераций метода сопряженных градиентов. |
Unit TASS1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, F1ASS1R_p, F2ASS1R_p, ASS1R_p;
function TASS1R: String;
implementation
function TASS1R: String;
var
N,I,J,ITMAX,_i,IERR :Integer;
R,EPS,RSQ :Real;
B :Array [0..9] of Real;
X :Array [0..9] of Real;
G :Array [0..9] of Real;
H :Array [0..9] of Real;
XI :Array [0..9] of Real;
XJ :Array [0..9] of Real;
label
_1,_2,_3;
begin
Result := ''; { результат функции }
N := 10;
for I:=1 to N do
begin
X[I-1] := 0.0;
_1:
B[I-1] := 1.0;
end;
R := 0.1;
for I:=1 to N do
begin
for J:=1 to N do
begin
_2:
_ASR.elm1[(I-1),(J-1)] := 0.0;
end;
end;
for I:=1 to N do
begin
_ASR.elm1[(I-1),(I-1)] := R;
_3:
R := R+0.1;
end;
EPS := 1.E-5;
IТМАХ := 10*N;
ASS1R(B,N,F1ASS1R,F2ASS1R,X,RSQ,ITMAX,EPS,
G,H,XI,XJ,IERR);
Result := Result + #$0D#$0A;
for _i:=0 to 9 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 + Format('%20.16f ',[RSQ]) + #$0D#$0A;
Result := Result + Format('%5d ',[_ASS1RR.elm1]) + #$0D#$0A;
UtRes('TASS1R',Result); { вывод результатов в файл TASS1R.res }
exit;
end;
end.
Unit f1ass1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure f1ass1r(var X :Array of Real; var V :Array of Real);
implementation
procedure f1ass1r(var X :Array of Real; var V :Array of Real);
var
N,I,J :Integer;
label
_1;
begin
N := 10;
for I:=1 to N do
begin
V[I-1] := 0.0;
for J:=1 to N do
begin
_1:
V[I-1] := V[I-1]+_ASR.elm1[(I-1),(J-1)]*X[J-1];
end;
end;
end;
end.
Unit f2ass1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure f2ass1r(var X :Array of Real; var V :Array of Real);
implementation
procedure f2ass1r(var X :Array of Real; var V :Array of Real);
var
N,I,J :Integer;
label
_1;
begin
N := 10;
for I:=1 to N do
begin
V[I-1] := 0.0;
for J:=1 to N do
begin
_1:
V[I-1] := V[I-1]+_ASR.elm1[(J-1),(I-1)]*X[J-1];
end;
end;
end;
end.
Результаты:
X = ( 10 , 5 , 10/3 , 2.5 , 2 , 5/3 , 10/7 , 1.25 , 10/9 , 1 )
RSQ = 0.19785E - 8
ITER = 11