应用介绍
GNU Scientific Library (GSL) 是一个由 GNU 项目开发的开放源代码数值计算库,提供了广泛的数学和科学计算功能。GSL 使用 C 语言编写,并且可以与 C++ 等其他语言的项目无缝集成,是科学研究和工程计算中常用的工具。
GSL 提供的功能模块
矩阵和向量操作(创建、分解、操作等)。
支持常用矩阵分解方法,如 LU 分解、QR 分解、特征值和特征向量计算。
提供大量伪随机数生成器和分布函数(如均匀分布、正态分布、泊松分布等)。
方便进行随机化模拟和蒙特卡罗实验。
一维积分(数值求解)。
常微分方程(ODE)的数值解法。
函数的最小值和最大值求解(支持一维和多维)。
梯度和无梯度优化算法。
提供科学计算中常用的特殊函数,包括伽马函数、贝塞尔函数、误差函数等。
数据拟合(线性和非线性最小二乘拟合)。
数据插值(线性插值、多项式插值、样条插值等)。
提供均值、方差、协方差、相关系数等统计工具。
支持常见的统计分布及其相关计算。
支持快速傅里叶变换(FFT),适合信号处理应用。
组合数学(排列、组合等)。
蒙特卡罗积分。
复杂数操作。
多项式求解和拟合。
加载环境
## gcc 环境变量
export PATH=/opt/app/gcc/9.5.0_gcc4.8.5/bin:$PATH
export LD_LIBRARY_PATH=/opt/app/gcc/9.5.0_gcc4.8.5/lib64:$LD_LIBRARY_PATH
export LIBRARY_PATH=/opt/app/gcc/9.5.0_gcc4.8.5/lib:/opt/app/gcc/9.5.0_gcc4.8.5/lib64:$LIBRARY_PATH
export C_INCLUDE_PATH=/opt/app/gcc/9.5.0_gcc4.8.5/include:$C_INCLUDE_PATH
export CPATH=/opt/app/gcc/9.5.0_gcc4.8.5/include:$CPATH
## gsl 环境变量
export PATH=/opt/app/gsl/2.8/bin:$PATH
export LIBRARY_PATH=/opt/app/gsl/2.8/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/app/gsl/2.8/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/opt/app/gsl/2.8/include:$C_INCLUDE_PATH
export CPATH=/opt/app/gsl/2.8/include:$CPATH
使用说明
先创建一个目录gsltest并进入该目录:
mkdir gsltest
cd gsltest
在该目录下创建如下测试文件mygsl.c
#include <stdio.h>
#include <gsl/gsl_linalg.h>
int main()
{
double a_data[] = {1.0, 0.6, 0.0, 0.0, 1.5, 1.0, 0.0, 1.0, 1.0};
double inva[9];
int s, i, j;
gsl_matrix_view m = gsl_matrix_view_array(a_data, 3, 3);
gsl_matrix_view inv = gsl_matrix_view_array(inva, 3, 3);
gsl_permutation *p = gsl_permutation_alloc(3);
printf("The matrix is\n");
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 3; ++j)
{
printf(j == 2 ? "%6.3f\n" : "%6.3f ", gsl_matrix_get(&m.matrix, i, j));
}
}
gsl_linalg_LU_decomp(&m.matrix, p, &s);
gsl_linalg_LU_invert(&m.matrix, p, &inv.matrix);
printf("The inverse is\n");
for (i = 0; i < 3; ++i)
{
for (j = 0; j < 3; ++j)
{
printf(j == 2 ? "%6.3f\n" : "%6.3f ", gsl_matrix_get(&inv.matrix, i, j));
}
}
gsl_permutation_free(p);
return 0;
}
编译并执行程序
gcc mygsl.c -o mygsl -lgsl -lgslcblas -lm
./mygsl
执行结束后可看到如下结果
The matrix is
1.000 0.600 0.000
0.000 1.500 1.000
0.000 1.000 1.000
The inverse is
1.000 -1.200 1.200
0.000 2.000 -2.000
-0.000 -2.000 3.000