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