回 帖 发 新 帖 刷新版面

主题:二重积分结果不对

各位好,我用变步长sipson子例行程序计算一个二重积分,结果总是不对。如果换别的被积函数,算出的结果没问题。说明这个二重积分的子程序时没错的。但是我就是找不到问题出在哪里。请大家帮忙看看好吗?下面是代码:
    PROGRAM MAIN
    COMMON /AB1/A
    COMMON/AB2/B
    COMMON/R/R
    PARAMETER(MAXR=120)
    REAL ::RESULT1
    EXTERNAL RT
    PARAMETER(THETA=0.523599)
    PARAMETER(MASS=131)
    PARAMETER(PI=3.1415926)
    
    B=RT(0.0)
    A=RT(1.5707963)
    EPS=1.E-4

    GS=1./(SQRT(2*PI))**3
    FA=(3*MASS)/(2*B*(A**2))
    FAGS=FA*GS

    write(*,*)'FAGS=',FAGS
    WRITE(*,*)'A=',A,'B=',B
    write(*,*)'mass=',mass


       CALL SIMPS2(0.0,PI,EPS,KFL,NNN,RESULT1)
        WRITE(*,*) R,RESULT1*FAGS
     

    END
***********************
    BLOCK DATA
    COMMON /R/R
        DATA R/1./
    END BLOCK DATA
************************
    SUBROUTINE FLS(THETA1,Y1,Y2)
    COMMON/AB1/A
    COMMON/AB2/B
    EE=(A**2-B**2)/(B**2)
    Y1=0.
    Y2=A*(1-0.5*EE*(COS(THETA1)**2)+0.75*(EE**2)*(COS(THETA1)**4))
    END SUBROUTINE
************************************
    REAL FUNCTION F(R1,THETA1)
    PARAMETER(THETA=1.5707963)
    PARAMETER(MASS=131)
    COMMON/R/R
    EXTERNAL BESSI0
    
    F=EXP(-0.5*(R1**2+R**2))*EXP(R*R1*COS(THETA)*COS(THETA1))*  
     &    SIN(THETA1)*(R1**2)*

    END FUNCTION
*************************************
    REAL FUNCTION  RT(THE)
    PARAMETER(THETA=1.5707963)
    PARAMETER(MASS=131)
    PARAMETER(PI=3.1415926)
    BETA2=-0.113    
    AA=0.523
    Y20=0.25*SQRT(5./PI)*(-1+3*COS(THE)**2.)        
    SR0=(1.23*MASS**(1./3.)-0.6)**2
    R0=SQRT(SR0+(7./3.)*(AA**2)*(PI**2)-5*(0.9**2))
    RT=R0*(1+BETA2*Y20)
    END FUNCTION
******************************************************

***************************************
        SUBROUTINE SIMPS1(X,EPS,KFL,N1,S)

    N1=1
    CALL FLS(X,Y1,Y2) 
    H1=0.5*(Y2-Y1)
    E=ABS(Y1)+ABS(Y2)
    T1=H1*(F(X,Y1)+F(X,Y2))
1    Y=Y1-H1
    T2=0.5*T1
     DO 2 I=1,N1
    Y=Y+2.*H1
2    T2=T2+H1*F(X,Y)
    S=(4.0*T2-T1)/3.0
    N1=N1+N1
    IF(N1.LT.8)GOTO 3
    IF(ABS(S-S0).LT.(1.0+ABS(S))*EPS)RETURN
3    S0=S
    T1=T2
    H1=0.5*H1
    IF(E+H1.NE.E)GOTO 1
    IF(Y1.EQ.Y2)RETURN
    KFL=KFL+1
    RETURN
    END

    
************************************************************
    SUBROUTINE SIMPS2(A,B,EPS,KFL,N,SUM)

    N2=1
    KFL=0
    C=ABS(A)+ABS(B)    
    H2=0.5*(B-A)
    CALL SIMPS1(A,EPS,KFL,N1,SS1)

    CALL SIMPS1(B,EPS,KFL,N3,SS2)

    N=N1+N3+2
    TB1=H2*(SS1+SS2)
4    X=A-H2
    TB2=0.5*TB1
    DO 5 I=1,N2
       X=X+2.0*H2
    CALL SIMPS1(X,EPS,KFL,N1,S)
    N=N+N1+1
5    TB2=TB2+H2*S
    SUM=(4.0*TB2-TB1)/3.0
    N2=N2+N2
    IF(N2.LT.8)GOTO 6
    IF(ABS(SUM-SUM0).LE.(1.0+ABS(SUM))*EPS) RETURN
6    SUM0=SUM
    TB1=TB2
    H2=0.5*H2
    IF(C+H2.NE.C)GOTO 4
    N=-N
    RETURN
    END
这个程序算出的结果是0.0659,但是我用mathematica算出的结果是2.21208,后者的结果应该是正确的。实在找不出原因。请大家帮忙看看好吗?多谢了

回复列表 (共7个回复)

沙发

那么长, 而且是旧很老的风格. 纯帮顶了.

板凳

那么新风格应该是怎样的呢?子程序我是用的徐士良书上的

3 楼

不要COMMON,减少不必要的GOTO。

4 楼

还有
Implicit None
等等。

5 楼

我觉得你可以先直接跟有解析解的积分作比较. 那样更可靠.

6 楼

我解决了,把被积函数f(x,y) 改为f(y,x)结果就对了。谢谢各位的指导. 我现在开始用module了。很多子程序都是过去的书上有的,比如徐士良的,他们用的都是老式的语句。有没有最新的算法书呢?

7 楼

清华出版社之前出的那本 <fortran95/2003 科学计算与工程> 之前论坛也帖子有介绍过.
个人看了之后觉得作者不喜欢用implicit none, 而直接定义所有字母开头都是浮点, 程序里面只定义其他类型变量. 当然这是风格问题, 个人并不喜欢. 还有有些应该地方缩进的地方缩进了而有些又没有, 挺乱的.  除代码之外就是算法的介绍非常少, 可能是定位就是参考手册的原因. 楼主有兴趣可以看看.

而比较权威的<Numerical.Recipes> 可惜最新版3rd不是fortran的.

我来回复

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