欢迎访问 Lu程序设计

Lu数值计算扩展动态库LuIMSL V1.0

目  录

1 什么是LuIMSL

2 IMSL函数

错误输出  
IMSL::ClearImslErr() 清空ISML错误输出文件“ImslErr.txt”的内容。
IMSL::ERSET 重置错误处理设置。
IMSL::IERCD() 返回信息错误代码,无错时返回0。
IMSL::N1RTY(i) i=0或者i=1,返回信息错误类型。运行错误:1:参数不符合要求。
指数积分和相关函数  
IMSL::EI(x)   x!=0.0的实数,否则将返回运行错误。运行错误:1:参数不符合要求。
IMSL::SI(x)    x为实数。运行错误:1:参数不符合要求。
错误函数  
IMSL::ERF(x) x为实数。运行错误:1:参数不符合要求。
Bessel函数  
IMSL::BSJ0(x) 第一类0阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
IMSL::BSJ1(x) 第一类1阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
IMSL::BSY0(x) 第二类0阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
IMSL::BSY1(x) 第二类1阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
IMSL::BSI0(x) 修正的第一类0阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
IMSL::BSI1(x) 修正的第一类1阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
IMSL::BSK0(x) 修正的第三类0阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
IMSL::BSK1(x) 修正的第三类1阶Bessel函数。x为实数。运行错误:1:参数不符合要求。
插值  
IMSL::CSIEZ cubic spline 三次样条插值。
积分  
IMSL::QDAGS 计算一个函数的积分(可能在端点存在奇异)。
IMSL::QDAG 基于Gauss-Kronrod法则使用自适应算法计算一个函数的积分 。
IMSL::QDAGP 计算一个给定奇异点的函数的积分。
IMSL::QDAGI 计算一个函数在无穷区间或半无穷区间的积分。
IMSL::TWODQ 计算二重积分。
IMSL::QAND 计算函数在超矩形下的积分。
微分  
IMSL::DERIV 计算一元函数的一阶、二阶或三阶导数。
常微分方程  
IMSL::ode 求解一次常微分方程[y'=f(t,y) ,y(t0)=y0],Runge-Kutta方法。
公用函数  
IMSL::MACH(i) 返回双精度实型常数 。x为整数。运行错误:1:参数不符合要求。
IMSL::IFNAN(x) 判断x是否是NAN,NAN表示不是一个数 。x为实数。运行错误:1:参数不符合要求。

1 什么是LuIMSL [返回页首]

    LuIMSL32.dll是一个Lu数值计算扩展动态库,该库对IMSL库中的部分函数进行了封装。

    在LuIMSL中的函数是通过二级函数命名空间“IMSL”输出的,所有函数均具有类似“IMSL::ode(...)”的格式。使用!using("IMSL");可简化LuIMSL中的函数访问。

    LuIMSL32.dll需要IMSL32.dll(或者是其他包含IMSL库函数的支持库)的支持。IMSL32.dll要在搜索目录中,或者需要指定IMSL32.dll的位置。

    能够被LuIMSL32.dll使用的IMSL32.dll(或者是其他包含IMSL库函数的支持库)应满足以下要求:用Fortran创建该动态库,输出函数名以“F_”开头,且是双精度函数。例如LuIMSL支持函数FPS3H,在IMSL32.dll中输出的函数名应是F_DFPS3H,且使用双精度函数DFPS3H进行计算。

    显式加载IMSL32.dll的方法:在加载Lu扩展动态库列表中使用如下方法,注意冒号后即IMSL32.dll的路径及文件名,也可以使用其他包含IMSL库函数的支持库。

        "dll\LuIMSL32.dll:dll\IMSL32.dll"

    一旦LuIMSL32.dll加载成功,将在当前目录创建或打开文件“ImslErr.txt”,调用ISML函数的所有错误都自动输出到该文件。LuIMSL32.dll在工作时,不能从外部清空或删除文件“ImslErr.txt”。

    注意1:IMSL库函数要求传递Fortran格式的数组。可以使用函数sys::rearray在Lu数组(C数组格式)和Fortran数组之间进行转换。

    注意2:有些IMSL库函数不允许嵌套调用,在需要嵌套调用这些库函数时,请同时加载LuIMSL321.dll,该库的输出函数与LuIMSL32.dll完全相同,但使用命名空间“IMSL1”:

        "dll\LuIMSL321.dll:dll\IMSL321.dll"

    警告:IMSL32.dll是由Fortran生成的,而Fortran中没有异常捕获机制,无法回卷堆栈,一旦发生了计算错误,都是直接终止程序。

    LuIMSL32.dll封装的IMSL库函数仅作演示学习之用,参考IMSL库的说明文档能更好地理解这些函数的用法。IMSL库是Visual Numerics公司的产品,在使用前须获得该公司的使用许可。

2 IMSL函数 [返回页首]

[返回页首] IMSL::ERSET(IERSVR, IPACT, ISACT):重置错误处理设置

    IERSVR:IMSL错误级别为1~5,数字越大,错误越严重。若IERSVR=0,包括了所有错误;否则仅包含自IERSVR以上更严重的错误。
    IPACT:IPACT=-1:不改变当前设置;IPACT=0:不输出错误;IPACT=1:输出错误;IPACT=2:重置缺省设置。
    IPACT:IPACT=-1:不改变当前设置;IPACT=0:不停止程序;IPACT=1:忽略该参数;IPACT=2:重置缺省设置。

    运行错误:1:参数不符合要求。

[返回页首] IMSL::CSIEZ(NDATA, XDATA, FDATA, XVEC, VALUE):cubic spline 三次样条插值

    NDATA:输入的数据点数目。
   
XDATA:长度不小于NDATA的数组。存放数据点的X轴值。
   
FDATA:长度不小于NDATA的数组。存放数据点的Y轴值。
   
XVEC: 所要插值的位置。若缺省VALUE,则XVEC是一个实数;若提供参数VALUE,则VALUEXVEC是两个数组。
   
VALUE:不小于XVEC长度的数组,用于返回插值得到的结果。可以缺省该参数。

    返回值:若有参数VALUE,则返回VALUE;否则返回一个实数 (插值得到的结果)。

    运行错误:1:参数太多或者太少;2:数据点太少或参数不匹配;3:数组不存在;4:数组太小。

    [例子]

main(:x,y,a,b)=
{
    x=new[reals,5,data: 1.615, 1.634, 1.702, 1.828, 1.921],
    y=new[reals,5,data: 2.4145, 2.46459, 2.65271, 3.03035, 3.34066],
    o{IMSL::CSIEZ(5,x,y,1.682),"\r\n",IMSL::CSIEZ(5,x,y,1.813),"\r\n"},
    a=new[reals,2,data:
1.682,1.813], b=new[reals,2],
    IMSL::CSIEZ(5,x,y,a,b),
    o[b(0),"\r\n",b(1),"\r\n"]
};

[返回页首] IMSL::QDAGS(F,A,B,ERRABS,ERRREL,&ERREST):计算一个函数的积分(可能在端点存在奇异)

    F:Lu一元函数句柄。该函数由用户定义。
    A,B:积分下限及积分上限。
   
ERRABS:期望的绝对精度。ERRABS>=0。可缺省该参数,缺省值为0.0。
   
ERRREL:期望的相对精度。ERRREL>=0。可缺省该参数,缺省值为1e-6。
   
ERREST:返回计算的绝对误差。可缺省该参数。
    返回值:积分值

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4:不是一元函数;5:参数不符合要求 ;6:函数应返回一个实数。

    [例子] 求函数f(x)=ln(x)/sqrt(x)在0~1上的积分值

f(x)=ln(x)/sqrt(x);
IMSL::
QDAGS[@f,0.,1.];   //得到积分值
(:err)=IMSL::
QDAGS[@f,0.,1.,0.,1e-6,&err],err;  //得到积分值的绝对误差

[返回页首] IMSL::QDAG(F,A,B,IRULE,ERRABS,ERRREL,&ERREST):基于Gauss-Kronrod法则使用自适应算法计算一个函数的积分

    F:Lu一元函数句柄。该函数由用户定义。
    A,B:积分下限及积分上限。
    IRULE:积分法则。
Gauss-Kronrod法则用于下面的点数(IRULE值:点数):(1:7~15)、(2:11~21)、(3:15~31)、(4:20~41)、(5:25~51)、(6:30~61)。大多数函数推荐取IRULE=2;如果函数有一个奇异的峰值,取IRULE=1;如果函数是摆动的,取IRULE=6。可缺省该参数,缺省值为2。
    ERRABS:期望的绝对精度。ERRABS>=0。可缺省该参数,缺省值为0.0。
   
ERRREL:期望的相对精度。ERRREL>=0。可缺省该参数,缺省值为1e-6。
   
ERREST:返回计算的绝对误差。可缺省该参数。
    返回值:积分值

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4:不是一元函数;5:参数不符合要求 ;6:函数应返回一个实数。

    [例子] 求函数f(x)=ln(x)/sqrt(x)在0~1上的积分值

f(x)=ln(x)/sqrt(x);
IMSL::
QDAG[@f,0.,1.];   //得到积分值
(:err)=IMSL::
QDAG[@f,0.,1.,2,0.,1e-6,&err],err;  //得到积分值的绝对误差

[返回页首] IMSL::QDAGP(F,A,B,PTS,ERRABS,ERRREL,&ERREST):计算一个给定奇异点的函数的积分

    F:Lu一元函数句柄。该函数由用户定义。
    A,B:积分下限及积分上限。
    PTS:数组,存放积分区间的间断点,至少要有一个间断点。通常这些间断点是被积函数出现奇异值的地方。
   
ERRABS:期望的绝对精度。ERRABS>=0。可缺省该参数,缺省值为0.0。
   
ERRREL:期望的相对精度。ERRREL>=0。可缺省该参数,缺省值为1e-6。
   
ERREST:返回计算的绝对误差。可缺省该参数。
    返回值:积分值

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4:不是一元函数;5:参数不符合要求 ;6:函数应返回一个实数。

    [例子] 求函数f(x)=x^3*ln{abs[(x^2-1)*(x^2-2)]}在0~3上的积分值

f(x)=x^3*ln{abs[(x^2-1)*(x^2-2)]};
IMSL::
QDAGP[@f,0.,3.,math::ra1(1,sqrt(2.0))];

[返回页首] IMSL::QDAGI(F,A,B,ERRABS,ERRREL,&ERREST):计算一个函数在无穷区间或半无穷区间的积分

    F:Lu一元函数句柄。该函数由用户定义。
    A,B:积分下限及积分上限。设x是一个数,则可取的值为 A=-inf,B=x
(-∞,x);A=x,B=inf(x,+∞);A=-inf,B=inf-∞,+∞)。
   
