標籤:
GNU scientific library 是一個強大的C,C++數學庫。它涉及的面很廣,並且代碼效率高,介面豐富。正好最近做的一個項目中用到多元高斯分布,就找到了這個庫。
GNU scientific library:http://ftpmirror.gnu.org/gsl/
相應說明文檔: http://www.gnu.org/software/gsl/manual/gsl-ref.ps.gz
編譯時間需要加上一些尾碼:
g++ xxx.cpp -lgsl -lgslcblas -lm
調用時,只需要包含相應模組的標頭檔即可(說明文檔裡面會有提到函數對應的標頭檔名)
庫的標頭檔都是放在 gsl/目錄下的,寫的時候,按照下面的寫法就行。
#include <gsl/xxx.h>
下面是一個執行個體程式
http://blog.csdn.net/augusdi/article/details/9983307
我 們這雷根據 gsl-doc-pdf 給出如何使用 GSL 的程式介面和常式。GSL 的程式使用的標頭檔一般放在 /usr/include/gsl/ 目錄(libgsl0-dev),
C 程式通常用 #include 讓預先處理程式 cpp 讀入對應的函數、宏聲明,串連的時候通過 -lgsl -lgslcblas 到對應的庫,通常還可能串連到 -lm。為了
使用某些 inline 函數,可以開啟 HAVE_INLINE 宏。注意由於 long double 和使用平台相關,一般不推薦使用。
GSL 裡面的命名規則大致是使用 gsl 作為首碼(沒有 namespace,sigh),函數的話一般是 gsl_foo_fn(對應 double)其餘的為 gsl_foo_type_fn,對於類型一般是 gsl_foo 或者 gsl_foo_type(沒有 template,sigh again)。對應的標頭檔一般是 gsl_foo.h(含有所有的類型)或者 gsl_foo_type.h。
GSL 裡面出錯處理遵循 POSIX 線程庫,正常返回 0,出錯返回非零,並依照 gsl_errno.h 裡面設定出錯值。可以用 gsl_strerror 將傳回值用字串表達出來。預設情況下 GSL 提供的 error handler 就是列印出錯問題並調用 abort,這是一個 gsl_error_handler_t 類型的函數,可以通過 gsl_set_error_handler() 函數設定。
Mathematical Functions 常用數學函數 gsl_math.h
包括常用的數學常數(M_*),GSL_POSINF、GSL_NEGINF、GSL_NAN 以及相應判斷的函數 gsl_isnan()、gsl_isinf() 和 gsl_finite()。另外提供了一些函數值快速計算的方法,gsl_log1p() 計算 log( 1 + x),gsl_exp1m() 計算 ex-1,gsl_hypot() 和 gsl_hypot3 計算歐氏空間範數,gsl_acosh()、gsl_asinh()、gsl_atanh() 是反雙曲函數,gsl_ldexp(x, y) 計算 x . 2y,gsl_frexp() 計算在二進位下科學記號標記法下 x 的基數部分。求冪次 gsl_pow_int 或者 gsl_pow_n(n = 2, ..., 9)。測試符號 GSL_SIGN,奇偶性 GSL_IS_EVEN 和 GSL_IS_ODD。取大小 GSL_MAX、GSL_MIN。浮點數大小最好用 gsl_fcmp 函數。
Complex Numbers 複數 gsl_complex.h、gsl_complex_math.h
定義一個複數可以用 gsl_complex_rect 或者 gsl_complex_polar,另外獲得實部、虛部 GSL_REAL 和 GSL_IMAG,設定 GSL_SET_COMPLEX,GSL_SET_REAL 和 GSL_SET_IMAG。可以求輻角 gsl_complex_arg()、模長 gsl_complex_abs()、模長平方 gsl_complex_abs2、模長對數 gsl_complex_logabs()。複數的加減乘除就是 gsl_complex_op() 其中 op 可以為 add、sub、mul 和 div,另外和實數有類似的運算 gsl_complex_op_real(),和虛數有 gsl_complex_op_imag(),共軛 gsl_complex_conjugate()、逆 gsl_complex_inverse() 和相反數 gsl_complex_negative。另外如求平方根 gsl_complex_sqrt(對實數求加 _real),冪次 gsl_complex_pow(次數為實數加 _real),指數 gsl_complex_exp,對數 gsl_complex_log(loh10 或者 log_b)。另外還有三角函數、反三角函數、雙曲函數、反雙曲函數。
Polynomial 多項式 gsl_poly.h
一般可以給定多項式的係數,用一個數組從低階到高階,調用 Horner 法求多項式函數值可以用 gsl_poly_eval(),對複數而言是 gsl_poly_complex_eval(),對複係數多項式為 gsl_complex_poly_complex_eval()。另外一種表達方式是使用 Newton 差分法表達,這時輸入的是差分節點建立一個多項式,gsl_poly_dd_init(),求函數值可用 gsl_poly_dd_eval(),還可以把這種類型的多項式轉換成為 Taylor 展開的形式 gsl_poly_dd_taylor()。對二次多項式求解根可以用 gsl_poly_solve_quadratic(),複根可以用 gsl_poly_complex_solve_quadratic()。對三次方程用 cubic 替換 quadratic。對高於 4 次的多項式沒有解析解,往往用矩陣特徵值進行近似,GSL 提供了一種解法,首先用 gsl_poly_complex_workspace_alloc() 分配儲存根的空間,然後調用 gsl_poly_complex_solve() 求解,求解之後應該用 gsl_poly_complex_workspace_free() 釋放。
Special Functions 特殊函數 gsl_sf.h、gsl_sf_*.h
一般有兩種調用形式,一種和正常函數類似直接 gsl_sf_function(),另一種是 gsl_sf_function_e() 將傳回值的地址傳入函數。gsl_sf_result.h 提供了一個用於估計誤差的結構體,一般函數有三個 mode 控制計算精度 GSL_PREC_DOUBLE、GSL_PREC_SINGLE 和 GSL_PREC_APPROX。提供的特殊函數有 airy(見 gsl_sf_airy.h)的函數值、零點、導數、導數零點,Bessel 函數(見 gsl_sf_bessel.h)的函數值、零點,Clausen 函數(見 gsl_sf_clausen.h),Coulomb 函數(見 gsl_sf_coulomb.h),Coupling 係數(見 gsl_sf_coupling.h),Dawson 函數(見 gsl_sf_dawson.h),Debye 函數(見 gsl_sf_debye.h),Dilogorithm 函數(見 gsl_sf_dilog.h),乘法誤差函數(見 gsl_sf_elementary.h),橢圓積分(見 gsl_sf_ellint.h),Jacobi 橢圓函數(見 gsl_sf_elljac.h),誤差函數(見 gsl_sf_erf.h,GNU libc 也有類似的函數),指數函數(見 gsl_sf_exp.h),指數積分(見 gsl_sf_expint.h),Fermi-Dirac 函數(見 gsl_sf_fermi_dirac.h),Gamma 和 Beta 函數(見 gsl_sf_gamma.h),Gegenbauer 函數(見 gsl_sf_gengenbauer.h),超幾何函數(見 gsl_sf_hyperg.h),Laguerre 函數(見 gsl_sf_laguerre.h),Lambert W 函數(見 gsl_sf_lambert.h),Legendre 函數和球面調和函數(見 gsl_sf_legendre.h),對數及其相關函數(見 gsl_sf_log.h),Mathieu 函數(見 gsl_sf_mathieu.h),冪函數(見 gsl_sf_pow_int.h),Psi(digamma) 函數(見 gsl_sf_psi.h),Synchrotron 函數(見 gsl_sf_synchrotron.h),transport 函數(見 gsl_sf_transport.h),三角雙曲函數(見 gsl_sf_trig.h),Zeta 函數(見 gsl_sf_zeta.h)。
Vectors and Matrices 向量與矩陣 gsl_block.h、gsl_vector.h、gsl_matrix.h
建立 vector 也好、matrix 也好,都依賴 gsl_block 這個結構,可以用 gsl_block_alloc() 和 gsl_block_calloc() 分配,gsl_block_free() 釋放,另外有對流的輸入輸出,如 gsl_block_fread()、gsl_block_fwrite()、gsl_block_fprintf() 和 gsl_block_fscanf()。不管是 vector 還是 matrix 都含有一個 gsl_block 的指標,操作和 block 類似。如 vector 的的類似操作就是 gsl_vector_alloc()、gsl_vector_calloc()、gsl_vector_fread()、gsl_vector_fwrite()、gsl_vector_fprintf() 和 gsl_vector_fscanf(),另外可以通過 gsl_vector_get() 和 gsl_vector_set() 獲得/設定某一分量的值,gsl_vector_ptr() 和 gsl_vector_const_ptr() 獲得一分量的地址,另外有一些函數方便初始 vector,如 gsl_vector_set_all()、gsl_vector_set_zero() 和 gsl_vector_set_basis()。為了訪問一個 vector 元素的子集,可以使用 vector view 對象,這可以用一些函數產生(有對應的 const 版本),並最好僅僅在 stack 內使用(也就是直接操作對象本身,而不是指標),如 gsl_vector_subvector() 產生一個連續的子集,gsl_vector_subvector_with_stride() 產生一個帶固定間隔的子集,gsl_vector_complex_real() 和 gsl_vector_complex_imag() 產生一個 real 或者 image 部分的 view,gsl_vector_view_array() 對一個數組產生 vector view,gsl_vector_view_array_with_stride() 產生帶有固定間隔的 vector view。vector 之間的複製或者互換有 gsl_vector_memcpy() 和 gsl_vector_swap()。vector 元素之間互換 gsl_vector_swap_elements(),逆序 gsl_vector_reverse()。vector 之間的四則運算 gsl_vector_op(),數乘(op = scale),加上常數(op=add_constant)。vector 最大最小(op=max、min、minmax)或者對應的 index(op = max_index、min_index、minmax_index)。判斷一個 vector 是否為 0 向量(op=isnull),正(ispos),負(isneg),非負(isnonneg)。matrix 和 vector 稍微不同之處在於用兩個下標索引,前面函數多數只要把 vector 換成 matrix 即可。另外還可以為 matrix 的行或者列建立 view,gsl_matrix_(sub)row/column(),或者對角元素 gsl_matrix_(sub, super)diagonal()。將矩陣一行/列讀到/寫到一個 vector 可以用 gsl_matrix_get/set_row/col()。矩陣行列互換 gsl_matrix_swap_rows/columns() 或者方陣的行列交換 gsl_matrix_swap_rowcol(),轉置或轉置複製 gsl_matrix_transpose()、gsl_matrix_transpose_memcpy()。矩陣運算中 mul_elements 和 div_elements 是對元素的。
Permutations 置換 gsl_permutation.h
這是產生置換的基本資料結構,一般用 gsl_permutation_(c)alloc() 分配記憶體,gsl_permutation_init() 初始化為置換么元,可以用 gsl_permutation_memcpy() 進行複製,gsl_permutation_free() 釋放。訪問置換元素可以用 gsl_permutation_get(),互換用 gsl_permutation_swap()。另外可以用 gsl_permutation_size() 獲得置換大小,gsl_permutation_data() 獲得指向置換的指標,gsl_permutation_valid() 驗證是否為合法的 permutation。另外有一些置換的操作,如 gsl_permutation_reverse() 逆轉,gsl_permutation_inverse() 求逆,依照字典序計算下一個/前一個有 gsl_permutation_next/prev()。將 permutation 應用到數組上可以用 gsl_permute,或者逆 psl_permute_inverse(),對 vector 可以 gsl_permute_vector(_inverse)(),幾個置換可以相乘 gsl_permutation_mul()。類似的 permutation 也有輸入輸出函數。另外置換存在一種正則表達方式可以用 gsl_permutation_linear_to_canonical() 轉換,可以計算一個 permutation 含有幾個 cycle 等。
Combinations 組合 gsl_combination.h
和置換類似的結構,但是處理的是組合問題。
Sorting 排序 gsl_heapsort.h、gsl_sort_*.h
首先提供了一個 quick sort 的補充的 heapsort,gsl_heapsort() 和 gsl_heapsort_index()。排序數組 or vector 可以用 gsl_sort() 或者 gsl_sort_vector(),另外也有帶索引的版本。求最小/大的 k 個元素,可以用 gsl_sort(_vector)_smallest/largest(_index)()。
BLAS Support 基本線性代數子程式支援 gsl_blas.h、gsl_cblas.h
BLAS 支援三個 level 的運算,level 1 是 vector 的,level 2 是 matrix-vector 的,level 3 是 matrix-matrix 的操作。操作對象的類型為 SDCZ 對應 float、double、float complex 和 double complex,矩陣的特性為 GE(一般)、GB(一般帶狀矩陣)、SY(對稱)、SB(對稱帶狀)、SP(對稱,packed)、HE、HB、HP(Hermite)、TR、TB、TP(三角陣)。操作類型有 DOT(內積)、AXPY(a x + y)、MV(矩陣 x 向量)、SV(矩陣逆乘向量)、MM(矩陣相乘)、SM(矩陣的逆乘另外一個矩陣)。GSL 提供的命令形式為 gsl_blas_*。
Linear Algebra 線性代數 gsl_linalg.h
這部分包括了最常用的數值線性代數運算,如矩陣 LU 分解求解線性方程組(帶 permutation,可以 inplace 等版本),QR 分解(包括選取列的),SVD,Cholesky 分解,實對稱矩陣的對角化分解(本徵分解),Hermite 矩陣的對角化分解,實矩陣的 Hessenberg 分解,實矩陣對的 Hessenberg 分解,雙對角化(bidiagonalization),Householder 變換,Householder 變換求解線性方程組,三對角陣,balancing(通過相似變換使得行列的範數相當)。
Eigensystems 求解特徵值 gsl_eigen.h
這部分包括實對稱矩陣的特徵值、Hermite 矩陣的特徵值,以及非對稱矩陣的特徵值(利用 Schur 分解)以及對應的廣義特徵值問題求解的函數。一般需要 alloc 一個 workspace,然後調用對應的Function Compute特徵值、特徵向量,最後 free 掉 workspace。另外還提供了對應的函數用於同時整理特徵值與特徵向量。
Fast Fourier Transform 快速 Fourier 變換 gsl_fft_*.h
快速 Fourier 變換這裡分成了對複數、實數(更困難一些,需要保證逆變換獲得是實數,使用的也是 halfcomplex 表達係數)兩種處理。而對於資料為 2 的冪次的可以直接用 Cooley-Tuckey 演算法,不是的話另外有一套演算法(需要預先分配 workspace)。每套演算法提供 forward(計算 Fourier 變換),inverse(逆變換),backward(不帶正常化常數的逆變換)和 transform(通過參數選擇 forward 還是 backward)。
Numerical Integration 數值積分 gsl_integration.h
函數命名方式是 gsl_integration_*(),Q 表示 quadrature routine,N 和 A(表示是否自適應),G 和 W(一般積分和帶權值函數的積分),S 和 P(容易消解的奇點或者提供特別困難的點),I(無窮積分),O(振蕩積分),F(Fourier 積分),C(Cauchy 主值)。積分裡面設定停止條件是設定相對誤差或者絕對誤差。
Random Number Generation 隨機數產生器 gsl_rsg.h
首先需要 gsl_rng_alloc() 一個對應的類型,然後 gsl_rng_set() 設定 seed,gsl_rng_free() 釋放。同時還可以通過環境變數 GSL_RNG_TYPE 和 GSL_RNG_SEED 以及函數 gsl_rng_env_setup() 擷取,然後通過設定對應的產生器就可以利用 gsl_rng_uniform() 產生 [0, 1) 的均勻分布,gsl_rng_uniform_pos() 產生 (0, 1) 的均勻分布,以及 gsl_rng_uniform_int() 產生指定範圍內的均勻整數分布。另外可以通過 gsl_rng_name() 獲得該產生器的名稱,gsl_rng_get() 返回一個在 gsl_rng_min() 和 gsl_rng_max() 之間的隨機數。如果需要更細緻的處理產生器,還提供了一些函數用於處理它的狀態 IO。另有一章詳細介紹各種分布下隨機數的產生情況。
Quasi Random Sequences 擬隨機序列 gsl_qrng.h
與前一章不同的是不需要初始 seed,調用結構和前一章類似。
Random Number Distribution 隨機數分布 gsl_randist.h
這裡包含了絕大多數常用分布,命名規則如下 gsl_ran_dist(_),這裡 dist 是分布名稱,如 gaussian 等,後如果沒有 _ 表示產生隨機數,如果 _pdf 是密度,分布函數用了兩種形式,一般是 cdf_dist_P 和 cdf_dist_Q 以及對應的逆 Pinv 和 Qinv。一共有下面幾種分布,gaussian、gaussian_tail、bivariate_gaussian、exponential、laplace、exppow、cauchy、rayleigh、rayleigh_tail、landau、levy、levy_skew、gamma、flat、lognormal、chisq、fdist、tdist、beta、logistic、pareto、dir_2d、weibull、gumbel1、gumbel2、dirichlet。對於離散分布,有限個取值可以用 gsl_ran_discrete_preproc() 將分布密度列(或者差一個 scale factor)轉換成為一個 gsl_ran_discrete_t 類型的結構,並傳遞給 gsl_ran_discrete() 產生隨機數,gsl_ran_discrete_pdf() 產生分布列,產生的結構可以用 gsl_ran_discrete_free() 釋放。另外提供了 poisson、bernoulli、binomial、multinomial、negative_binomial、pascal、geometric、hypergeometric、logarithmic。除了分布函數,還可以把指定序列隨機打亂 gsl_ran_shuffle()、隨機選元素 gsl_ran_choose()、選擇一個子集 gsl_ran_sample()。
Statistics 統計 gsl_stats.h
主要提供統計函數,如求均值 gsl_stats_mean(),子樣方差(無偏) gsl_stats_variance()、子樣方差(已知期望,有偏) gsl_stats_variance_m(),標準差兩個版本 std 和 std_m,與期望平方和 tss 和 tss_m,另外兩個是 variance_with_fixed_mean 和 sd_with_fixed_mean。絕對偏差 absdev 和 absdev_m,skew 用 skew、skew_m_sd,峰度 kurtosis 和 kurtosis_m_sd,自相關性 lag1_autocorrelation 和 lag1_autocorrelation_m,共變數 covariance 和 covariance_m,相關係數 correlation,另外有對應的帶權值版本在前面加上 w 即可。另外也提供了最大最小以及對應 index 的函數,計算中位元以及分位元的函數。
Histograms 長條圖 gsl_hostogram*.h
分一維和兩維,差異不大,主要把一維的增加新的一個變數,命名在 histogram 後面加 2d 即可。大致使用的方法是,首先 gsl_histogram_alloc() 分配空間,然後 gsl_histogram_set_ranges 設定節點(或者用 gsl_histogram_set_ranges_uniform() 設定均勻的節點),最後 gsl_histogram_free()。另外還提供了複製 gsl_histogram_memcpy() 以及自身複製 gsl_histogram_clone() 的函數。可以通過 gsl_histogram_increment() 增加元素到計數,也可以 gsl_histogram_accumulate() 增加任意權值(計數器用的實數),可以獲得某個 bin 的權值 gsl_histogram_get(),或者某個 bin 上下界 gsl_histogram_get_range(),整個 histogram 的上下界 gsl_histogram_min/max(),bin 的數目 gsl_histogram_bins(),而 gsl_histogram_reset() 將整個 histogram 清零。gsl_histogram_find() 返回某個值所在的 bin。另有 max/min_val/bin 返回最大值或者出現的 bin,還有利用這個 histogram 計算 mean、sigma(標準差)、sum。另外兩個 histogram 可以用 gsl_histogram_equal_bins_p() 看看是否可以使用 add/sub/mul/div 等運算,shift 可以讓所有值 + 常數,scale 是乘。還有一些 IO 的函數。可以用 gsl_histogram 來建立一個 gsl_histogram_pdf,這個就和前面講的隨機數一樣用。
N-tuples N 元組 gsl_ntuple.h
非常簡單的資料結構,用於把資料寫入/讀出檔案,提供的基本操作有 gsl_ntuple_create() 建立一個空檔案(截斷已存在),gsl_ntuple_open() 開啟已存在檔案,或者 gsl_ntuple_write() 將 ntuple 寫入檔案,或者從檔案中讀入 ntuple 資料 gsl_ntuple_read(),最後需要 gsl_ntuple_close() 關閉。可以把一個 ntuple 資料讀入餵給 histogram 進行統計,這主要使用 gsl_ntuple_project() 函數。
Monte Carlo Integration 蒙特卡羅積分 gsl_monte_*.h
實現的是最基本的三種積分方法,在 gsl_monte.h 裡面聲明了積分函數的基本形式 gsl_monte_function,在 gsl_monte_plain.h 提供的是最簡單均勻採樣積分方法,首先 gsl_monte_plain_alloc() 分配 workspace,gsl_monte_plain_init() 初始化,然後 gsl_monte_plain_integrate() 積分,最後 gsl_monte_plain_free() 釋放 workspace。在 gsl_monte_miser.h 裡面使用的分層蒙特卡羅積分,可以用 gsl_monte_miser_state 結構控制演算法細節。而 gsl_monte_vegas.h 是使用 impartance sampling,gsl_monte_vegas_state 控制演算法細節。複雜的 MCMC 等這裡並沒有實現。
Simulated Annealing 類比退火 gsl_siman.h
只有一個函數 gsl_siman_solve(),提供最佳化函數等資訊即可使用。
Ordinary Differential Equations 常微分方程 gsl_odeiv.h
主要使用 gsl_odeiv_system 結構,需要提供方程標準形式的函數和偏導(即 Jacobi 矩陣)。另外和演算法相關的是 stepping function,如 Runge-Kutta 方法等,也有自適應版本的,這種函數的目的是為了計算指定一個 step 下函數值。GSL 還提供了計算一個區間內函數變化(若干 step)的函數(evolve)。但是由於對常微分方程數值解不很瞭解,這裡就略去吧。
Interpolation 插值 gsl_spline.h、gsl_interp.h
提供了三次樣條和 Akima 樣條。比較 low-level 的函數為使用者提供了非常細緻的控制,通過 gsl_interp_alloc() 分配需要的空間,選擇適當的演算法,gsl_interp_init() 初始化節點,最後 gsl_interp_free() 釋放。為了搜尋某個位置(以便計算函數值)可以用 gsl_interp_bsearch(),也可以使用 gsl_interp_accel 對象(先 init,然後 find 和 free)。另外提供了最常用的函數值、一階導、二階導和積分以及對應使用 gsl_interp_accel 的介面。high-level 的函數主要在 gsl_spline.h 裡面提供。和 gsl_interp_* 系列相似。
Numerical Difference 差分 gsl_deriv.h
提供了中心差分 gsl_derive_central()、前向 gsl_deriv_forward()、後向 gsl_deriv_backward()。
Chebyshev Approximation 車比雪夫逼近 gsl_chebyshev.h
提供了 [-1, 1] 上一組正交多項式,這對應的是 1/sqrt(1-x^2) 為權的函數空間。首先用 gsl_cheb_alloc() 分配空間產生 gsl_cheb_series 結構,然後 gsl_cheb_init(),最後 gsl_cheb_free()。提供了計算函數值、函數值誤差,導函數和積分。
Series Acceleration 級數加速 gsl_sum.h
提供了一個 Levin u-transform 的東西,沒聽說過。其意義在於減少求和項,提高計算精度。使用方式就是通過 gsl_sum_levin_u_alloc() 分配 workspace,繼而通過 gsl_sum_levin_u_accel() 分配,最後 gsl_sum_levin_free()。如果不需要估計誤差,則可以更快。
Wavelet Transform 小波變換 gsl_wavelet*.h
與 FFT 類似,但是沒有 backward 類型,分一維和二維,有 daubechies、haar 和 bspline。
Discrete Hankel Transform 離散漢克爾變換 gsl_dht.h
與 FFT 類似,但是是對極座標的,調用方式和 FFT 類似。
One-dimensional Root Finding 一維函數求零點 gsl_roots.h
有兩種方式(基於搜尋 gsl_root_fsolver 和基於導數 gsl_root_fdfsolver)。首先選取合適的 solver,命名方式都是 gsl_root_*solver_type,然後 alloc。之後可以用 gsl_root_*solver_set() 設定初始態,開始迭代使用 gsl_root_*solver_iterate(),也可以直接用 gsl_root_*solver_root() 求出根。另可以 gsl_root_fsolver_x_upper() 和 gsl_root_fsolver_x_lower() 返回控制根的區間。通過 gsl_root_test_*() 可以測試相對誤差、殘差。提供的演算法有 bisection、falsepos 和 brent,利用梯度的有 newton、secant、steffenson。
One-dimensional Minimization 一維函數求極小 gsl_min.h
最小化在某種意義上就是求導函數的零點。因此調用方法和前一章極為類似。演算法有 goldensection 和 brent。
Multi-dimensional Root Finding 多維函數求零點 gsl_multiroots.h
類似。演算法有 hybridsj,hybridj,newton,gnewton。不用梯度的演算法有 hybrids,hybrid,dnewton,broyden。
Multi-dimensional Minimization 多維函數求極小 gsl_multimin.h
類似。演算法有 conjugate_fr、conjugate_pr、bfgs、bfgs2、steepest_descent、nmsimplex。
Least Square Fitting 最小二乘擬合 gsl_fit.h
分單變數和多變數。gsl_fit_linear() 和 gsl_fit_wlinear() 分別是線性和加權線性問題的單變數擬合(即線型迴歸),另外 gsl_fit_linear_est() 還估計誤差。多元情形為 gsl_fit_mul()、gsl_fit_wmul() 與 gsl_fit_mul_linear()。對廣義的 LSF 問題,需要使用 gsl_multifit_linear_alloc() 分配 workspace,最後釋放,類似的函數有 gsl_multifit_linear 和 weighted 版本,另有 _svd 版本,使用 SVD 計算結果。
Nonlinear Least Square Fitting 非線性最小二乘擬合 gsl_multifit_nlin.h
與多維函數最小化類似。
Basic Splines 基礎樣條 gsl_bspline.h
先 gsl_bspline_alloc() 產生 workspace,然後 gsl_bspline_knots() 或者 gsl_bspline_knots_uniform() 設定節點,gsl_bspline_eval() 計算函數值,最後 gsl_bspline_free() 釋放空間。
Physical Constants 物理常數 gsl_const_mksa.h
各種可能用到的物理常數,命名一般為 GSL_CONST_MKSA_*。
IEEE Floating Point Arithmetic 浮點算術 gsl_ieee_utils.h
提供了輸出 float 和 double 的 gsl_ieee_printf_*,另外可以用 gsl_ieee_env_setup() 設定對應的計算環境。
GNU scientific library