⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test1402.f90

📁 这个程序是对高斯消去法求解线性方程组的fortran源代码
💻 F90
字号:
SUBROUTINE Gauss_Expunction(A, B, X, N)
  IMPLICIT NONE
! 变量定义
  INTEGER :: N
  REAL :: A(N,N), B(N)
  REAL :: X(N)
  INTEGER :: I, J
  REAL :: C
  LOGICAL, EXTERNAL :: Check_Root

  ! 消元步
  DO J = 1, N-1
    IF(.NOT. Check_Root(A, J, N)) THEN
      PRINT *, '方程组无解或无唯一解'
      STOP '程序停止于函数Check_Root'
    ENDIF
    CALL Transfer_Max(A, B, J, N)
    DO I = J+1, N
      C = A(I, J)/A(J, J)
      B(I) = B(I) - B(J)*C
      A(I, J:N) = A(I, J:N) - A(J, J:N)*C
    ENDDO
  ENDDO
  ! 回代步
  X(N) = B(N)/A(N, N)
  DO I = N-1, 1, -1
    C = 0.0
    DO J = I+1, N
      C = C + A(I, J)*X(J)
    ENDDO
    X(I) = (B(I) - C)/A(I, I)
  ENDDO

END SUBROUTINE Gauss_Expunction

LOGICAL FUNCTION Check_Root(A, J, N)
  IMPLICIT NONE
! 变量定义
  INTEGER :: N
  REAL :: A(N,N)
  INTEGER :: J
  INTEGER :: I
 数据处理
  DO I = J, N
    IF(A(I, J) /= 0.0) THEN
      Check_Root = .TRUE.
      RETURN
    ENDIF
  ENDDO
  Check_Root = .FALSE.
  RETURN

END FUNCTION Check_Root

SUBROUTINE Transfer_Max(A, B, J, N)
  IMPLICIT NONE
! 变量定义
  INTEGER :: N
  REAL :: A(N,N)
  REAL :: B(N)
  INTEGER :: J
  INTEGER :: I, K 
! 数据处理
  K = J
  DO I = J, N
    IF(ABS(A(I, J)) > ABS(A(J, J))) K = I
  ENDDO
  IF(K == J) RETURN
  CALL Swap_Element(B(J), B(K))
  DO I = J, N
    CALL Swap_Element(A(J, I), A(K, I))
  ENDDO

CONTAINS
! 元素扫描子程序
  SUBROUTINE Swap_Element(A, B)
    IMPLICIT NONE

    REAL :: A, B
    REAL :: C

    C = A
    A = B
    B = C

  END SUBROUTINE Swap_Element

END SUBROUTINE Transfer_Max

! 高斯消去法的范例
PROGRAM TEST1402
  IMPLICIT NONE
! 变量定义
  REAL, ALLOCATABLE :: A(:,:), B(:), X(:)
  INTEGER :: N, I, J, Err
! 屏幕提示并分配存储空间
  WRITE(*, '(1X,A)')'请输入方程组中的方程个数:'
  READ(*, *)N
  ALLOCATE(A(N,N), STAT=Err)
  IF(0 /= Err) STOP '动态分配方程组系数矩阵失败!'
  ALLOCATE(B(N), STAT=Err)
  IF(0 /= Err) STOP '动态分配方程组结果数组失败!'
  ALLOCATE(X(N), STAT=Err)
  IF(0 /= Err) STOP '动态分配方程组变量数组失败!'
! 屏幕提示
  WRITE(*, '(1X,A,I3,A,I3,A)')'请输入',N,'X',N,'个方程组系数:'
  DO I = 1, N
    READ(*, *)(A(I, J), J = 1, N)
  ENDDO
  WRITE(*, '(1X,A,I3,A,I3,A)')'请输入',N,'个方程组的值:'
  READ(*, *)(B(I), I = 1, N)
! 高斯消去法求解
  CALL Gauss_Expunction(A, B, X, N)

  WRITE(*, '(1X,A)')'方程组的解如下:'
  WRITE(*, '(1X,"X(",I2,") = ", F10.6)')(I, X(I), I=1,N)

END PROGRAM TEST1402

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -