フリーライブラリgslをC言語で楽にベクトル計算や数値積分(gnu scientific library)。

gslを使うとC言語などでベクトル計算、積分計算、行列計算、特殊計算、最適化などができる。
フリーのライブラリ。


cygwingccとgslをインストールしているとして、
の状況を書く。


参考1:
http://www.db.is.kyushu-u.ac.jp/rinkou/cygwin/gslfuncs.html


1)例1 特殊関数

#include<stdio.h>
#include<gsl/gsl_sf_bessel.h>

int main(){

        double y;

        y=gsl_sf_bessel_J0(1.2);
        printf("%lf\n",y);
}

コンパイルと実行。

gcc netnagashi.c -lgsl 
./a.exe
0.67113

上はcygwinの場合。
ubuntuの場合は、

gcc netnagashi.c -lgsl -lgslcblas
./a.exe
0.67113


2)例2 0べクトルの作成
ベクトル出力関数: gsl_vector_fprintf(stream s,gsl_vector v,format f)
ゼロベクトル作成関数(要素i個):gsl_vector_calloc(int i); 

#include<stdio.h>
#include<gsl/gsl_vector.h>

int main(){

       
        gsl_vector *v=gsl_vector_calloc(4);
        gsl_vector_fprintf(stdout,v,"%E");

        close(f);
        gsl_vector_free(v);

}

コンパイル実行

$gcc test2.c -lgsl
$ ./a.exe
0.000000E+00
0.000000E+00
0.000000E+00
0.000000E+00

例3)ベクトルの四則演算とファイル出力。
四則演算
gsl_vector_add(gsl_vector v1,gsl_vector v2);
v1=v1+v2 という処理。
gsl_vector_sub(v1,v2);
gsl_vector_mul(v1,v2);
gsl_vector_div(v1,v2);
など。

ファイル出力
gsl_vector_fprintf(stream f,gsl_vector v1,format "%E");

ベクトルの初期化
gsl_vector_set_all(gsl_vector v1,double c);
すべての要素をcにする。
v1=(c,c,c,c)のベクトルにする。

#include<stdio.h>
#include<gsl/gsl_vector.h>

int main(){

        FILE *f;
        f=fopen("test.txt","w");

        gsl_vector *v1=gsl_vector_calloc(4);

        gsl_vector *v2=gsl_vector_calloc(4);
        gsl_vector_set_all(v1,1.0);
        gsl_vector_set_all(v2,3.0);
        fprintf(f,"Initial\n")  ;
        gsl_vector_fprintf(f,v1,"%E");
        gsl_vector_fprintf(f,v2,"%E");

        fprintf(f,"Tashizan \n")        ;
        gsl_vector_add(v1,v2);
        gsl_vector_fprintf(f,v1,"%E");

        fprintf(f,"Hikizan \n") ;
        gsl_vector_sub(v1,v2);
        gsl_vector_fprintf(f,v1,"%E");

        fprintf(f,"Kakezan \n") ;

        gsl_vector_mul(v1,v2);
        gsl_vector_fprintf(f,v1,"%E");

        fprintf(f,"Warizan \n") ;
        gsl_vector_div(v1,v2);
        gsl_vector_fprintf(f,v1,"%E");

        fprintf(f,"Teisuubai \n")       ;
        gsl_vector_scale(v1,0.0003);
        gsl_vector_fprintf(f,v1,"%E");

        fprintf(f,"Teisuwa \n") ;
        gsl_vector_add_constant(v1,5);
        gsl_vector_fprintf(f,v1,"%E");


        close(f);
        gsl_vector_free(v1);

        gsl_vector_free(v2);

}

コンパイル実行。

$ gcc gsltest3.c -lgsl
$ ./a.exe
$cat test.txt
Initial
1.000000E+00
1.000000E+00
1.000000E+00
1.000000E+00
3.000000E+00
3.000000E+00
3.000000E+00
3.000000E+00
Tashizan
4.000000E+00
4.000000E+00
4.000000E+00
4.000000E+00
Hikizan
1.000000E+00
1.000000E+00
1.000000E+00
1.000000E+00
Kakezan
3.000000E+00
3.000000E+00
3.000000E+00
3.000000E+00
Warizan
1.000000E+00
1.000000E+00
1.000000E+00
1.000000E+00
Teisuubai
3.000000E-04
3.000000E-04
3.000000E-04
3.000000E-04
Teisuwa
5.000300E+00
5.000300E+00
5.000300E+00
5.000300E+00