ERRABS:期望的绝对精度。ERRABS>=0。可缺省该参数,缺省值为0.0。
   
ERRREL:期望的相对精度。ERRREL>=0。可缺省该参数,缺省值为1e-6。
   
ERREST:返回计算的绝对误差。可缺省该参数。
    返回值:积分值

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4:不是一元函数;5:参数不符合要求 ;6:函数应返回一个实数。

    [例子] 求函数x*exp[-x](0,+∞)上的积分值 。

f(x)=x*exp[-x];
IMSL::QDAGI[@f,0.0,inf];

[返回页首] IMSL::TWODQ(F, A, B, G, H, IRULE, ERRABS, ERRREL, &ERREST):计算二重积分

    F:Lu二元 被积函数句柄。该函数由用户定义。
    A,B:积分下限与积分上限。
    G,H:Lu一元函数句柄,由用户定义,用来计算内层积分的下限与上限。
   
IRULE:选择积分的法则。Gauss-Kronrod法则用于下面的点数(IRULE值:点数):(1:7~15)、(2:11~21)、(3:15~31)、(4:20~41)、(5:25~51)、(6:30~61)。大多数函数推荐取IRULE=2;如果函数有一个奇异的峰值,取IRULE=1;如果函数是摆动的,取IRULE=6。可缺省该参数,缺省值为2。
    ERRABS:期望的绝对精度。ERRABS>=0。可缺省该参数,缺省值为0.0。
   
