GNU Scientific Library

GNU Scientific Library (ou GSL) est une bibliothèque libre écrite en C fournissant des outils de calculs numériques.

La GSL fournit des outils dans les domaines suivants :

  • Fonctions des bases en mathématiques
  • Nombre complexe
  • Polynômes
  • Fonctions spéciales
  • Espaces vectoriels, matrices
  • Permutations
  • Combinaison (mathématiques)
  • Tri
  • Programme d'algèbre linéaire basique (BLAS)
  • Algèbre linéaire
  • Eigensystems
  • Décomposition en valeurs singulières‎
  • Transformée de Fourier rapide
  • Calcul numérique d'une intégrale
  • Générateur de nombres aléatoires
  • Séquences quasi-aléatoires
  • Distribution de probabilités
  • Statistiques
  • Histogrammes
  • N-tuples
  • Intégration de Monte-Carlo
  • Simulated annealing
  • Équations différentielles
  • Interpolation numérique
  • Numerical differentiation
  • Approximations de Chebyshev
  • Accélération de suites
  • Transformation de Hankel
  • Algorithme de recherche d'un zéro d'une fonction
  • Optimisation en une et plusieurs dimensions
  • Méthode des moindres carrés
  • Algorithme de Levenberg-Marquardt
  • Constantes physiques
  • IEEE floating-point arithmetic

Versions installées

  • 1.15 Compilée avec gcc
$ module avail numlib/gsl
numlib/gsl/1.15

Exemples

Le programme résout le système linéaire A x = b.

   [ 0.18 0.60 0.57 0.96 ] [x0]   [1.0]
   [ 0.41 0.24 0.99 0.58 ] [x1] = [2.0]
   [ 0.14 0.30 0.97 0.66 ] [x2]   [3.0]
   [ 0.51 0.13 0.19 0.85 ] [x3]   [4.0]
Algebre.c
#include <stdio.h>
#include <gsl/gsl_linalg.h>
 
     int
     main (void)
     {
       double a_data[] = { 0.18, 0.60, 0.57, 0.96,
                           0.41, 0.24, 0.99, 0.58,
                           0.14, 0.30, 0.97, 0.66,
                           0.51, 0.13, 0.19, 0.85 };
 
       double b_data[] = { 1.0, 2.0, 3.0, 4.0 };
 
       gsl_matrix_view m = gsl_matrix_view_array (a_data, 4, 4);
 
       gsl_vector_view b = gsl_vector_view_array (b_data, 4);
 
       gsl_vector *x = gsl_vector_alloc (4);
 
       int s;
 
       gsl_permutation * p = gsl_permutation_alloc (4);
 
       gsl_linalg_LU_decomp (&m.matrix, p, &s);
 
       gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
 
       printf ("x = \n");
 
       gsl_vector_fprintf (stdout, x, "%g");
 
       gsl_permutation_free (p);
       gsl_vector_free (x);
       return 0;
     }

Matrix Multiply

The following program computes the product of two matrices using the Level-3 blas function dgemm,

     [ 0.11 0.12 0.13 ]  [ 1011 1012 ]     [ 367.76 368.12 ]
     [ 0.21 0.22 0.23 ]  [ 1021 1022 ]  =  [ 674.06 674.72 ]
                        [ 1031 1032 ]

The matrices are stored in row major order, according to the C convention for arrays.

gslBlas3.c
     #include <stdio.h>
     #include <gsl/gsl_blas.h>
 
     int
     main (void)
     {
       double a[] = { 0.11, 0.12, 0.13,
                      0.21, 0.22, 0.23 };
 
       double b[] = { 1011, 1012,
                      1021, 1022,
                      1031, 1032 };
 
       double c[] = { 0.00, 0.00,
                      0.00, 0.00 };
 
       gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3);
       gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2);
       gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2);
 
       /* Compute C = A B */
 
       gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
                       1.0, &A.matrix, &B.matrix,
                       0.0, &C.matrix);
 
       printf ("[ %g, %g\n", c[0], c[1]);
       printf ("  %g, %g ]\n", c[2], c[3]);
 
       return 0;  
     }

Tout d'abord il faut charger le module GSL :

$ module load numlib/gsl

Pour connaître les options de compilation :

$ gsl-config --libs  
$ gsl-config --cflags
$ gcc program.c -I$GSL_HOME/include -L$GSL_HOME/lib -o program -lgsl -lgslcblas -lm

Liens