自 Scilab 中调用 NAG 函数
NAG 技术报告
摘要
本篇报告将说明如何在 Scilab 程序环境中,调用 NAG C 与 Fortran 算法库的函数。
Contents
Scilab [1] 是一个包含数以百计数学函数、而且能够加入其他函数进行扩充,专门用来进行计算的免费科学软件。 NAG 算法库 [2] 包含了许多的数学与统计函数,而且能够自不同的程序语言 [3] 中调用使用。 我们将简单的说明 NAG 算法库如何集成至 Scilab 中,并提供许多我们已经完成的示例。
为了要能在 Scilab 中调用 NAG 函数,您可以自行编写一个简单的接口程序,链接 NAG 算法库与 Scilab,并采用静态链接或动态链接所需的函数。 链接的函数能够被其他的 Scilab 函数使用。NAG C 算法库或 NAG Fortran 算法库都能够被链接,但由于 Scilab 是由 C 语言所开发, 我们将先了解透过 C 语言所撰写的接口链接 C 算法库。此外,我们将只探讨如何以动态链接方式链接 NAG 函数。
Scilab 提供 ilib_build 函数,我们将用它来编译我们的 C 程序成为动态链接库。反之,我们也可以透过 addinter 函数链接 Scilab。 唯一必须要做的事就是写一个 C 的界面,用来调用我们所需的 NAG 函数,并使用以上所提的两个函数来进行编译与链接。 以 C 所写的接口类似于:
#include <stack-c.h>
#include appropriate NAG header files
int interface name (char *fname)
{
retrieve input arguments from the Scilab stack
call NAG routine
assign output arguments
return 0;
}
其中:
- stack-c.h 包含了与 Scilab 互动所需要的函数,能够保留所有的输出入变量
- interface name 是我们将会用到的界面名称
- fname 是在 Scilab 中的函数名称。他并不需要由使用者传递,会自动的透过 Scilab 传递。
为了要编译我们的接口程序,Scilab 生成脚本将会在 Scilab 中采用以下范本编译:
// This is the builder.sce
// must be run from this directory
ilib_name = 'nag_tute'; // interface library name
files = ['nag_intext1.c']; // files to compile
libs = [/opt/NAG/cll6a08dgl/lib/libnagc_nag]; // other libs needed for linking
table = [ 'function_name' 'interface name'];
cflags = '-I/opt/NAG/cll6a08dgl/include' // flags needed for the C compiler
// do not modify below
// ----------------------------------------------
ilib_build(ilib_name,table,files,libs,[],[],cflags);
我们假设 NAG C 算法库安装于 /opt/NAG/cll6a08dgl 目录中。如果其并非在默认目录下,您必须要进行脚本的修改。
注意:
- 这是进行生成、编译与链接至 NAG 算法库的唯一脚本。在 Scilab 中运行此生成脚本,将会自动的产生前文所提的 addinter 函数。
- ilib_name 将会被链接的接口库名称
- files 需要被编译的相关文件
- libs 包含需要被链接的算法库。我们并未加上 .a 或 .so 的扩展名
- function_name 是将在 Scilab 中所使用的函数名称,例如 [output variables] = function_name(input variables)。 如果您觉得有需要,可以将此名称与 NAG 算法库中的函数名称有一致的命名,例如:a00aac/a00aaf。 但是接口的名称 interface name 与 NAG 函数的名称不能相同,以避免产生错误。
本文中的程序皆已在 64-bit Red Hat Linux 4.1.2-33 的 Scilab 5.1.1 环境中进行过测试。
以下的 C 示例,我们采用 gcc (GCC) 4.4.0 以及 NAG C 算法库第 8 版 (cll6a08dg)。
Fortran 示例,GNU Fortran (GCC) 4.4.0 以及 NAG Fortran 算法库 22 版。
注意: 我们要能在运行期中正确加载共享程序,必须要正确设定环境变量 LD_LIBRARY_PATH。您可以 参考此 取得更多详细资讯。
3.1 示例 1
Dawson 积分 F(x)
|
这是最简单的示例:我们调用仅会回传单一值的函数,NAG C 算法库中的 nag_dawson (s15afc),求解 Dawson 积分。
文件:Builder1、 Interface1、 Example1。 |
3.2 示例 2 一般型椭圆积分
|
我们调用以复数数据型别作为输入与输出的函数 nag_elliptic_integral_f (s21dac),其会估计出复数二阶椭圆积分的值。
复数值分别储存在 Scilab 与 NAG C 算法库中,所以需要额外的程序自 Scilab 中复制复数数据型态到 NAG 中,同样的也要复制 NAG 的数值到 Scilab 中。
文件:Builder2、 Interface2、 Example2。 |
3.3 示例 3 复数一般矩阵的特征值与特征向量求解
|
我们调用以复数数据型别作为输入与输出的函数 nag_complex_eigensystem_sel (f02gcc)。此函数计算复数矩阵 A 的特征值。
将会在 Scilab 与 NAG 间做复数数据型别的数据传递。
文件:Builder3、 Interface3、 Example3。 |
3.4 示例 4 求解多维积分
|
本例中,我们调用多维积分函数 nag_multid_quad_adapt_1 (d01wcc)。此函数需要输入一个目标函数。我们提供两种方法提供此目标函数 -
以 C 或 Scilab 语言提供。
文件:Builder4a、 Interface4a、 Example4a。(目标函数以 C 语言提供) 文件:Builder4b、 Interface4b、 Example4b。(目标函数以 Scilab 语言提供) |
3.5 示例 5 常态分配的 Pseudorandom 随机数
|
我们调用 NAG Fortran 算法库的 G05LAF 函数。此函数会依指定的平均值 μ 与标准偏差 σ2 的常态分配回传 pseudorandom 向量。
我们使用 NAG 的 header files [4]。
文件:Builder5、 Interface5、 Example5。 |
- 你可以利用 Scilab 链接 NAG C 算法库或 NAG Fortran 算法库
- 您必须要撰写接口程序将 NAG 算法库与 Scilab 链接在一起
- Scilab 有内建的函数,让链接到 NAG 算法库变得简单许多
- 在运行期阶段,你必须要确认必要的环境变量都有设定到正确的地方
5. 参考数据
我们将这五个示例中有用的资讯汇集成一页,提供您参考。同时也包含了许多如何撰写函数接口的链接,以及一些常见问题释疑。
- [1]
Scilab
http://www.scilab.org/platform/
- [2]
NAG 数值算法库
Numerical Algorithms Group
Numerical Algorithms Group Limited, Oxford, UK, 2008.
http://cn.nag-gc.com/numeric/numerical_libraries.asp
- [3]
加强应用程序中的数值计算能力
Numerical Algorithms Group
Numerical Algorithms Group Limited, Oxford, UK, 2004.
http://cn.nag-gc.com/numeric/Num_DLLhelp.asp
- [4]
使用 NAG C Header Files 调用 NAG Fortran 函数
Ian Hounam
Numerical Algorithms Group Ltd, Oxford, UK, 2002
http://cn.nag-gc.com/numeric/FL/FLassocinfo.asp#CH
- [5]
The NAG C 算法库
Numerical Algorithms Group Ltd, Oxford, UK, 2009
http://cn.nag-gc.com/numeric/CL/CLdocumentation.asp
- [6]
NAG Fortran 算法库
Numerical Algorithms Group Ltd, Oxford, UK, 2009
http://cn.nag-gc.com/numeric/FL/FLdocumentation.asp
Copyright 2009 Numerical Algorithms Group
[NP3675]




