马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
<PRE> PROGRAM MAIN
implicit none
DOUBLE PRECISION P(50,50),Q(50)
INTEGER W,NMAX,II,JJ
CHARACTER*12 NAMEI,NAMEO
PARAMETER(NMAX=50)
* NMAX:本程序定义的最大维数
* W:计算方程的维数
* P,Q:方程的系数矩阵与右端矩阵
*
WRITE(*,*)'----高斯列主元素消去法解线形方程组----'
WRITE(*,*)'输入方程的维数<=50:'
READ(*,*) W
WRITE(*,*)'输入存放增广矩阵的文件名:'
READ(*,*) NAMEI
OPEN(6,FILE=NAMEI)
NAMEO='Result.txt'
DO II=1,W
READ(6,*) (P(II,JJ),JJ=1,W),Q(II)
END DO
CLOSE(6)
CALL GAUSS(P,W,Q,NMAX)
* 显示并存储结果,解为Q(I)
OPEN(8,FILE=NAMEO)
WRITE(*,*)'------------------'
DO II=1,W
WRITE(*,1000) II,Q(II)
WRITE(8,1000) II,Q(II)
END DO
CLOSE(8)
WRITE(*,*)'------------------'
WRITE(*,*)'以上结果保存在Result.txt中'
1000 FORMAT('X',I2,'=',F15.5)
END
* ------------以下为线性方程组的高斯消去解法-------------
SUBROUTINE GAUSS(A,N,B,NUM)
DOUBLE PRECISION A(NUM,N),B(NUM),M(N,NUM),MAX,TEMP
INTEGER I,J,N,IMAX,K
* 选列主元,即列中绝对值最大者
DO 99 K=1,N-1
MAX=ABS(A(K,K))
IMAX=K
DO I=K+1,N
IF(ABS(A(I,K)).GT.MAX) THEN
IMAX=I
MAX=ABS(A(I,K))
ENDIF
END DO
* 交换行元素,M(N,N)为临时变量
DO J=1,N
M(K,J)=A(K,J)
A(K,J)=A(IMAX,J)
A(IMAX,J)=M(K,J)
TEMP=B(K)
B(K)=B(IMAX)
B(IMAX)=TEMP
ENDDO
* 消去,M(N,N)存放消去时所用的因子
DO I=K+1,N
M(I,K)=A(I,K)/A(K,K)
DO J=K+1,N
A(I,J)=A(I,J)-M(I,K)*A(K,J)
END DO
B(I)=B(I)-M(I,K)*B(K)
END DO
* 回代,利用B(N)存放解
99 CONTINUE
B(N)=B(N)/A(N,N)
DO K=N-1,1,-1
TEMP=0.0
DO J=K+1,N
TEMP=TEMP+A(K,J)*B(J)
END DO
B(K)=(B(K)-TEMP)/A(K,K)
END DO
END SUBROUTINE</PRE> |