NAG特殊関数でフィットする

サマリー

Originで、NAG特殊関数を使ったOrigin Cフィット関数を定義することができます。特殊関数を評価するのにNAGルーチンを呼ぶことができます。

必要なOriginのバージョン:8.0 SR6

学習する項目

このチュートリアルでは、以下の項目について説明します。

  • フィット関数オーガナイザでフィット関数を作成する
  • NAG特殊関数を使ったフィット関数を作成する

サンプルとステップ

次のモデルをフィットします。

 inorm= A* exp(-td/2.0/(t-t0)) * ( I0(td/2.0/(t-t0))+I1(td/2.0/(t-t0)) ) \,

この場合、 inorm= A* exp(-td/2.0/(t-t0)) * ( I0(td/2.0/(t-t0))+I1(td/2.0/(t-t0)) ) \, inorm= A* exp(-td/2.0/(t-t0)) * ( I0(td/2.0/(t-t0))+I1(td/2.0/(t-t0)) ) \, inorm= A* exp(-td/2.0/(t-t0)) * ( I0(td/2.0/(t-t0))+I1(td/2.0/(t-t0)) ) \, はデータをフィットすることで求めるモデル用のパラメータです。そして、  inorm= A* exp(-td/2.0/(t-t0)) * ( I0(td/2.0/(t-t0))+I1(td/2.0/(t-t0)) ) \, inorm= A* exp(-td/2.0/(t-t0)) * ( I0(td/2.0/(t-t0))+I1(td/2.0/(t-t0)) ) \, は、それぞれ次数0と次数1の第一種修正ベッセル関数です。このサンプルでは、このチュートリアルの最後にあるサンプルデータを使用します。フィットの手順は、次のステップに沿って行います。

F9 を押し、フィット関数オーガナイザを開き、 FittingWithNAGSpecialFuncという名前の新しいカテゴリーを作成します。この新しいカテゴリーに、新しいフィット関数 FittingWithBessel を以下のように定義します。

   
関数名: FittingWithBessel
実現方式: ユーザ定義
独立変数: t
従属変数: inorm
パラメータの名前: A,t0,td
定義形式: Origin C
関数:  

関数」ボックスの近くにあるボタン(アイコン)をクリックしてコードビルダを開き、次のようにフィット関数を定義して、コンパイルします。

#include <origin.h>
// ここにincludeファイルを追加します。
// 例えば、NAGライブラリからの関数でフィットする場合、
// ここにNAG関数のヘッダファイルを追加します。
#include <oc_nag8.h>
 
 
// このファイルに定義したい他のOrigin C関数に対するコードをここに追加し、
// フィット関数でアクセスできるようにします。
 
// 他のファイルがワークスペースにロードされ、コンパイルされていれば、そのファイルで定義されている
// C関数にアクセスでき、関数は上記でインクルードしたヘッダファイルに
// プロトタイプがあります。
 
// 関数コード内でNLSFオブジェクトのプロパティとメソッドにアクセスできます。
 
// 関数の定義には、C言語のシンタックスを使います。
// 例えば、パラメータ名がP1の場合、関数定義に p1 と使うことはできません。
// 分数を使用する場合には、1/2のような整数の除算は0になり、0.5ではありません。
// 正しい値にするには、0.5または1/2.0を使います。
 
// より詳細な情報およびサンプルは、Originヘルプファイルの「ユーザ定義フィット関数」
// を参照してください。
 
 
//----------------------------------------------------------
// 
void _nlsfFittingWithBessel(
// フィットパラメータ:
double A, double t0, double td,
// 独立変数:
double t,
// 従属変数:
double& inorm)
{
        // 編集可能部分の開始
        //inorm=  A* exp(-td/2.0/(t-t0)) *   ( s18aec(td/2.0/(t-t0),NAGERR_DEFAULT)+s18afc(td/2.0/(t-t0),NAGERR_DEFAULT)             );
 
        static NagError fail1; 
        static NagError fail2;
        double dtemp = td/2.0/(t-t0);
        inorm=  A* exp(-dtemp) * ( s18aec(dtemp,&fail1)+s18afc(dtemp,&fail2) );
        if(fail1.code !=NE_NOERROR)
                printf("%s\n",fail1.message);
        if(fail2.code !=NE_NOERROR)
                printf("%s\n",fail2.message);
 
 
        // 編集可能部分の終了
}

関数をシミュレーションする

関数本体のコードを入力したら、コードビルダの「コンパイル」ボタンをクリックして、シンタックスにエラーがないかチェックすることができます。そして、「ダイアログに戻る」ボタンをクリックして、フィット関数オーガナイザダイアログボックスに戻ります。「保存」ボタンをクリックして、FDFファイル(関数定義ファイル)を生成します。

FDFファイルがあれば、「シミュレート」ボタンをクリックして、曲線のシミュレーションを行うことができ、これは初期値を求めるのに役立ちます。「simcurve」ダイアログで、適切なパラメータ値やX範囲を入力すると、「プレビュー」パネルに曲線がどのように表示されるのかが表示されます。

パラメータの初期値をセットする

これはユーザ定義のフィット関数なので、データのフィットを実行する前に、パラメータの推定初期値を与える必要があります。「非線形曲線」フィットダイアログの「パラメータ」タブで手動でセットすることができます。以下のサンプルデータで示す内容では、パラメータの初期値を A = 1, td = 1, t0 = 1のようにセットします。パラメータが初期化されると、サンプルデータの右側で示すようにフィットを実行して、フィット結果を取得することができます。

サンプルデータ

以下のサンプルデータをコピーし、インポートウィザードを使用してクリップボードからデータをインポートします。そして、指定の初期値を使ってパラメータの設定を行ってください。A = 1, td = 1, t0 = 1.

サンプルデータ Results
X Y
2 0.7868954118
2.080808081 0.8133022141
2.161616162 0.8178216765
2.242424242 0.8427866729
2.323232323 0.8315815363
2.404040404 0.8484657180
2.565656566 0.8618233553
2.646464646 0.8745962570
2.727272727 0.8921620316
2.808080808 0.8687399759

Image:FittingWithBessel.PNG