ERRREL:期望的相对精度。ERRREL>=0。可缺省该参数,缺省值为1e-6。
   
ERREST:返回计算的绝对误差。可缺省该参数。
    返回值:积分值

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4: 自定义函数参数个数不符合要求;5:参数不符合要求 ;6:函数应返回一个实数。

    [例子] 计算函数f(x,y)=y*cos(x+y*y)的近似积分值。外层区间取[0,1],内层区间取[-2*x,5*x]。

f(x,y)=y*cos(x+y*y);
g(x)=-2*x;
h(x)=5*x;
IMSL::TWODQ[@f,0.,1.,@g,@h,6];

[返回页首] IMSL::QAND(F, math::ra1[A1, A2, ..., An, B1, B2, ..., Bn], MAXFCN, ERRABS, ERRREL, &ERREST):计算函数在超矩形下的积分

    F:Lu多元函数句柄,设有n个自变量。该函数由用户定义。
    math::
ra1[A1, A2, ..., An, B1, B2, ..., Bn]:数组,长度为n+n。A1, A2, ..., An是积分下限,有n个下限值。B1, B2, ..., Bn是积分上限,有n个上限值。
   
MAXFCN:可允许的函数估计的最大数目。必须MAXFCN<=256^n。 可缺省该参数,缺省值为64^n。
   
