NAG関数をOriginCから呼び出す
OC-Call-NAG
サマリー
NAG関数をOriginCから呼び出すのは別のOriginC関数を呼び出すのとよく似ています。まずはNAG関数についてある程度理解しないとどの値を引数として設定するか、また、算出されるパラメータの意味が分からなくなってしまいます。関数についてある程度理解できたら関数の必要に応じたコードを書かなければなりません。
NAGヘッダファイルには関数に必要なプロトタイプがあり、正確に宣言する必要があるパラメータ、大きさ、そして初期値が含まれています。関数はヘッダファイルに示されているように、このプロトタイプに従って定義されなければなりません。このチュートリアルの目的はNAG関数をOriginCで呼び出す方法を示しています。
必要なOriginのバージョン:Origin 8.1 SR1
学習する項目
このチュートリアルでは、以下の項目について説明します。
- NAG関数を理解する
- サンプルコードのデバッグの準備をする
- NAGヘッダを追加する
- NAG関数の宣言を見るには
- NAGのエラーコードを取得するには
- 関数ポインターを使うには
NAG関数を理解する
NAG関数を理解するのに一番適しているものはNAG ライブラリです。このライブラリはOriginCのレファレンスでも見つけることができます。例えば d01ajc NAG関数について知りたい場合は次のように操作します。
- Originメニューから「ヘルプ:プログラミング:OriginC」を選びます。OriginC Referenceブックを開き、Global Functionsを開きます。それからNAG Function ブックを開き、Accessing NAG Functions Category and Help を開きます。
- Quadrature (d01) カテゴリを選び、それから nag_1d_quad_gen (d01ajc) を選びます。
- 開かれたページはPDFファイルです。nag_1d_quad_gen関数を理解するために、関数自体、プロトタイプ、そしてすべての引数についての説明を必要に応じてご覧ください。また、サンプルデータと関数を呼び出している例がしばしば含まれています。
次に参考にしていただきたいのはOriginCのNAG関数のExamplesです。Originのメニューから「ヘルプ:プログラミング:OriginC」と選び、Exampleを開きます。そしてAnalysisを開いた後、Accessing NAG Functionsを選びます。ここではNAG関数をOriginCで呼び出す例がいくつか示されています。
サンプルコードのデバッグの準備をする
OriginCを使ったNAG関数の呼び出し方を理解するにはデバッグモードで例題をやってみることです。以下の手順に従ってOriginとコードビルダを立ち上げ、サンプルをOriginC関数でデバックモードにします。
- コードビルダのメニューでファイル:新規を選びます。 これで新規ファイルダイアログが開かれます。
- ファイル名のテキストボックスにTestNAGと入力し、ワークスペースに追加のチェックがついていることを確認します。OKをクリックします。すると、TestNAG.cがワークスペースに追加されます。
- 以下の関数をTestNAG.cにコピー&ペーストします。// 関数のヘッダファイルをここに追加します のすぐ下のテキストを忘れないでください。
// 関数のヘッダファイルをここに追加します。
#include <OC_nag8.h>
///////////////////////////////////////////////////////////////
//ここから関数を開始します。
//NAG_CALL は正しい規約を呼び出すためのコードです。関数ポインタ
//のように扱って、積分関数を定義する事ができます。
double NAG_CALL f(double x)
{
return (x*sin(x*30.0)/sqrt(1.0-x*x/(PI*PI*4.0)));
}
void nag_d01ajc_ex()
{
double a = 0.0;
double b = PI * 2.0; //積分範囲
double epsabs, abserr, epsrel, result;
// epsabs と epsrel をそれぞれ次のように設定して
// 必要な精度に達していない時に精度を上げる事ができます。
epsabs = 0.0;
epsrel = 0.0001;
// 積分内の関数を評価するのに必要な最大サブ範囲
// を示します。より複雑な被積分関数になると、
// max_num_subintも大きくなります。
// ほとんどの場合、 200から500 が妥当で、おすすめされます。
int max_num_subint = 200;
Nag_QuadProgress qp;
static NagError fail;
d01ajc(f, a, b, epsabs, epsrel, max_num_subint,
&result, &abserr, &qp, &fail);
// 次の3種類のエラー以外のエラーは、
// 入力したパラメータが悪いか、アロケーションが失敗しています。
// NE_INT_ARG_LT NE_BAD_PARAM NE_ALLOC_FAIL.
// メモリーリークを避けるため、積分ルーチンを呼ぶ前に
// メモリのアロケーションを解放する必要があります。
if (fail.code != NE_INT_ARG_LT &&
fail.code != NE_BAD_PARAM &&
fail.code != NE_ALLOC_FAIL)
{
NAG_FREE(qp.sub_int_beg_pts);
NAG_FREE(qp.sub_int_end_pts);
NAG_FREE(qp.sub_int_result);
NAG_FREE(qp.sub_int_error);
}
printf("%10.6f", result);
}
NAGヘッダを追加する
#include <OC_nag8.h>
このヘッダファイルはNAG関数のすべてのヘッダファイルを含んでいます。そしてすべての定義されるタイプとエラーコードも含まれています。ですのでこの関数一つを含むだけで十分になります。
NAG関数の宣言を見るには
ヘッダファイルからNAG関数の宣言を見てみましょう。
- 上のセクションで作成したTestNAG.cファイルをアクティブにします。スクロールして#include <OC_nag8.h>という列を見つけます。
- その列の中ならどこでもいいので右クリックし、"OC_nag8.h"を開くを選びます。これですべてのNAGヘッダが含まれているヘッダフォルダを開きます。
- 検索コンボボックスに NAG\nagd01.hと打ち込み、ENTERキーを押してこの列について検索します。関数d01ajcはd01カテゴリに入っているのでヘッダファイルの名前はnagd01.hとなるはずです。
- この列内のどこでも右クリックを行い"NAG\nagd01.h"を開くを選びます。これで関数のプロトタイプを含むヘッダファイルが開きます。
- 検索コンボボックスにd01ajcと打ち込み、ENTERキーを押してこの関数の宣言に行きます。
NAG関数の宣言をPGFファイルで見るには:
NAGのエラーコードを取得するには
- コードビルダ内でTestNAG.cウィンドウを再びアクティブにします。このファイルではNagError変数のfailが定義され、それを最新の引数としてd01ajc関数に反映させます。
- NAG関数はNagError変数コードアイテム内にエラーコードを返してきます。この例ではNAGエラーコードにはfail.codeでアクセスできます。
どのエラーコードが出てくるのか知るには:
- OriginCのヘルプをメニューからヘルプ:プログラミング:OriginCから開きます。Origin C Referenceブックを開き、その中のGlobal FunctionsからNAG Functionsを選び、Accessing NAG Functions Category and Helpを選びます。
- Chapters of NAG C Library表のなかでd01を選んでQuadratureを入力します。それからd01ajcを表から選ぶころでPDFヘルプを開きます。
- スクロールをして下のページの6 Error Indicators and Warnings の部分にいくと、この関数に関するすべてのエラーコードとそれに関する解説を見ることができます。正しいヘッダファイルに含まれているならばこのコードを直接OriginCで使用することができます(全てのNAGヘッダを含むこのファイル<OC_nag8.h>を含むか、直接 <NAG8\nag_errlist.h>を使って含みます)。例えば「NE_INT_ARG_LT, NE_BAD_PARAM, NE_ALLOC_FAIL」はこのTestNAG.cの中で使用されています。
関数ポインターを使うには
- Originのプログラムパス(\OriginC\system\NAG フォルダ)からnagd01.hファイルを開きます。
- このファイルの中でd01ajcの宣言を探します。この関数の初めの引数の形はNAG_D01AJC_FUNとなっています。
- NAG_D01AJC_FUNをダブルクリックして選択します。メニューから編集:ファイル内を探すを選び、ファイル内を探す(Find in Files)ダイアログを開きます。下の図と同じように設定をし、見つける(Find)ボタンをクリックします。
- 出力ウィンドウで結果を見つけます。nag_types.hをダブルクリックしてこのファイルに行きます:「typedef NAG_D01_FUN NAG_D01AJC_FUN」すると、 NAG_D01_FUN の定義を近くて見つけることができます。
- NAG_D01_FUNの定義は次のようになっています。
typedef double (NAG_CALL * NAG_D01_FUN)(double);
ユーザ設定の関数はこの定義と同じような引数とリターンのタイプになっていないといけません。NAG_CALL は正しい呼び出し方を記しているのでユーザ定義の関数内で使用してください。
- TestNAG.c のファイルをアクティブにします。ここにfという関数があり、これはd01ajcの初めの引数として使用されています。
double NAG_CALL f(double x)
{
return (x*sin(x*30.0)/sqrt(1.0-x*x/(PI*PI*4.0)));
}
|