主题:向大家求助一个问题
想编一个解一元三次方程的盛金公式,出现错误: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
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