自 Octave 中调用 NAG 函数
NAG 技术报告
摘要
本篇报告将说明如何在 Octave 程序环境中,调用 NAG C 与 Fortran 算法库的函数。
目录
Octave [1] 是一个专门用来进行数值计算的免费程序语言。它几乎能够与 MATLAB 相容。 NAG 算法库 [2] 包含了许多的数学与统计函数,而且能够自不同的程序语言 [3] 中调用使用。 本文提供一个简易的方法,让使用者能够在 Octave 中调用 NAG 函数。
Octave 能够透过动态链接函数 [4] 进行扩充,有如在其环境中调用 Octave 的函数。 Octave 原先就是由 C++ 语言所开发而成的,所以不意外的,我们也可以利用 C++ 语言来扩充其功能。 它能在 Octave 中直接以原始 oct-file 接口进行函数调用。由于 C 函数能够轻易地被 C++ 所调用,我们认为最好的选择是共同利用 C++ 程序与 NAG C 算法库。
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 函数名称相同
- args 是 octave_value_list 的参数
- nargout 是输出参数的个数
- "Function description" 会显示在函数说明中
- 传回型态一律都是 octave_value_list。
剩下的程序部分,我们用以下示例进行说明。本文中的程序已经在以下环境中进行过测试: 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)
|
最简单的示例:我们调用仅回传单一数值的函数 - NAG C 算法库中求解 ln Γ(x) logarithm gamma 函数 nag_log_gamma (s14abc)。 |
3.2 示例 2 复数误差函数,exp(-z2)erfc(-iz)
|
我们调用一个复数输入及输出的函数 - nag_complex_erfc (s15ddc),其会计算复数 z 的方程式 w(z)=exp(-z2)erfc(-iz)。 复数会储存在 Octave 与 NAG C 算法库中,所以必须将 Octave 中的复数变量传递给 NAG 中的复数数据型别, 并将计算结果的复数值传回至 Octave。 |
3.3 示例 3 AX = B 复数线性方程估计解
|
我们调用传回复数数组的 nag_complex_lu_solve_mult_rhs (f04akc) 函数。此函数可以计算复数线性方程 AX=B,其中 A 已经透过 nag_complex_lu (f03ahc) 进行分解。 Octave 与 NAG 间的复数数据传递是必须采用的。 |
3.4 示例 4 求解非线性最小化问题
|
本利中我们调用非线性最小化函数 nag_opt_nlp (e04ucc)。此函数接受用户提供的目标函数 (以 C 或 Octave 程序提供)。同时我们也演示如何 将 Octave 中的数组与矩阵传给 C 程序。 |
3.5 示例 5 一元时间序列、周期性与非周期性差分
|
我们调用 NAG Fortran 算法库的 G13AAF 函数。此函数会处理时间序列的周期与非周期差数据。它会传回不同的差分数值与数据,能够让原始序列以不同的数值重新组成。 我们采用 NAG header files [5] 链接 NAG Fortran 算法库。 |
Octave 中包含了许多工具,让其扩充功能变得相当容易。本文中采用的方法乃是我们认为最简单实现的方法之一。 如果您想要采用不同的方式,您可以参考 Octave 网页中的动态链接库章节[4]。
- [1]
Octave
John W. Eaton
John W. Eaton of University of Wisconsin-Madison, 1998-2006.
http://www.gnu.org/software/octave/index.html - [2]
NAG 数值算法库
http://tw.nag-gc.com/numeric/numerical_libraries.asp - [3]
加强应用程序中的数值计算能力
http://tw.nag-gc.com/numeric/Num_DLLhelp.asp - [4]
Octave - 动态链接函数
John W. Eaton
John W. Eaton of University of Wisconsin-Madison, 1996, 1997, 2007.
http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions - [5]
使用 NAG C Header Files 调用 NAG Fortran 函数
Ian Hounam
http://tw.nag-gc.com/numeric/FL/FLassocinfo.asp#CH - [6]
NAG C 算法库
http://tw.nag-gc.com/numeric/CL/CLdocumentation.asp - [7]
NAG Fortran 算法库
http://tw.nag-gc.com/numeric/FL/FLdocumentation.asp
Copyright 2009 NAG
[NP3674]




