Текст подпрограммы и версий ( Фортран )
ass1r.zip , ass1d.zip
Тексты тестовых примеров ( Фортран )
tass1r.zip , tass1d.zip
Текст подпрограммы и версий ( Си )
ass1r_c.zip , ass1d_c.zip
Тексты тестовых примеров ( Си )
tass1r_c.zip , tass1d_c.zip
Текст подпрограммы и версий ( Паскаль )
ass1r_p.zip , ass1e_p.zip
Тексты тестовых примеров ( Паскаль )
tass1r_p.zip , tass1e_p.zip

Подпрограмма:  ASS1R

Назначение

Решение систем линейных алгебраических уравнений с разреженными матрицами методом сопряженных градиентов.

Математическое описание

ASS1R вычисляет решение системы линейных алгебраических уравнений Ax = b (где  A - квадратная матрица общего вида, в том числе разреженная, порядка  N) с заданной точностью EPS методом сопряженных градиентов, а также сумму квадратов компонент вектора невязки Ax - b .

Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1973.

Использование

    SUBROUTINE  ASS1R (B, N, SUBA, SUBAT, X, RSQ, ITMAX, EPS,
                                            G, H, XI, XJ, IERR) 

Параметры

B - вещественный вектор длины  N, содержащий компоненты вектора правой части системы;
N - порядок матрицы системы (тип: целый);
SUBA - подпрограмма вычисления вектора  Ax, первый оператор которой имеет вид: SUBROUTINE  SUBA (X, AX), где  X - вещественный вектор длины  N, содержащий текущий вектор решения  X;  AX - вещественный вектор длины  N, содержащий результирующий вектор  Ax;
SUBAT - подпрограмма вычисления вектора ATx, первый оператор которой имеет вид: SUBROUTINE  SUBAT (X, ATX), где  X - вещественный вектор длины  N, содержащий текущий вектор решения  X;  ATX - вещественный вектор длины  N, содержащий результирующий вектор ATx;
X - вещественный вектор длины  N, содержащий на входе в подпрограмму начальное приближение к решению системы, а на выходе - вычисленное решение системы;
RSQ - вещественная переменная, содержащая вычисленную сумму квадратов компонент вектора невязки Ax - b;
ITMAX - заданное максимальное допустимое количество итераций метода сопряженных градиентов (тип: целый);
EPS - заданная точность, с которой необходимо вычислить решение системы (тип: вещественный);
        G, H, -
      XI, XJ  
вещественные векторы длины  N, используемые в подпрограмме в качестве рабочих;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом
IERR=65 - когда матрица системы вырождена;
IERR=66 - когда заданная точность не может быть достигнута за максимальное количество итераций.

Версии

ASS1D - решение систем линейных алгебраических уравнений с разреженными матрицами методом сопряженных градиентов в режиме удвоенной точности. При этом параметры B, X, RSQ, EPS, G, H, XI, XJ должны иметь тип DOUBLE PRECISION.

Вызываемые подпрограммы

UTAS10 - подпрограмма выдачи диагностических сообщений при работе подпрограммы ASS1R.
UTAS11 - подпрограмма выдачи диагностических сообщений при работе подпрограммы ASS1D.

Замечания по использованию

 

В качестве начального приближения к решению системы может быть взят нулевой вектор. Все особенности структуры матрицы  A системы должны учитываться в подпрограммах SUBA и SUBAT.

Если значение RSQ велико, то это означает, что матрица системы близка к вырожденной и полученный вектор  x представляет собой наилучшее приближение к решению в смысле наименьших квадратов.

В подпрограммах ASS1R и ASS1D имеется общий блок COMMON /ASS1RR/ ITER. По окончании работы этих подпрограмм значение переменной ITER полагается равной количеству выполненных итераций метода сопряженных градиентов.

Пример использования

       EXTERNAL  SUBA, SUBAT 
       REAL  B(10), X(10), G(10), H(10), XI(10), XJ(10), A(10, 10) 
       COMMON  A 
       COMMON /ASS1RR/ ITER 
       N = 10 
       R = 0.1 
       DO 1  I = 1, N 
       X(I) = 0.0 
       B(I) = 1.0 
       DO 2  J = 1, N 
    2 A(I, J) = 0.0 
       A(I, I) = R 
    1 R = R + 0.1 
       EPS = 1.E - 5 
       ITMAX = 10*N 
       CALL  ASS1R (B, N, SUBA, SUBAT, X, RSQ, ITMAX, EPS, G,
      *                        H, XI, XJ, IERR) 

       SUBROUTINE  SUBA (X, V) 
       COMMON  A(10, 10) 
       REAL  X(10), V(10)
       N = 10 
       DO 1  I = 1, N 
       V(I) = 0.0 
       DO 1  J = 1, N 
    1 V(I) = V(I) + A(I, J)*X(J) 
       RETURN 
       END 

       SUBROUTINE  SUBAT (X, V) 
       COMMON  A(10, 10) 
       REAL  X(10), V(10) 
       N = 10 
       DO 1  I = 1, N 
       V(I) = 0.0 
       DO 1  J = 1, N 
    1 V(I) = V(I) + A(J, I)*X(J) 
       RETURN 
       END 

Результаты: 

      X  =  ( 10 , 5 , 10/3 , 2.5 , 2 , 5/3 , 10/7 , 1.25 , 10/9 , 1 )

      RSQ  = 0.19785E - 8 
      ITER = 11