Это пример кода, который я нашел для вычисления определителя матрицы (nxn), и он отлично работает, и все, но у меня возникают проблемы с пониманием того, что происходит при преобразовании в раздел треугольной формы. Может кто-нибудь объяснить, что происходит в «Преобразовании в верхнюю треугольную часть»?
У меня нет проблем с вычислением детерминанта самостоятельно или выполнением каких-либо преобразований верхней треугольной формы, но я просто не понимаю, как это все переводится здесь, в этой программе.
ii) Что происходит с целыми числами (i, j, k, l)? В частности, что делает k и l? Что происходит внутри конструкции IF? Что касается матрицы A, я знаю, что что-то вроде A (i, j) указывает ее положение в матрице, и это все, что мне когда-либо требовалось для любых матричных программ, с которыми я работал в прошлом.
=============================================== =========================
!Function to find the determinant of a square matrix
!Description: The subroutine is based on two key points:
!1] A determinant is unaltered when row operations are performed: Hence,
using this principle,
!row operations (column operations would work as well) are used
!to convert the matrix into upper traingular form
!2]The determinant of a triangular matrix is obtained by finding the
product of the diagonal elements
REAL FUNCTION FindDet(matrix, n)
IMPLICIT NONE
REAL, DIMENSION(n,n) :: matrix
INTEGER, INTENT(IN) :: n
REAL :: m, temp
INTEGER :: i, j, k, l
LOGICAL :: DetExists = .TRUE.
l = 1
!Convert to upper triangular form
DO k = 1, n-1
IF (matrix(k,k) == 0) THEN
DetExists = .FALSE.
DO i = k+1, n
IF (matrix(i,k) /= 0) THEN
DO j = 1, n
temp = matrix(i,j)
matrix(i,j)= matrix(k,j)
matrix(k,j) = temp
END DO
DetExists = .TRUE.
l=-l
EXIT
ENDIF
END DO
IF (DetExists .EQV. .FALSE.) THEN
FindDet = 0
return
END IF
ENDIF
DO j = k+1, n
m = matrix(j,k)/matrix(k,k)
DO i = k+1, n
matrix(j,i) = matrix(j,i) - m*matrix(k,i)
END DO
END DO
END DO
!Calculate determinant by finding product of diagonal elements
FindDet = l
DO i = 1, n
FindDet = FindDet * matrix(i,i)
END DO
END FUNCTION FindDet