GNU Scientific Libraryを呼び出す


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

libgsl.dll
メインの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);

次のサンプルOCファイルでは、gsl_sf_zeta_int と gsl_fit_linear の呼び出し方を示しています。

test_gsl.c

#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;