使用 Fortran 进行高斯消除

计算科学 线性代数 正则
2021-12-16 18:43:19

我开发了下面的代码来执行高斯消除,以评估矩阵的行列式:

program det3


REAL, DIMENSION(3,3) :: matriz = RESHAPE([1,2,3,-7,13,5,4,-21,8],[3,3])
REAL :: temp, m
INTEGER :: n = 3
INTEGER :: i, j, k
INTEGER :: fator_cor = 1
REAL :: det

DO k=1, n-1

    DO i = k+1, n

                IF (matriz(k,k) == 0) THEN
                    linha_aux = matriz(k,0:n)
                    matriz(k,0:n)= matriz(k+1, 0:n)
                    matriz(k+1,0:n)= linha_aux
                    fator_cor = fator_cor*(-1)



                END IF

    END DO


END DO


    DO j = k+1, n
            m = matriz(j,k)/matriz(k,k)

            DO i = k+1, n
                matriz(j,i) = matriz(j,i) - m*matriz(k,i)



            END DO



    END DO




det = l
    DO i = 1, n
        det = det * matriz(i,i)
        det = det*fator_cor
    END DO

WRITE (*,*) det







end program

我正在尝试将其应用于开头声明的 3x3 矩阵,但出现错误:

“错误:在 (1) 处的分配中不兼容的 0 和 1 等级”linha_aux = matriz(k,0:n)”

我对fortran有点陌生,所以我不确定它指的是什么。我不确定是否应该声明 linha_aux ,如果是的话,是否应该将其声明为可分配数组。任何帮助是极大的赞赏。

1个回答

一些(有点渴望评论)初步评论:

您尝试将数组分配给matriz(k,0:n)标量整数变量linha_auxlinha_aux是一个标量整数变量,因为它是隐式声明的。

  • 声明所有变量
  • 使用 IMPLICIT NONE 所以你必须声明所有变量
  • Fortran 从 1 开始计算元素,所以matriz(k,0:n)有一个问题,n声明为 3,矩阵的大小为 3 乘以 3。
  • 嵌套循环:

    DO k=1, n-1
    
       DO i = k+1, n 
    

    因为循环的内容不使用i并且在matriz(k+1,0:n)矩阵中也会超出第一个索引的范围(而第二个索引由于 0)。

  • 请注意,Fortran 具有列主要顺序(因此第一个索引运行速度很快),这种顺序不同于例如具有行主要顺序的 C。