Audela |
![]() |
La librairie libgsltcl ajoute des fonctions de calculs scientifique à un interpréteur Tcl. Cette librairie utilise la Gnu Scientific Library:
Le principe général de libgsltcl est de transformer des listes Tcl en vecteurs C qui sont soumis au calcul par les fonctions C de GSL. En retour, libgsltcl, fourni le résultat sous forme d'une liste à l'interpréteur Tcl. Par exemple, pour calculer la transformée de Fourier du vecteur de valeurs 1; 2; 5; 7; 3; 1; -7; -4; -1; 0; on écrira :
set vec {1 2 5 7 3 1 -7 -4 -1 0}
gsl_fft $vec
En retour, la fonction renvoie deux listes qui correspondent aux composantes réelles et imaginaires du résultat de la transformée de Fourier.
Les vecteurs sont de type "liste Tcl" (ListVector). Les matrices sont définies comme des "listes de listes Tcl" (ListMatrix). Par exemple, la matrice :
[ 2 6 7 ]
a = [ 1 2 3 ]
[ 1 9 8 ]
sera codée de la façon suivante en Tcl :
set a { {2 6 7} {1 2 3} {1 9 8} }
On vérifiera que l'élément de la 1ère ligne et 3ième colonne vaut 7:
gsl_mindex $a 1 3
Dans toutes les fonctions, l'ordre des indices d'une matrice est toujours de la forme ligne puis colonne
.Retourne une liste de deux éléments dont les valeurs sont les dimensions (nlignes ncolonnes) de la matrice ListMatrix.
Retourne la valeur de l'élément situé à la position (IndexLig IndexCol) de la matrice ListMatrix.
Remplace la valeur de l'élément situé à la position (IndexLig IndexCol) de la matrice ListMatrix par Value
Retourne la matrice résultat de la transposée de la matrice ListMatrix
Retourne la matrice résultat de la somme algébrique de ListMatrixA et ListMatrixB
Retourne la matrice résultat de la différence algébrique de ListMatrixA et ListMatrixB
Retourne la matrice résultat de la multiplication algébrique de ListMatrixA par ListMatrixB
Retourne la valeur du déterminant de la matrice ListMatrix
Retourne la matrice résultat de l'inverse de la matrice ListMatrix
Retourne le vecteur des valeurs propres et la matrice des vecteurs propres de la matrice ListMatrix. Par exemple :set a { {2 6 7} {1 6 3} {7 3 8} }gsl_meigsym $aRetourne: {13.816095 4.882125 -2.698219} {{0.497108 0.285358 0.819423} {0.365628 -0.925327 0.100428} {0.786892 0.249681 -0.564323}}
Cette fonction permet de trouver les valeurs du vecteur inconnu X définit par B = A*X, où B est un vecteur et A est une matrice. Le vecteur X comporte p lignes (=p inconnues), et B comporte n lignes (=n observations). La matrice A est de dimensions n*p.
Cette fonction permet la résolution d'un système multilinéaire de type y=X*c où :
La condition n>p permet la détermination du vecteur c par une méthode d'ajustement aux moindre carrés. Le meilleur ajustement est recherché en minimisant le chi2 par la formule suivante:
chi2 = (y-X*c)T*w*(y-X*c)
où w est une matrice n*n dont les éléments de la diagonale sont associés aux variances des mesures des n observations. Si l'on ne souhaite pas pondérer les diverses mesures du vecteur y, alors w sera une matrice unitaire. Les valeurs des éléments de la diagonale de la matrice w sont remplies avec les valeurs du vecteur W (paramètre ListVectorW)
En retour, on a une liste de trois éléments:
Exemple : On dispose de n mesures d'un signal (x,y), que l'on souhaite ajuster par une loi parabolique :
y = c(1) + c(2) * x + c(3) *x*x
Le système comporte donc p=3 inconnues à déterminer: c(1), c(2) et c(3). La forme matricielle du système y=X*c, s'écrit :
[ y(1) ] [ 1 x(1) x(1)*x(1) ]
[ y(2) ] [ 1 x(2) x(2)*x(2) ]
... ... [c(1) ]
[ y(i) ] = [ 1 x(i) x(i)*x(i) ] * [ c(2) ]
... ... [c(3) ]
[ y(n) ] [ 1 x(n) x(n)*x(n) ]
Application numérique :
# - definition des mesures
set x {0 1 2 3 4 5 }
set y {0.12 0.95 3.78 9.21 15.43 25.83 }
set w {1 1 1 1 1 1 }
# - calcul de la matrice X
set n [llength $x]
set X ""
for {set i 0} {$i<$n} {incr i} {
set xi [lindex $x $i]
set ligne_i 1
lappend ligne_i $xi
lappend ligne_i [expr $xi*$xi]
lappend X $ligne_i
}
# - calcul de l'ajustement
set result [gsl_mfitmultilin $y $X $w]
# - extrait le resultat
set c [lindex $result 0]
set chi2 [lindex $result 1]
set covar [lindex $result 2]
La variable result vaut : {0.202500 -0.413893 1.096607} 0.674041 {{0.821429 -0.589286 0.089286} {-0.589286 0.726786 -0.133929} {0.089286 -0.133929 0.026786}}
L'interprétation du résultat est que le meilleur ajustement est obtenu par la fonction : y = 0.202500 - 0.413893*x + 1.096607*x*x
Effectue la transformée de Fourier du vecteur ListVector. En retour, on a une liste de deux éléments:
Si l'on a effectué le calcul avec le vecteur ListVectorTime correspondant aux instants de mesure chaque point de ListVector, alors un troisième élément est retourné par la fonction gsl_fft. C'est le vecteur de la valeur des fréquences associées à chaque point de la TF.
Exemple: Nous allons générer un vecteur c(k)=sin(k) dont les valeurs varient sinusoïdalement pour 0<=k<100, puis nous allons visualiser le module de sa transformée de Fourier:
set n 100
set c ""
set t ""
for {set k 0} {$k<$n} {incr k} {
set value [expr sin($k)]
lappend c $value
lappend t $k
}
set fft [gsl_fft $c $t]
set fftr [lindex $fft 0]
set ffti [lindex $fft 1]
set freq [lindex $fft 2]
set module ""
for {set k 0} {$k<$n} {incr k} {
set x [lindex $fftr $k]
set y [lindex $ffti $k]
set value [expr sqrt($x*$x+$y*$y)]
lappend module $value
}
::plotxy::figure 1
::plotxy::plot $freq $module
::plotxy::xlabel "frequency (Hz)"
::plotxy::ylabel "module intensity"
::plotxy::title "FFT of a sinus function"
Cet exemple affiche le résultat sous la forme d'un graphe grâce aux fonctions du namespace ::plotxy disponible dans Audace. Sur le graphe, on remarquera que la fréquence de Nyquist est 0.5Hz (= inverse de deux fois la durée totale du signal temporel). Au delà de 0.5Hz, on assiste à un phénomène d'aliasing.
Effectue la transformée de Fourier inverse des vecteurs ListVectorReal (vecteur des amplitudes réelles) et ListVectorImag (vecteur des amplitudes imaginaires) et retourne un vecteur. Si l'on a effectué le calcul avec le vecteur ListVectorFreq correspondant aux fréquences de mesure de chaque point, alors un second élément est retourné par la fonction gsl_fft. C'est le vecteur de la valeur des instants associées à chaque point de la TF inverse.