自 Octave 中调用 NAG 函数

NAG 技术报告

摘要

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

目录

  1. 简介
  2. C++ 程序与 Oct-文件
  3. 示例
  4. 结论
  5. 参考数据

1. 简介

Octave [1] 是一个专门用来进行数值计算的免费程序语言。它几乎能够与 MATLAB 相容。 NAG 算法库 [2] 包含了许多的数学与统计函数,而且能够自不同的程序语言 [3] 中调用使用。 本文提供一个简易的方法,让使用者能够在 Octave 中调用 NAG 函数。

Octave 能够透过动态链接函数 [4] 进行扩充,有如在其环境中调用 Octave 的函数。 Octave 原先就是由 C++ 语言所开发而成的,所以不意外的,我们也可以利用 C++ 语言来扩充其功能。 它能在 Octave 中直接以原始 oct-file 接口进行函数调用。由于 C 函数能够轻易地被 C++ 所调用,我们认为最好的选择是共同利用 C++ 程序与 NAG C 算法库。

2. C++ 程序与 Oct 文件

Octave 附带有准备好的 mkoctfile 脚本,能够用来将 C++ 程序转为 oct。我们唯一要做的事就是写一个 C++ 的程序调用 NAG 的函数,然后再利用这个脚本。 为了要定义动态链接库的进入点,我们需要在 C++ 的程序中使用 Octave 的 DEFUN_DLD 宏。因此,我们的函数会类似以下片段:

  #include <octave/oct.h>
  #include <appropriate NAG header files>

     DEFUN_DLD (function_name, args, nargout,
       "Function description")
     {
       octave_value_list retval;
	
	// retrieve input arguments from args
	// call NAG routine
	// assign output arguments to retval

       return retval;
     }
其中:
  • oct.h 包含了 Octave 中所有必需的 oct 文件定义
  • function_name 将是我们在 Octave 中所要调用的函数名称,且必须与文件名一致,但不能与 NAG 函数名称相同
  • argsoctave_value_list 的参数
  • nargout 是输出参数的个数
  • "Function description" 会显示在函数说明中
  • 传回型态一律都是 octave_value_list
3. 示例

剩下的程序部分,我们用以下示例进行说明。本文中的程序已经在以下环境中进行过测试: Linux, 64-bit Fedora 8 (Werewolf) 搭配 Octave 3.0.3 以及 c++ (GCC) 4.3.3、NAG C 算法库第 8 版与 NAG Fortran 算法库地 22 版。

3.1 示例 1  Log gamma 函数:ln Γ(x)

lgamma 最简单的示例:我们调用仅回传单一数值的函数 - NAG C 算法库中求解 ln Γ(x) logarithm gamma 函数 nag_log_gamma (s14abc)。

3.2 示例 2  复数误差函数,exp(-z2)erfc(-iz)

erfc 我们调用一个复数输入及输出的函数 - nag_complex_erfc (s15ddc),其会计算复数 z 的方程式 w(z)=exp(-z2)erfc(-iz)。 复数会储存在 Octave 与 NAG C 算法库中,所以必须将 Octave 中的复数变量传递给 NAG 中的复数数据型别, 并将计算结果的复数值传回至 Octave。

3.3 示例 3  AX = B 复数线性方程估计解

lineq 我们调用传回复数数组的 nag_complex_lu_solve_mult_rhs (f04akc) 函数。此函数可以计算复数线性方程 AX=B,其中 A 已经透过 nag_complex_lu (f03ahc) 进行分解。 Octave 与 NAG 间的复数数据传递是必须采用的。

3.4 示例 4  求解非线性最小化问题

minimization 本利中我们调用非线性最小化函数 nag_opt_nlp (e04ucc)。此函数接受用户提供的目标函数 (以 C 或 Octave 程序提供)。同时我们也演示如何 将 Octave 中的数组与矩阵传给 C 程序。

3.5 示例 5  一元时间序列、周期性与非周期性差分

tsa 我们调用 NAG Fortran 算法库的 G13AAF 函数。此函数会处理时间序列的周期与非周期差数据。它会传回不同的差分数值与数据,能够让原始序列以不同的数值重新组成。 我们采用 NAG header files [5] 链接 NAG Fortran 算法库。

5. 结论

Octave 中包含了许多工具,让其扩充功能变得相当容易。本文中采用的方法乃是我们认为最简单实现的方法之一。 如果您想要采用不同的方式,您可以参考 Octave 网页中的动态链接库章节[4]

参考数据


Copyright 2009 NAG
[NP3674]