! GAUSSIAN ELIMINATION DEMONSTRATION - SIMPLE VERSION
!
PROGRAM P141
IMPLICIT NONE
REAL :: M1(5,6),SOL(5)
INTEGER :: N
INTERFACE
SUBROUTINE MATSIN(M1,N)
IMPLICIT NONE
REAL ,INTENT(IN OUT) :: M1(:,:)
INTEGER ,INTENT(IN OUT) :: N
END SUBROUTINE MATSIN
SUBROUTINE GAUSS(M1,SOL,N)
IMPLICIT NONE
REAL ,INTENT(IN OUT) :: M1(:,:),SOL(:)
INTEGER ,INTENT(IN OUT) :: N
SUBROUTINE PRNMAT(M3,N)
IMPLICIT NONE
REAL ,INTENT(IN OUT) :: M3(:,:)
INTEGER ,INTENT(IN OUT) :: N
END SUBROUTINE PRNMAT
END SUBROUTINE GAUSS
END INTERFACE
!
N=5 ! NUMBER OF EQUATIONS
!
PRINT *,' This is Program P141 - Gaussian elimination'
PRINT *,'PROGRAM IS READING DATA INTO ARRAYS'
CALL MATSIN(M1,N)
PRINT *,'SOLVING SYSTEM OF EQUATIONS'
CALL GAUSS(M1,SOL,N)
PRINT *,'SOLUTION:'
PRINT 90,SOL
90 FORMAT(' | ',F8.3,' |')
STOP
END PROGRAM P141
SUBROUTINE MATSIN(M1,N)
IMPLICIT NONE
REAL ,INTENT(IN OUT) :: M1(:,:)
INTEGER ,INTENT(IN OUT) :: N
INTEGER :: I,J
!
! Tell program where data for READ is coming from
OPEN(UNIT=5, FILE='P141.DAT') ! UNIT=5 is the default input
!
! READ IN M1
! ONE ROW PER CARD
!
L1: DO I=1,N
READ 27,(M1(I,J),J=1,N+1)
END DO L1
27 FORMAT(10(F5.2))
RETURN
END SUBROUTINE MATSIN
!
SUBROUTINE PRNMAT(M3,N)
IMPLICIT NONE
REAL ,INTENT(IN OUT) :: M3(:,:)
INTEGER ,INTENT(IN OUT) :: N
INTEGER :: I,J
!
!
L3: DO I=1,N
PRINT 202, (M3(I,J),J=1,N+1)
END DO L3
202 FORMAT(10(' ',F8.3))
!
RETURN
END SUBROUTINE PRNMAT
!
SUBROUTINE GAUSS(M1,SOL,N)
IMPLICIT NONE
REAL ,INTENT(IN OUT) :: M1(:,:),SOL(:)
INTEGER ,INTENT(IN OUT) :: N
!
! THIS ROUTINE PERFORMS GAUSSIAN ELIMINATION AND BACKSUBSTITUTION.
! WE HAVE SIMPLIFIED THE PROBLEM BY NOT WORRYING ABOUT MATRICES
! WITHOUT A SOLUTION. IF WE WANTED TO CONSIDER THAT CASE, ALL THE
! CODE THAT FOLLOWS WOULD STILL BE VALID, BUT WE WOULD HAVE TO ADD
! MORE TESTS.
!
REAL :: M2(:,:),TEMP
INTEGER :: I,J,K
!
!
! INSTEAD OF MODIFYING THE ORIGINAL ARRAY, WE WILL PRODUCE A WORKING COPY
! OF IT
!
M2 = M1
!
L1: DO I=1,N
!
L2: DO J=I+1,N
TEMP=M2(J,I)/M2(I,I)
L3: DO K=I,N+1
M2(J,K)= M2(J,K) - TEMP*M2(I,K)
END DO L3
END DO L2
END DO L1
!
PRINT *,'TRIANGULARIZED MATRIX'
CALL PRNMAT(M2,5)
!
! MATRIX IS NOW TRIANGULAR. USE BACKSUBSTITUTION TO SOLVE
!
SOL(N)=M2(N,N+1)/M2(N,N)
L4: DO I=N-1,1,-1
TEMP=0.0
L5: DO K=N,I+1,-1
TEMP=TEMP+M2(I,K)*SOL(K)
END DO L5
SOL(I)=(M2(I,N+1) - TEMP)/M2(I,I)
END DO L4
RETURN
END SUBROUTINE GAUSS
DATA :45.3 23.0 63.7 2.1 54.6 3.4 64.6 3.3 75.7 25.3 45.8 74.3 45.7 9.0 2.3 67.2 34.9 23.4 54.2 2.9 25.9 21.3 4.2 9.1 5.8 64.3 91.3 43.4 21.6 43.9OUTPUT :
[FTN90 Version 1.12 Copyright (c)SALFORD SOFTWARE LTD 1992 & ]
[ (c)THE NUMERICAL ALGORITHMS GROUP 1991,1992]
NO ERRORS [FTN90]
Program entered
This is Program P141 - Gaussian elimination
PROGRAM IS READING DATA INTO ARRAYS
SOLVING SYSTEM OF EQUATIONS
TRIANGULARIZED MATRIX
45.300 23.000 63.700 2.150 4.630 0.400
0.000 -29.429 -85.119 2.274 -0.732 3.730
0.000 0.000 -22.873 -3.031 -3.395 -1.801
0.000 0.000 0.000 -3.246 -4.764 -3.653
0.000 0.000 0.000 0.000 -4.271 -0.404
SOLUTION:
| -0.024 |
| 0.138 |
| -0.066 |
| 0.986 |
| 0.094 |
Fortran-90 STOP
Last modified: 25/07/97