卓越的數值計算庫gsl(GNU Scienti…

卓越的數值計算庫gsl(GNU Scientific Library)的使用初步

1.gsl簡介

gsl(GNU Scientific Library)是專門爲應用數學和科學技術領域的數值計算提供支持的軟件庫。gsl使用C語言編寫,同時也爲其他語言做了相應的封裝。gsl在GNU通用公共許可下是免費的。該函數庫提供了廣泛的數學算法的實現函數,包括隨機數生成器,特殊函數和最小二乘擬合等等。目前該函數庫提供有超過1000個函數,這些函數包含的範圍有:複數計算、多項式求根、特殊函數、向量和矩陣運算、排列、組合、排序、線性代數、特徵值和特徵向量、快速傅里葉變換(FFT)、數值積分、隨機數生成、隨機數分佈、統計、蒙特卡洛積分、模擬退火、常微分方程組、插值、數值微分、方程求根、最小二乘擬合、小波變換等。更詳細的介紹請參考維基百科http://en.wikipedia.org/wiki/GNU_Scientific_Library

2.gsl在windows系統VC6.0中的使用

a.gsl下載與安裝

gsl如此強大,但是設計初衷不是爲windows下的用戶使用的(感興趣的讀者請了解GNU的歷史,百度百科http://baike.baidu.com/view/36272.htm),不過有了牛人的移植工作,我們可以在windows平臺下使用。目前該軟件的版本是1.8。爲了方便大家使用,我將該軟件放在我的百度雲網盤中,供大家免費下載,地址是http://pan.baidu.com/share/link?shareid=1626921739&uk=1074032371,文件名是gsl1.8.rar。解壓縮后里麪包含兩個文件gsl-1.8.exe和gsl-1.8-src.exe。跟普通的可執行程序一樣,雙擊即可安裝。

b.如何產生兩個lib文件

在VC中使用時,必須要產生兩個lib文件:libgsl.lib和libgslcblas.lib。但是我們到該軟件的安裝路徑C:\Program Files\GnuWin32\lib(默認安裝位置在C盤)下,並沒有找到這兩個文件,但是有同名但後綴不同的文件。這裏需要自己動手使用後綴.def的文件將這兩個.lib文件做出來。方法是(在win7下):Win7中開始菜單左下角的“搜索程序和文件”欄中輸入cmd。彈出cmd命令窗口,輸入命令:

cd C:\Program Files\GnuWin32\lib

將當前目錄設置爲.def所在的目錄。之後輸入兩條命令:

lib /machine:i386 /def:libgsl.def

lib /machine:i386 /def:libgslcblas.def

如果運氣好的話,在該目錄下,就能找到這兩個.lib文件。我在嘗試時,試了很多遍,都沒有成功。後來發現,因爲該文件夾的屬性是“只讀”,而且無法更改屬性,即使更改了點擊確定後就又變成“只讀”了。想了想,既然不能改變該文件夾的屬性,我就把裏面的所有文件(共6個)拷貝到D盤根目錄下,因爲D盤根目錄不是“只讀”的。

然後在cmd命令窗口輸入指令:

cd \d d:\

注意這裏更改目錄時中間多了\d,是改變根目錄所需的。如果不加的話,根目錄不會切換到D盤。輸入指令之後,再輸入剛纔輸入的兩條語句:

lib /machine:i386 /def:libgsl.def

lib /machine:i386 /def:libgslcblas.def

發現D盤根目錄下產生了四個文件分別是libgsl.lib、libgsl.exp、libgslcblas.lib、libgslcblas.exp。把這四個文件拷貝回C:\Program Files\GnuWin32\lib下。鬆了口氣,終於產生這兩個lib文件了。快要大功告成了!

c.剩下的配置工作

剩下的配置比較簡單。在VC6.0中,點擊Tools->Options菜單項,彈出Options對話框,在Directories選項卡下Show directories for:(下拉列表)中設置三項:首先,選擇Executable files,在下面添加C:\PROGRAM FILES\GNUWIN32\BIN。第二項是選擇Include files,在下面添加C:\PROGRAM FILES\GNUWIN32\INCLUDE。第三項是選擇Library files,在下面添加C:\PROGRAM FILES\GNUWIN32\LIB。這三項添加的方法都是一樣的:在已添加的所有文件下面空白處雙擊,在編輯框的右端出現“...”按鈕,點擊該按鈕,彈出Choose directory對話框,在該對話框中逐級選擇你安裝gsl的目錄即可。

3.創建測試程序

新建控制檯程序,新建.cpp文件。在.cpp文件中輸入附錄中的代碼(可以直接拷貝)。示例程序是構造兩個3維的向量,然後輸出這兩個向量,之後將兩個向量求和,並將求和結果輸出。點擊保存後。編譯鏈接,發現有5條錯誤:error LNK2001: unresolved external symbol _gsl_vector_...等。這是因爲沒有加入lib文件。點擊Project->Settings,在Project Settings對話框Link選項卡下Object\library modules: 的編輯框的最後加入 libgsl.lib libgslcblas.lib 兩個lib文件,注意在新加入的文件與原有文件的lib名字之間以及兩個新加入的文件的lib名字之間加入空格。點擊編譯鏈接,成功。點擊運行,出現缺少(...).dll動態鏈接庫,將C:\Program Files\GnuWin32\bin目錄下與兩個lib文件對應的.dll文件拷貝到測試程序的Debug目錄下,運行,得到附錄中的運行結果。

4.想學習更多使用gsl

在gsl的安裝文件中,我的是在C:\Program Files\GnuWin32\doc\gsl\1.8\gsl-1.8中,有該數值計算函數庫的幫助文檔,名字是gsl-ref,有pdf和html版本的,建議看pdf版本的,內容清晰且能正常顯示文檔中的特殊數學符號。文檔中有幾乎所有函數的原型聲明及其用途,還有一些函數的使用示例。

5.附錄

a.示例程序源代碼
#include <iostream>
#include <gsl/gsl_vector.h>

using std::cout;

void printVector(gsl_vector* v)  //輸出向量的元素
{
 cout << "(";
 for (int i = 0; i < v->size; ++i)
 {
  cout << gsl_vector_get (v, i);
  if (i < v->size - 1)
  {
   cout << ", ";
  }
 }
 cout << ")\n";   
}
int main()  //gsl_vector測試例程
{
 //創建3個元素的向量v1和v2
 const int VCT_SIZE = 3;
 gsl_vector* v1 = gsl_vector_alloc(VCT_SIZE); 
 gsl_vector* v2 = gsl_vector_alloc(VCT_SIZE);

 

//向v1和v2寫入數據
 for (int i = 0; i < VCT_SIZE; ++i)
 {
  gsl_vector_set(v1, i, i);
  gsl_vector_set(v2, i, VCT_SIZE-i);
 }
 
 //輸出v1和v2
 cout << "v1 = ";
 printVector(v1);
 cout << "v2 = ";
 printVector(v2);

 //v1和v2相加,和放在v1中,即v1 = v1 + v2
 gsl_vector_add(v1, v2);

 //輸出向量之和
 cout << "v1 + v2 = ";
 printVector(v1);

 return 0;
}

b.示例程序運行結果

卓越的數值計算庫gsl(GNU <wbr>Scientific <wbr>Library)的使用初步

本文是作者原創,轉載必須保證文章的完整性並標明出處(blog.sina.com.cn/zhangkunhn),請尊重作者,支持原創。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章