回 帖 发 新 帖 刷新版面

主题:向大家求助一个问题

想编一个解一元三次方程的盛金公式,出现错误:unterminated block exists,问题在第49行 IF (del.LT.0.0) THEN这一句,因为刚接触fortran实在是不知道怎么办了,麻烦各位看看,在您看来可能是很低级的错误,不过我真的搞不定了,在此谢过!
   
PROGRAM JIEFANGCHENG    DIMENSION EE(4),XR(3),XI(3)
      DATA EE/1.0,1.0,-1.0,-1.0/  !EE为方程系数,这里用了一个简单的数据     
      CALL DSRRT(EE,XR,XI)    !调用下面的子程序,XR为实部,XI为虚步
      DO 1 I=1,3
 1    WRITE(*,2) XR(I),XI(I)
 2    FORMAT(1X,'X(',I2,1X,')=',E13.6,2X,'J',2X,E13.6)
      END
15 SUBROUTINE DSRRT(EE,XR,XI)  !具体计算,分四个情况,因为是解析解,可直接写出解
 DIMENSION EE(4),XR(3),XI(3)
 REAL(kind=8) A,B,C,del,Y1,Y2,K,T,sit
 A=EE(2)**2-3*EE(1)*EE(3)
 B=EE(2)*EE(3)-9*EE(1)*EE(4)
 C=EE(3)**2
 del=B**2-4*A*C    !以上几个是用来简化判别式及解的表达式的参数 
 IF ((A.EQ.0.0).AND.(B.EQ.0.0)) THEN !第一种情况
 XR(1)=-EE(3)/EE(2)
 XR(2)=-EE(2)/(3*EE(1))
 XR(3)=-3*EE(4)/EE(3)
 XI(1)=0
 XI(2)=0
 XI(3)=0
 END IF
30 IF (del.GT.0.0) THEN  !第二种情况
 Y1=A*EE(2)+3.0*EE(1)*(-B+(B**2.0-4.0*A*C)**(1.0/2.0))/2.0
 Y2=A*EE(2)+3.0*EE(1)*(-B-(B**2.0-4.0*A*C)**(1.0/2.0))/2.0
 XR(1)=(-EE(2)-(Y1)**(1.0/3.0)-(Y2)**(1.0/3.0))/(3.0*EE(1))
 XR(2)=(-2*EE(2)+(Y1)**(1.0/3.0)+(Y2)**(1.0/3.0))/(6.0*EE(1))
 XR(3)=(-2*EE(2)+(Y1)**(1.0/3.0)+(Y2)**(1.0/3.0))/(6.0*EE(1))
 XI(1)=0.0
 XI(2)=3.0**(1.0/2.0)*((Y1)**(1.0/3.0)-(Y2)**(1.0/3.0))/(6.0*EE(1))
 XI(3)=-3.0**(1.0/2.0)*((Y1)**(1.0/3.0)-(Y2)**(1.0/3.0))/(6.0*EE(1))
 END IF
 IF ((del.EQ.0.0).AND.(A.NE.0.0)) THEN   !第三种情况
 K=B/A
 XR(1)=-EE(2)/EE(1)+K
 XR(2)=-K/2
 XR(3)=-K/2
 XI(1)=0.0
 XI(2)=0.0
 XI(3)=0.0
 END IF
 IF (del.LT.0.0) THEN   !第四种情况
50 T=(2*A*EE(2)-3.0*EE(1)*B)/(2.0*A**(3.0/2.0))
 sit=ACOS(T)
 XR(1)=(-EE(2)-2.0*A**(1.0/2.0)*COS(sit/3.0))/(3.0*EE(1))
 XR(2)=(-EE(2)+A**(1.0/2.0)*(COS(sit/3.0)+&
 3.0**(1.0/2.0)*SIN(sit/3.0)))/(3.0*EE(1))
 XR(3)=(-EE(2)+A**(1.0/2.0)*(COS(sit/3.0)-&
 3.0**(1.0/2.0)*SIN(sit/3.0)))/(3.0*EE(1))
 XI(1)=0.0
 XI(2)=0.0
 XI(3)=0.0
 END

回复列表 (共3个回复)

沙发

好像写得if比较不整齐吧。我的建议是一层一层来,别分成好几个。

板凳


第四行的   DO 1 I=1,3  忘了写enddo[em1]

3 楼

已解决,谢谢楼上两位

我来回复

您尚未登录,请登录后再回复。点此登录或注册