- 积分
- 47
- 注册时间
- 2004-4-28
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2004-9-5 21:44:21
|
显示全部楼层
来自 浙江杭州
回复: 【求助】复系数方程组求解
如果是线性方程组的话,维数小且非奇异的情况下可以直接解或者求逆
维数大的话则是先分块再用迭代算法
这是一个fortran的求逆的例子(from smth)
1。功能:采用全选主元Gauss-Jordan法求复数矩阵的逆矩阵
2。形参说明:
AR,AI---均为双精度实数二纬数组,体积为(N,N),输入兼输出参数
调用时分别存放原复矩阵的实部与虚部;返回逆矩阵的实波与虚部
N : 整形变量,输入参数。矩阵阶数
L:整形变量,输出参数。如L=0,说明矩阵奇异,求逆失败;如L不等于0
说明正常返回。
IS,JS:都为整形一纬数组,长度为N。
SUBROUTINE BCINV(AR,AI,N,L,IS,JS)
DIMENSION AR(N,N),AI(N,N),IS(N),JS(N)
DOUBLE PRECISION AR,AI,D,P,T,Q,S,B
L=1
DO 100 K=1,N
D=0.0
DO 10 I=K,N
DO 10 J=K,N
 =AR(I,J)*AR(I,J)+AI(I,J)*AI(I,J)
IF (P.GT.D) THEN
D=P
IS(K)=I
JS(K)=J
ENDIF
10 CONTINUE
IF (D+1.0.EQ.1.0) THEN
L=0
WRITE(*,20)
RETURN
END IF
20 FORMAT(1X,'ERR**NOT INV')
DO 30 J=1,N
T=AR(K,J)
AR(K,J)=AR(IS(K),J)
AR(IS(K),J)=T
T=AI(K,J)
AI(K,J)=AI(IS(K),J)
AI(IS(K),J)=T
30 CONTINUE
DO 40 I=1,N
T=AR(I,K)
AR(I,K)=AR(I,JS(K))
AR(I,JS(K))=T
T=AI(I,K)
AI(I,K)=AI(I,JS(K))
AI(I,JS(K))=T
40 CONTINUE
AR(K,K)=AR(K,K)/D
AI(K,K)=-AI(K,K)/D
DO 50 J=1,N
IF (J.NE.K) THEN
P=AR(K,J)*AR(K,K)
Q=AI(K,J)*AI(K,K)
S=(AR(K,J)+AI(K,J))*(AR(K,K)+AI(K,K))
AR(K,J)=P-Q
AI(K,J)=S-P-Q
ENDIF
50 CONTINUE
DO 70 I=1,N
IF (I.NE.K) THEN
DO 60 J=1,N
IF (J.NE.K) THEN
P=AR(K,J)*AR(I,K)
Q=AI(K,J)*AI(I,K)
S=(AR(K,J)+AI(K,J))*(AR(I,K)+AI(I,K))
T=P-Q
B=S-P-Q
AR(I,J)=AR(I,J)-T
AI(I,J)=AI(I,J)-B
ENDIF
60 CONTINUE
ENDIF
70 CONTINUE
DO 80 I=1,N
IF (I.NE.K) THEN
P=AR(I,K)*AR(K,K)
Q=AI(I,K)*AI(K,K)
S=(AR(I,K)+AI(I,K))*(AR(K,K)+AI(K,K))
AR(I,K)=Q-P
AI(I,K)=P+Q-S
ENDIF
80 CONTINUE
100 CONTINUE
DO 130 K=N,1,-1
DO 110 J=1,N
T=AR(K,J)
AR(K,J)=AR(JS(K),J)
AR(JS(K),J)=T
T=AI(K,J)
AI(K,J)=AI(JS(K),J)
AI(JS(K),J)=T
110 CONTINUE
DO 120 I=1,N
T=AR(I,K)
AR(I,K)=AR(I,IS(K))
AR(I,IS(K))=T
T=AI(I,K)
AI(I,K)=AI(I,IS(K))
AI(I,IS(K))=T
120 CONTINUE
130 CONTINUE
RETURN
END |
|