回 帖 发 新 帖 刷新版面

主题:IMSl里面的积分二重积分程序能否调用两次

我编了一个利用IMSL库函数调用二重积分子函数TWODQ的程序,也就是说利用TWODQ程序分别对F,FIM进行积分,但是出了点问题。第一个函数F没问题,但是第二个被积函数FIM就不行了。请各路神仙帮忙看看好吗
    program main
    use IMSL
    INTEGER IRULE
    REAL A,B,ERRABS,ERRREL,RESULT,ERREST
    REAL G,H,F
    COMMON /PI/PI
    EXTERNAL G,H,F,FIM
    A=0.
    B=12.
    ERRABS=0.
    ERRREL=0.01
    IRULE=6
    CALL TWODQ(F,A,B,G,H,ERRABS,ERRREL,IRULE,RESULT,ERREST)
    WRITE(*,*)RESULT,ERREST

    CALL TWODQ(FIM,A,B,G,H,ERRABS,ERRREL,IRULE,RESULT,ERREST)
    
    WRITE(*,*)RESULT,ERREST
    END
***********************************
    BLOCK DATA
    REAL PI
    COMMON /PI/PI
    DATA PI/3.1415926/
    END BLOCK DATA
*********************************
    REAL FUNCTION F(R,THE)
    REAL R,THE,MASS
    COMMON /PI/PI

    Q=0.5

    RHO0=0.153
    A0=0.8
    BETA2=-0.113
    BETA4=-0.027
    Y20=0.25*SQRT(5./PI)*(-1+3*COS(THE)**2)
    Y40=(3./(16.*SQRT(PI)))*(3-30*COS(THE)**2+35*COS(THE)**4)
    MASS=131.
    R0=1.1
    RTHE=R0*(MASS**(1./3.))*(1+BETA2*Y20+BETA4*Y40)
    RHO=RHO0/(1+EXP((R-RTHE)/A0))

    F=2*PI*RHO*COS(Q*R*COS(THE))*(R**2)*SIN(THE)/MASS

    END
*************************************************************
    REAL FUNCTION FIM(R,THE)
    REAL R,THE,MASS
    COMMON /PI/PI

    Q=0.5

    RHO0=0.153
    A0=0.8
    BETA2=-0.113
    BETA4=-0.027
    Y20=0.25*SQRT(5./PI)*(-1+3*COS(THE)**2)
    Y40=(3./(16.*SQRT(PI)))*(3-30*COS(THE)**2+35*COS(THE)**4)
    MASS=131.
    R0=1.1
    RTHE=R0*(MASS**(1./3.))*(1+BETA2*Y20+BETA4*Y40)
    RHO=RHO0/(1+EXP((R-RTHE)/A0))

    FIM=2*PI*RHO*SIN(Q*R*COS(THE))*(R**2)*SIN(THE)/MASS
    END

    REAL FUNCTION H(X)
    COMMON/PI/PI
    H=PI
    END    

    REAL FUNCTION G(X)
    G=0.
    END

回复列表 (共4个回复)

沙发

理论上来说是可以的啊。
~~~~
看看是不是你FIM写的有问题呢?没仔细看:)

板凳

FIM的定义是这样的,FIM=2*PI*RHO*SIN(Q*R*COS(THE))*(R**2)*SIN(THE)/MASS,运行时出错了。报的错误是:
error 1 from TWODQ.The maximum number of subintervals allowed MaxSub=250 has been reached.Use T2ODQ and increse MAXSUB. Dimension adjustments may be necessary.

如果我将FIM改成FIM=2*PI*RHO*SIN(the)*(R**2)*SIN(THE)/MASS,就不会出错。

可是我计算中是需要最上面的那个式子呀,

3 楼

你程序超出TWODQ计算能力范围了,改用T2ODQ试试吧。
:)

4 楼

IMSL里面的很多函数不能嵌套调用,包括这个TWODQ函数。
似乎应该是考虑到运行效率问题,IMSL没有对这些函数的嵌套调用提供支持。
解决方法:将其中的一个TWODQ函数做到dll中,另一个用其他方法正常使用。

参考:Forcal中对IMSL库函数的封装
生成了两个库FcIMSL32W.dll和FcIMSL32W1.dll。两个库有完全相同的封装函数,但命名空间不一样,分别是“IMSL”和“IMSL1”。
以TWODQ为例,两个函数如下所示:
IMSL::TWODQ
IMSL1::TWODQ

我来回复

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