回 帖 发 新 帖 刷新版面

主题:方程求解遇到的问题

 

方程如下:

算法用的是徐士良的《Fortran常用算法程序集》中的二分法。

SUBROUTINE DDHRT(A,B,H,EPS,X,N,M,F)

DIMENSION X(N)
M=0
Z=A
Y=F(Z)

Y=F(Z)
GOTO 10
END IF
Z1=Z+H
Y1=F(Z1)
IF (ABS(Y1).LT.EPS) THEN
M=M+1
X(M)=Z1
Z=Z1+H/2.0
Y=F(Z)
GOTO 10
END IF
IF (Y*Y1.GT.0.0) THEN
Y=Y1
Z=Z1
GOTO 10
END IF
20 IF (ABS(Z1-Z).LT.EPS) THEN
M=M+1
X(M)=(Z1+Z)/2.0
Z=Z1+H/2.0
Y=F(Z)
GOTO 10
END IF
Z0=(Z1+Z)/2.0
Y0=F(Z0)
IF (ABS(Y0).LT.EPS) THEN
M=M+1
X(M)=Z0
Z=Z0+H/2.0
Y=F(Z)
GOTO 10
END IF
IF (Y*Y0.LT.0.0) THEN
Z1=Z0
Y1=Y0
ELSE
Z=Z0
Y=Y0
END IF
GOTO 20
END
c=========================

DIMENSION X(3)
EXTERNAL F
CALL DDHRT(0.0,1.0,0.01,1.0e-06,X,3,M,F)
WRITE(*,10) M
10 FORMAT(1X,'M=',I2)
DO 20 I=1,M
20 WRITE(*,30) I,X(I)
30 FORMAT(1X,'X(',I2,')=',E25.6)
END
FUNCTION F(X)
F=-2500/(1+x)-2500/(1+x)**2+830/(1+x)**3+1800/(1+x)**4+1600/(1+x)
$**5+1900*((1+x)**4-1)/(x*(1+x)**4*(1+x)**5)+3840/(1+x)**10
RETURN
END

编译可以通过,但是运行时出现“浮点错误”。

回复列表 (共1个回复)

沙发

运行了一下没有报错,VS2010 + IVF XE 2011。
有没有具体的指向那一行有浮点运算错误?
看了一下那个F(x) function,公式里都是 2500/(1+x)... 因为是浮点运算,最好不要写整数,改成2500.0/(1.0+x)使公式里的变量的类型尽量保持一致。可能是导致错误的原因。

我来回复

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