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