LA50
Программа LA50 вычисляет матрицу C
, обратную к матрице A
(C=A-1
). Матрица A
должна быть предварительно преобразована в произведение двух треугольных матриц L
и U
при помощи программы LA10. Программа LA10 должна закончиться без ошибок (Error
=0).
Матрица C
, обратная к матрице A
, находится из уравнения
CLU = E
,
где L
и U
- треугольные матрицы, E
- единичная матрица.
Вычисление матрицы C
проводится в два этапа. На первом этапе вычисляется матрица D
исходя из уравнения DU = E
. Расчетные формулы для вычисления матрицы D
имеют следующий вид dii = 1 / uii
j-1
dij = -( ∑ dikukj) / djj (j = i+1, i+2, ..., N)
k=i
для i
от 1 до N
.
Матрица C
вычисляется на втором этапе исходя из уравнения CL = D
по формулам
N
cij = dij - ∑ ciklkj (i = 1, 2, ..., j)
k=j+1
N
wi = - ∑ ciklkj
k=j+1
cij = wi (i = j+1, j+2, ..., N)
для j
от N-1
до 1.
После завершения вычислений в матрице C
переставляются столбцы согласно массиву T
, который содержит информацию о перестановках строк при работе программы LA10.
Вызов программы
CALL LA50(AF, T)
Параметры программы
AF
- входной и выходной параметр;
T
- входной параметр.
Real AF(1:N, 1:N)
- массив, содержащий элементы треугольных матриц L
и U
. На выходе массив содержит элементы матрицы C
;
Integer T(1:N)
- массив, содержащий информацию о перестановках строк матрицы A
.
Пример
!Обращение матрицы program TestLA50 use ConvertCyr use NML implicit none integer, parameter:: n=4 real:: A(n,n), AF(n,n), D, Z(n,n) integer:: T(n), Er data A/1.0, 1.1, 1.2, 1.4, 1.1, 1.1, 1.2, 1.3, 1.2, 1.2, 1.2, 1.3, 1.4, 1.3, 1.3, 1.3/ integer i, j !begin call LA10(A, AF, T, D, Er) if (Er>0) then print *, WinToDos('Матрица особенная. Программа остановлена.') stop end if call LA50(AF, T) Z=matmul(A,AF) print 10 print 11, ((A(i,j), j=1,n), i=1,n) print 12 print 13, ((Z(i,j), j=1,n), i=1,n) print 14, D 10 format(/' The initial matrix:'/) 11 format(8x,<n>F5.1) 12 format(/' The resulting identity matrix:'/) 13 format(8x,<n>F11.7) 14 format(/' Determinant =',E15.7) end The initial matrix: 1.0 1.1 1.2 1.4 1.1 1.1 1.2 1.3 1.2 1.2 1.2 1.3 1.4 1.3 1.3 1.3 The resulting identity matrix: 0.9999983 0.0000078 0.0000061 -0.0000154 0.0000004 1.0000042 0.0000045 -0.0000080 0.0000004 0.0000042 1.0000045 -0.0000233 -0.0000149 0.0000042 0.0000197 0.9999768 Determinant = -0.9999890E-04
LA52
Программа LA52 предназначена для обращения симметричной матрицы с ненулевыми главными минорами с помщью изменённого метода квадратных корней. Преимущество этого метода состоит в том, что требуется только n рабочих ячеек, не нужно никакой единичной матрицы, не извлекаются никакие квадратные корни, выполняется только n делений. Алгоритм основан на решении уравнения
CLTDL = E
,
где C
- искомая матрица, E
- единичная матрица, LTDL = A
- разложение матрицы A
на верхнюю треугольную L
, транспонированную к ней нижнюю треугольную LT
и диагональную D
. Вычисление матрицы C
производится одновременно с разложением матрицы A
по циклическому алгоритму
ajN = a1,j+1 / a11 (j = 1, 2, ..., N-1)
, aij = ai+1,j+1 - ai+1,1a1,j+1 / a11 (j = i, ..., N-1)
для всех i = 1, ..., N-1
, aNN = -1 / a11
Обратная матрица C
получается после изменения знака у вычисленной матрицы. Элемент a11 и все главные миноры исходной матрицы должны быть отличны от нуля.
Алгоритм 66б из [Б9]
Вызов программы
CALL LA52(A, Error)
Параметры программы
A
- входной и выходной параметр;
Error
- выходной параметр.
Real A(1:N, 1:N)
- массив, содержащий элементы исходной матрицы. На выходе выше главной диагонали и на главной диагонали находятся элементы обратной матрицы. Элементы ниже главной диагонали не используются и остаются без изменений;
Integer Error
- индикатор ошибки. Error
=0, если ошибок нет, и равно 65, если программа завершилась аврийно.
Пример
!Обращение симметричной матрицы program TestLA52 use ConvertCyr use NML implicit none integer, parameter:: n=4 real:: A(n,n), AA(n,n), Z(n,n) integer:: T(n), Er data A/1.0, 1.1, 1.2, 1.4, 1.1, 1.1, 1.2, 1.3, 1.2, 1.2, 1.2, 1.3, 1.4, 1.3, 1.3, 1.3/ integer i, j !begin AA=A call LA52(AA, Er) if (Er>0) then print *, WinToDos('Матрица особенная. Программа остановлена.') stop end if forall(i=2:n, j=1:n-1, i>j) AA(i,j)=AA(j,i) Z=matmul(A,AA) print 10 print 11, ((A(i,j), j=1,n), i=1,n) print 12 print 13, ((Z(i,j), j=1,n), i=1,n) 10 format(/' The initial matrix:'/) 11 format(8x,<n>F5.1) 12 format(/' The resulting identity matrix:'/) 13 format(8x,<n>F11.7) end The initial matrix: 1.0 1.1 1.2 1.4 1.1 1.1 1.2 1.3 1.2 1.2 1.2 1.3 1.4 1.3 1.3 1.3 The resulting identity matrix: 0.9999983 -0.0000074 -0.0000062 -0.0000078 0.0000004 0.9999889 -0.0000047 -0.0000042 0.0000004 -0.0000111 0.9999954 -0.0000042 0.0000004 -0.0000111 -0.0000047 0.9999958
AIG2R
Программа AIG2R обращает матрицу A
методом Жордана с выбором ведущего элемента по всей матрице. Матрица A
должна быть неособенная, иначе программа завершится аварийно.
Исходная матрица A
порядка NxN
приводится к единичной матрице E
при помощи последовательности элементарных преобразований Жордана L1, L2, ... LN
и матрицами перестановок Р
и Q
так, что
LNLN-1 ... L1PAQ = E
при этом А-1 = QLNLN-1 ... L1Р
. Матрицы P
и Q
осуществляют соответственно перестановку строк и столбцов матрицы A
и обеспечивают стратегию выбора ведущего элемента по всей матрице.
http://num-anal.srcc.msu.ru/lib_na/cat/ai/aig2r.htm
Вызов программы
call AIG2R(A, N)
Параметры программы
N
- входной параметр;
A
- входной и выходной параметр;
Real A(1:N, 1:N)
- массив, содержащий исходную матрицу, на выходе из программы содержит обратную матрицу;
Integer N
- размерность матрицы A
.
Пример
!Обращение матрицы методом Жордана с выбором ведущего элемента по всей матрице program Jordan use NML implicit none integer, parameter:: n=4 real A(n,n), AS(n,n), AZ(n,n) data A /7.9, 8.5, 4.3, 3.2, 5.6, -4.8, 4.2, -1.4, & 5.7, .8, -3.2, -8.9, -7.2, 3.5, 9.3, 3.3/ integer i, j ! AS=A call AIG2R (A, n) AZ=matmul(A,AS) ! print 4 print 10, ((AS(i,j), j=1,n), i=1,n) print 5 print 10, ((AZ(i,j), j=1,n), i=1,n) ! 4 format(/4X,'The initial matrix') 5 format(/4X,'The result of multiplying the initial matrix with the inverse') 10 format(/(4X,<n>F10.5)) end program Jordan
The initial matrix 7.90000 5.60000 5.70000 -7.20000 8.50000 -4.80000 0.80000 3.50000 4.30000 4.20000 -3.20000 9.30000 3.20000 -1.40000 -8.90000 3.30000 The result of multiplying the initial matrix with the inverse 1.00000 0.00000 0.00000 -0.00000 0.00000 1.00000 0.00000 -0.00000 0.00000 0.00000 1.00000 0.00000 0.00000 -0.00000 0.00000 1.00000