Fortran Coder

查看: 6814|回复: 4
打印 上一主题 下一主题

[读物] 徐士良老师书中程序,遇到问题

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
28 点
跳转到指定楼层
楼主
发表于 2020-12-23 15:28:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
        SUBROUTINE CHHBG(A,N)
        DIMENSION A(N,N)
        DOUBLE PRECISION A,D,T
        DO 100 K=2,N-1
          D=0.0
          DO 10 J=K,N
            IF (ABS(A(J,K-1)).GT.ABS(D)) THEN
              D=A(J,K-1)
              I=J
            END IF
10          CONTINUE
          IF (ABS(D)+1.0.NE.1.0) THEN
            IF (I.NE.K) THEN
              DO 20 J=K-1,N
              T=A(I,J)
              A(I,J)=A(K,J)
20              A(K,J)=T
              DO 30 J=1,N
              T=A(J,I)
              A(J,I)=A(J,K)
30              A(J,K)=T
            END IF
            DO 90 I=K+1,N
              T=A(I,K-1)/D
              A(I,K-1)=0.0
              DO 40 J=K,N
40              A(I,J)=A(I,J)-T*A(K,J)
              DO 50 J=1,N
50              A(J,K)=A(J,K)+T*A(J,I)
90            CONTINUE
          END IF
100        CONTINUE
        RETURN
        END

      SUBROUTINE CHHQR(A,N,U,V,EPS,JT)
        DIMENSION A(N,N),U(N),V(N)
        DOUBLE PRECISION A,U,V,W,B,C,X,Y,XY,P,Q,R,E,F,Z,G
        JT=1
        M=N
        IT=0
10        IF (M.EQ.0) RETURN
        L=M+1
40        L=L-1
        IF (ABS(A(L,L-1)).GT.EPS*(ABS(A(L-1,L-1))+ABS(A(L,L))).AND.
     *      L.GT.1) GOTO 40
        IF (L.EQ.M) THEN
          U(M)=A(M,M)
          V(M)=0.0
          M=M-1
          IT=0
          GOTO 10
        END IF
        IF (L.EQ.M-1) THEN
          B=-(A(M,M)+A(M-1,M-1))
          C=A(M,M)*A(M-1,M-1)-A(M,M-1)*A(M-1,M)
          W=B*B-4*C
          Y=SQRT(ABS(W))
          IF (W.GT.0.0) THEN
            XY=1.0
            IF (B.LT.0.0) XY=-1.0
            U(M)=(-B-XY*Y)/2.0
            U(M-1)=C/U(M)
            V(M)=0.0
            V(M-1)=0.0
          ELSE
            U(M)=-B/2.0
            U(M-1)=U(M)
            V(M)=Y/2.0
            V(M-1)=-V(M)
          END IF
          M=M-2
          IT=0
          GOTO 10
        END IF
        IF (IT.GE.60) THEN
          WRITE(*,50)
50          FORMAT(1X,  'FAIL')
          JT=0
          RETURN
        END IF
        IT=IT+1
        DO 60 J=L+2,M
60        A(J,J-2)=0.0
        DO 70 J=L+3,M
70        A(J,J-3)=0.0
        DO 150 K=L,M-1
          IF (K.NE.L) THEN
            P=A(K,K-1)
            Q=A(K+1,K-1)
            R=0.0
            IF (K.NE.M-1) R=A(K+2,K-1)
          ELSE
            X=A(M,M)+A(M-1,M-1)
            Y=A(M-1,M-1)*A(M,M)-A(M-1,M)*A(M,M-1)
            P=A(L,L)*(A(L,L)-X)+A(L,L+1)*A(L+1,L)+Y
            Q=A(L+1,L)*(A(L,L)+A(L+1,L+1)-X)
            R=A(L+1,L)*A(L+2,L+1)
          END IF
          IF (ABS(P)+ABS(Q)+ABS(R).NE.0.0) THEN
            XY=1.0
            IF (P.LT.0.0) XY=-1.0
            S=XY*SQRT(P*P+Q*Q+R*R)
            IF (K.NE.L) A(K,K-1)=-S
            E=-Q/S
            F=-R/S
            X=-P/S
            Y=-X-F*R/(P+S)
            G=E*R/(P+S)
            Z=-X-E*Q/(P+S)
            DO 110 J=K,M
              P=X*A(K,J)+E*A(K+1,J)
              Q=E*A(K,J)+Y*A(K+1,J)
              R=F*A(K,J)+G*A(K+1,J)
              IF (K.NE.M-1) THEN
                P=P+F*A(K+2,J)
                Q=Q+G*A(K+2,J)
                R=R+Z*A(K+2,J)
                A(K+2,J)=R
              END IF
              A(K+1,J)=Q
              A(K,J)=P
110            CONTINUE
            J=K+3
            IF (J.GE.M) J=M
            DO 120 I=L,J
              P=X*A(I,K)+E*A(I,K+1)
              Q=E*A(I,K)+Y*A(I,K+1)
              R=F*A(I,K)+G*A(I,K+1)
              IF (K.NE.M-1) THEN
                P=P+F*A(I,K+2)
                Q=Q+G*A(I,K+2)
                R=R+Z*A(I,K+2)
                A(I,K+2)=R
              END IF
              A(I,K+1)=Q
              A(I,K)=P
120            CONTINUE
          END IF
150        CONTINUE
        GOTO 10
        END

      DIMENSION A(5,5),U(5),V(5)
        DOUBLE PRECISION A,U,V
        DATA A/1.0,8.0,-2.0,-13.0,17.0,6.0,-15.0,11.0,2.0,
     *         22.0,-3.0,18.0,9.0,21.0,-5.0,-1.0,5.0,15.0,
     *         30.0,3.0,7.0,4.0,20.0,-6.0,6.0/
        CALL CHHBG(A,5)
        WRITE(*,10) ((A(I,J),J=1,5),I=1,5)
10        FORMAT(1X,5D15.6)
        EPS=1.0E-06
        CALL CHHQR(A,5,U,V,EPS,JT)
        IF (JT.NE.0) THEN
          DO 20 I=1,5
            WRITE(*,30) U(I),V(I)
20          CONTINUE
        END IF
30        FORMAT(1X,D15.6,2X,'+J',1X,D15.6)
        END
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

沙发
发表于 2020-12-23 16:09:07 | 只看该作者
什么问题?
回复

使用道具 举报

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
28 点
板凳
 楼主| 发表于 2020-12-23 16:36:25 | 只看该作者

您好,程序会报错,是数组越界的问题

54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

QQ
地板
发表于 2020-12-23 22:05:29 | 只看该作者
第45,46 行
        IF (ABS(A(L,L-1)).GT.EPS*(ABS(A(L-1,L-1))+ABS(A(L,L))).AND.
     *      L.GT.1) GOTO 40

替换为

  if( l > 1 ) then
          IF (ABS(A(L,L-1))>EPS*(ABS(A(L-1,L-1))+ABS(A(L,L)))) GOTO 40
  end if

评分

参与人数 1F 币 +4 收起 理由
kyra + 4 赞一个!

查看全部评分

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
28 点
5#
 楼主| 发表于 2020-12-31 15:51:51 | 只看该作者
布衣龙共 发表于 2020-12-23 22:05
第45,46 行
        IF (ABS(A(L,L-1)).GT.EPS*(ABS(A(L-1,L-1))+ABS(A(L,L))).AND.
     *      L.GT.1)  ...

谢谢你
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-26 09:15

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表