GNU Scientific Libraryを呼び出す


ここでは、OriginCでGSLを使用する方法を紹介します。

Note: v2.5のGSLソースコードからVisual Studioビルド64ビットDLLを使用するには、次の手順に従います。


まず、http://gnuwin32.sourceforge.net/packages/gsl.htmからGSL DLLをダウンロードする必要があります。2つのDLL (libgsl.dllとlibgslcblas.dll)だけが必要で、それらをOrigin Cファイルを保持するのと同じフォルダに置くことができます。例えば、c:\oc\ フォルダに保存します。ダウンロードしたdllを使用する場合、バージョンの問題に注意してください。

libgsl.dll
これはメインのgsl dllです。
libgslcblas.dll
このdllはlibgsl.dllに必要です。


Origin Cでlibgsl.dllを使用するには、gsl関数のプロトタイプを提供するヘッダファイルが必要です。必要に応じて、GSLヘッダーファイルから必要なプロトタイプ/定義をコピーして変換できます。たとえば、ocgsl.hという名前を付け、c:\oc\フォルダに作成します。


ocgsl.h

// dllをロードするとき、正しいバージョンをロードする必要があるので、 
// 上の "バージョンの問題" のリンクを確認
#pragma dll(libgsl, header) 
// これはOCの特別なプラグマで、
// libgsl.dll はこのファイルと同じ場所であることを示すキーワード

#define GSL_EXPORT	// OCでは、これは不要なので空にする

// gsl関数プロトタイプをここで直接検索してコピー可能

GSL_EXPORT double gsl_sf_zeta_int (const int n);

GSL_EXPORT int gsl_fit_linear (const double * x, const size_t xstride,
                               const double * y, const size_t ystride,
                               const size_t n,
                               double * c0, double * c1,
                               double * cov00, double * cov01, double * cov11,
                               double * sumsq);
Note: コードに#pragma dll(libgslcblas, header)を記述しないでください。そうしないとコンパイルエラーが発生する可能性があります。


test_gsl.c

以下は、gsl_sf_zeta_int および gsl_fit_linearの呼び出し方法を示す簡単なOCファイルです。

#include <Origin.h>
#include "ocgsl.h"


// GSLのRiemann Zeta関数を使用したサンプル
void gsl_test_zeta_function()
{
	double result1 = gsl_sf_zeta_int(2);
	double result2 = pi*pi/6;
	
	printf("Zeta(2) = %f\n", result1);
	printf("pi^2/6  = %f\n", result2);
}


// GSLの線形フィットを使用したサンプル
void gsl_test_linear_fit(int npts = 10)
{
	vector vx(npts), vy(npts);
	const double ds = 2, di = 10;
		
	for(int ii=0; ii<npts; ++ii)
	{
		vx[ii] = ii;
		vy[ii] = ii*ds + di + (rand()%100-50)*0.05;
	}
	
	for(ii=0; ii<npts; ++ii)
		printf("%.2f\t%.2f\n", vx[ii], vy[ii]);
	
	double c0, c1, cov00, cov01, cov11, sumsq;
	
	gsl_fit_linear(vx, 1, vy, 1, npts, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
	
	printf("Slope=%f, Intercept=%f", c1, c0);
}


フィット関数内でGSLを使用

このサンプルでも、フィット関数内にgsl関数を使用する方法を示しています。

GSL関数の使用に関する注意事項

Origin Cは、構造体変数を返す外部関数をサポートしていないので、このようなデータを返す関数はOrigin Cでは使用できません。例えば、

gsl_complex gsl_complex_add (gsl_complex a, gsl_complex b)

データの gsl_complex タイプを返し、gsl_complex は次のように定義されます。

typedef struct
{
    double dat[2];
}gsl_complex;