欢迎访问 Lu程序设计

Lu数值计算扩展动态库Lu IMSL 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，该库的输出函数与Lu IMSL32.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，则 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(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::QDAG P[@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日