GNU scientific library


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,然后調用對應的函數計算特征值、特征向量,最后 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() 設置對應的計算環境。
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM