====================================================================
Lu扩展动态库：

		Lu数值计算扩展动态库：LuIMSL32.dll

====================================================================
#LuIMSL使用说明{
[LuIMSL32.dll] 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”。

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

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

    LuIMSL32.dll封装的IMSL库函数仅作演示学习之用，参考IMSL库的说明文档能更好地理解这些函数的用法。IMSL库是Visual Numerics公司的产品，在使用前须获得该公司的使用许可。
}#
--------------------------------------------------------------------
#IMSL::ClearImslErr{
[LuIMSL32.dll] IMSL::ClearImslErr()：清空ISML错误输出文件“ImslErr.txt”的内容。
}#
--------------------------------------------------------------------
#IMSL::ERSET{
[LuIMSL32.dll] 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::IERCD{
[LuIMSL32.dll] IMSL::IERCD()：返回信息错误代码，无错时返回0。
}#
--------------------------------------------------------------------
#IMSL::N1RTY{
[LuIMSL32.dll] IMSL::N1RTY(i)：i=0或者i=1，返回信息错误类型。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::EI{
[LuIMSL32.dll] IMSL::EI(x)：x!=0.0的实数，否则将返回运行错误。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::SI{
[LuIMSL32.dll] IMSL::SI(x)：x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::ERF{
[LuIMSL32.dll] IMSL::ERF(x)：x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSJ0{
[LuIMSL32.dll] IMSL::BSJ0(x)：第一类0阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSJ1{
[LuIMSL32.dll] IMSL::BSJ1(x)：第一类1阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSY0{
[LuIMSL32.dll] IMSL::BSY0(x)：第二类0阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSY1{
[LuIMSL32.dll] IMSL::BSY1(x)：第二类1阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSI0{
[LuIMSL32.dll] IMSL::BSI0(x)：修正的第一类0阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSI1{
[LuIMSL32.dll] IMSL::BSI1(x)：修正的第一类1阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSK0{
[LuIMSL32.dll] IMSL::BSK0(x)：修正的第三类0阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::BSK1{
[LuIMSL32.dll] IMSL::BSK1(x)：修正的第三类1阶Bessel函数。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::CSIEZ{
[LuIMSL32.dll] IMSL::CSIEZ(NDATA, XDATA, FDATA, XVEC, VALUE)：cubic spline 三次样条插值。

    NDATA：输入的数据点数目。
    XDATA：长度不小于NDATA的数组。存放数据点的X轴值。
    FDATA：长度不小于NDATA的数组。存放数据点的Y轴值。
    XVEC： 所要插值的位置。若缺省VALUE，则XVEC是一个实数；若提供参数VALUE，则VALUE和XVEC是两个数组。
    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{
[LuIMSL32.dll] 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{
[LuIMSL32.dll] 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{
[LuIMSL32.dll] 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{
[LuIMSL32.dll] 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{
[LuIMSL32.dll] 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{
[LuIMSL32.dll] 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{
[LuIMSL32.dll] 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{
[LuIMSL32.dll] 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[];
}#
--------------------------------------------------------------------
#IMSL::MACH{
[LuIMSL32.dll] IMSL::MACH(i)：返回双精度实型常数 。x为整数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
#IMSL::IFNAN{
[LuIMSL32.dll] IMSL::IFNAN(x)：判断x是否是NAN，NAN表示不是一个数 。x为实数。运行错误：1：参数不符合要求。
}#
--------------------------------------------------------------------
