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() 设置对应的计算环境。