ERRABS:期望的绝对精度。ERRABS>=0。可缺省该参数,缺省值为0.0。
   
ERRREL:期望的相对精度。ERRREL>=0。可缺省该参数,缺省值为1e-6。
   
ERREST:返回计算的绝对误差。可缺省该参数。
    返回值:积分值

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4:自定义函数是无参函数;5:参数不符合要求 ;6:函数应返回一个实数。

    [例子] 计算函数exp[-(x1^2+x2^2+x3^2)]在扩展的立方体(整个三维空间)上的积分的近似值。积分区间为[-2,-2,-2~2,2,2]。

f(x1,x2,x3)=exp[-(x1^2+x2^2+x3^2)];
IMSL::
QAND[@f,math::ra1(-2,-2,-2,2,2,2)];

[返回页首] IMSL::DERIV(FCN,KORDER,X,BGSTEP,TOL):计算一元函数的一阶、二阶或三阶导数

    FCN:Lu一元函数句柄,要计算该函数在X的导数。该函数由用户定义。
    KORDER:导数的阶(1、2或3)。
    X:被求导的点。
    BGSTEP:用来计算步长的起始值,这个步长被用于计算导数。BGSTEP>0。可缺省该参数,缺省值为0.1。
    TOL:允许的相对误差(0~1)。可缺省该参数,缺省值为1e-6。
    返回值:
函数的一阶、二阶或三阶导数

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4:不是一元函数;5:参数不符合要求 ;6:函数应返回一个实数。

    [例子] 求函数f(x)=2*x^4+3*x在0.75处的三阶导数

f(x)=2*x^4+3*x;
IMSL::DERIV[@f,3,0.75];

[返回页首] IMSL::ode(FCN, math::ra1[t0, t1, ..., tk], math::ra1[Y1,Y2,...,Yn], TOL):求解一次常微分方程[y'=f(t,y) ,y(t0)=y0],Runge-Kutta方法

    FCN:用户定义的函数,用于计算微分方程组中各方程右端函数值,由用户自编。该表达式有2*n+1个参数,第一个参数为自变量,随后n个参数为函数值,最后n个参数为右端函数值(即微分方程的值)。n为微分方程组中方程的个数,也是未知函数的个数。形式如下:

f(t,y1,y2,y3,d1,d2,d3)=
{   d1=y2,
    d2=-y1,
    d3=-y3
};

    math::ra1[t0, t1, ..., tk]:数组,存放独立变量t。输入初始时间为t0,用户希望得到时间t1, ..., tk时的解。
    math::ra1[
Y1,Y2,...,Yn]存放n个未知函数在起始点处的函数值Y(n)=Yn(t)
    TOL:允许误差。
可缺省该参数,缺省值为1e-6。

    返回值(1+k)×(1+n)二维数组。存放(1+k)组结果(包含初始值),每一组结果即:t,Y1,Y2,...,Yn

    运行错误:1:不允许嵌套调用;2:参数太多或者太少;3:指定的表达式不存在;4:函数参数个数不符合要求;5:参数不符合要求 ;6:内存错误;7:函数应返回一个实数。

    [例子] 设一阶微分方程组及初值为:
        r'=2r-2rf, r(0)=1
        f'=-f+rf,  f(0)=3
    计算t=1,2,...,10时的r、f的值。

    程序如下:

!!!using["IMSL","math"];
f(t,r,f,dr,df)={dr=
2*r-2*r*f, df=-f+r*f}; //函数定义
ode[@f,
ra1[0,1,2,3,4,5,6,7,8,9,10],ra1[1,3]].outa[];


版权所有© Lu程序设计 2011-2012,保留所有权利
E-mail: forcal@sina.com
  QQ:630715621
最近更新: 2013年01月12日