自 Scilab 中调用 NAG 函数

NAG 技术报告

摘要

本篇报告将说明如何在 Scilab 程序环境中,调用 NAG C 与 Fortran 算法库的函数。

Contents

  1. 简介
  2. C 程序与 Scilab sce 文件
  3. 示例
  4. 结语
  5. 参考页面
  6. 参考数据

1. 简介

Scilab [1] 是一个包含数以百计数学函数、而且能够加入其他函数进行扩充,专门用来进行计算的免费科学软件。 NAG 算法库 [2] 包含了许多的数学与统计函数,而且能够自不同的程序语言 [3] 中调用使用。 我们将简单的说明 NAG 算法库如何集成至 Scilab 中,并提供许多我们已经完成的示例。

为了要能在 Scilab 中调用 NAG 函数,您可以自行编写一个简单的接口程序,链接 NAG 算法库与 Scilab,并采用静态链接或动态链接所需的函数。 链接的函数能够被其他的 Scilab 函数使用。NAG C 算法库或 NAG Fortran 算法库都能够被链接,但由于 Scilab 是由 C 语言所开发, 我们将先了解透过 C 语言所撰写的接口链接 C 算法库。此外,我们将只探讨如何以动态链接方式链接 NAG 函数。

2. C 程序与 Scilab sce 文件

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 函数的名称不能相同,以避免产生错误。
3. 示例

本文中的程序皆已在 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)

dawson 这是最简单的示例:我们调用仅会回传单一值的函数,NAG C 算法库中的 nag_dawson (s15afc),求解 Dawson 积分。
文件:Builder1Interface1Example1

3.2 示例 2  一般型椭圆积分

elliptic 我们调用以复数数据型别作为输入与输出的函数 nag_elliptic_integral_f (s21dac),其会估计出复数二阶椭圆积分的值。 复数值分别储存在 Scilab 与 NAG C 算法库中,所以需要额外的程序自 Scilab 中复制复数数据型态到 NAG 中,同样的也要复制 NAG 的数值到 Scilab 中。
文件:Builder2Interface2Example2

3.3 示例 3  复数一般矩阵的特征值与特征向量求解

eigvals 我们调用以复数数据型别作为输入与输出的函数 nag_complex_eigensystem_sel (f02gcc)。此函数计算复数矩阵 A 的特征值。 将会在 Scilab 与 NAG 间做复数数据型别的数据传递。
文件:Builder3Interface3Example3

3.4 示例 4  求解多维积分

torus 本例中,我们调用多维积分函数 nag_multid_quad_adapt_1 (d01wcc)。此函数需要输入一个目标函数。我们提供两种方法提供此目标函数 - 以 C 或 Scilab 语言提供。

文件:Builder4aInterface4aExample4a。(目标函数以 C 语言提供)
文件:Builder4bInterface4bExample4b。(目标函数以 Scilab 语言提供)

3.5 示例 5  常态分配的 Pseudorandom 随机数

pseudorand 我们调用 NAG Fortran 算法库的 G05LAF 函数。此函数会依指定的平均值 μ 与标准偏差 σ2 的常态分配回传 pseudorandom 向量。 我们使用 NAG 的 header files [4]
文件:Builder5Interface5Example5

4. 结论

  • 你可以利用 Scilab 链接 NAG C 算法库或 NAG Fortran 算法库
  • 您必须要撰写接口程序将 NAG 算法库与 Scilab 链接在一起
  • Scilab 有内建的函数,让链接到 NAG 算法库变得简单许多
  • 在运行期阶段,你必须要确认必要的环境变量都有设定到正确的地方

5. 参考数据

我们将这五个示例中有用的资讯汇集成一页,提供您参考。同时也包含了许多如何撰写函数接口的链接,以及一些常见问题释疑。

References


Copyright 2009 Numerical Algorithms Group
[NP3675]