ユーザ定義フィット関数

Video Image.png 関連する動画はこちら:ユーザ定義関数

Originには組み込みフィット関数がある一方で、ツールを使ってユーザ独自のフィット関数を定義することができます。

  • Simple Fitアプリ
    Simple FitアプリはOriginにプリインストールされているアプリで、グラフウィンドウがアクティブなときに、簡単にアプリギャラリーから呼び出すことができます。このアプリは、式y = f(x)で単純な関数を近似する非常に便利な方法を提供します。数式を入力し(または既存の関数を選択し)、初期値を指定して、すぐに近似レポートを生成するだけです。
    Define Function Using Simple Fit App.png
  • フィット関数オーガナイザ
  • フィット関数ビルダ


このページでは、使いやすいウィザード形式のフィット関数ビルダーを使用して、ユーザ定義のフィット関数を作成する方法を紹介します。このウィザードは、 処理のゴール 関数名と関数形式変数とパラメータ関数本体のページパラメータ初期化ルーチン境界と一般線形制約のページ派生パラメータのページフィット前後のスクリプトの8ページで構成されています。最初の4ページは、いくつかの設定を行う必要があり、設定しないと次のページに進めません。4番目の式形式の関数ページで設定した後は、以降の設定を行わなくても関数を作成できます。もちろん残りの4ページの設定を継続することもできます。

フィット関数ビルダーは、各ページの左側のパネルに役立つヒントとサンプルが表示されるので、簡単に使用、習得できます。ウィザードの各ページで何ができるか確認したら、フィット関数を作成する方法を明確に理解できます。左側のページでは、ユーザ定義のフィット関数を作成するための一般的な手順と、各ページで何ができるかを説明しています。操作方法については、こちらからのチュートリアルを確認できます。また、新しく作成された関数に対しては、OriginはユーザファイルフォルダのFitFuncフォルダに関連したFDFファイルを作成します。作成した関数は、非線形曲フィットのダイアログで使用できるようになります。

Ffb home 1.png

新しいフィット関数を作成する一般的な手順

フィット関数作成は次のような操作で行います。操作方法については、こちらからのチュートリアルを確認できます。

  1. フィット関数ビルダーを開き、最初の処理のゴールページで新しい関数の作成を選択します。進むをクリックし、関数名と関数形式ページに移動します。
  2. 関数名と関数形式ページで、新しい関数のカテゴリーを作成/選択し、関数名編集ボックスに関数の名前を入力します。 オプションで、説明編集ボックスにコメントを追加できます。また、実際の状況に応じて適切な関数形式を選択します。進むをクリックし、変数とパラメータページに移動します。

    外部DLL関数を作成する場合は、外部DLLの使用を参照し、FittingWithExternalDLL.opxのドキュメントを確認してください。

  3. 変数とパラメータページで、独立変数従属変数、およびパラメータの名前を指定する必要があります。また、このページでは派生パラメータ定数を定義することができます。ピークアナライザーでピークをフィットする、またはNLFitツールで複数のピークをフィットするための複製を行うための関数として定義する場合は、ピーク関数チェックボックスにチェックを付ける必要があります。進むをクリックし、式形式の関数ページに移動します。
  4. 式形式の関数ページでは、パラメータタブと定数タブで、パラメータと定数の初期値を手動で設定できます。前のページでピーク関数にチェックを使た場合は、パラメータタブのピーク属性を選択する必要があります。関数式編集ボックスに関数の式を入力する必要があります。関数名と関数形式ページで関数形式としてOrigin Cを選択した場合は、コードビルダを使用して関数を定義できて便利です。このページでの設定が完了したら、完了ボタンをクリックして関数作成の操作を終了できます。進むボタンをクリックした場合、ウィザードの左側のページで他の設定を実行できます。
  5. 最後の4ペーの[パラメータ初期化ルーチンページ、境界条件と一般線形制約ページ、派生パラメータページ、フィット前後のスクリプトページはオプションのページなので、それぞれで設定するか、無視して次へ / 完了ボタンをクリックして進むことができます。
  6. このページでの設定が完了したら、完了ボタンをクリックして関数を保存します。

フィット関数ビルダを開く

フィット関数ビルダーは、以下の操作で開けます。

  • メインメニューのツール:フィット関数ビルダーを選択するか、F8キーを押します。
  • フィット関数オーガナイザダイアログボックスのビルダーボタンをクリックします。
  • 非線形曲線フィットダイアログボックスの新規関数作成ボタンFfb nlfit createnew.pngをクリックします。

処理のゴールページでできること

処理のゴールページはウィザードの最初のページであり、処理の目的として新しい関数の作成か、ユーザ定義関数の編集を選択します。ユーザ定義関数を作成する場合には、新しい関数の作成を選択します。このページ設定の詳細については、処理のゴールページを参照してください。

関数名と関数形式ページでできること

関数名と関数形式ページは2番目のページで、関数カテゴリーを選択/作成でき、関数の名前を指定して関数の形式を選択します。このページ設定の詳細については、関数名と関数形式ページを参照してください。次の2つの設定に注意してください。

新しい関数カテゴリーを作成する

カテゴリーの作成は以下のように行います。

  1. 関数カテゴリーの選択/新規名称の項目の隣にある作成ボタンをクリックします。
  2. カテゴリー名を名前編集ボックスに入力します。
  3. OKボタンをクリックして保存します。
Note: Origin 2018からこのカテゴリ情報もFDFファイルに保存されます。FDFファイルを共有し、他のOriginプログラムにFDFファイルをドラッグ&ドロップして関数をインストールすると、同じカテゴリに保存されます。

以前のバージョンでは、カテゴリーの情報はFDFファイルに保存されなかったため、ドラッグ&ドロップによるインストール時に追加関数のカテゴリを選択ダイアログが開き、カテゴリーを指定する必要がありました。

関数の形式を選択する

関数形式グループから適切な関数のタイプを選択します。下表でそれらの違いを示します。

定義形式 コメント
LabTalk算術式
a + b * exp( -x^c / d )
このオプションは1つの従属変数だけを持つ単純なフィット関数です。関数の本体は、1つの式に限られ、式の右側だけを記述します。このオプションは、Origin Cよりも高速なパフォーマンスを提供します。
Python関数 (scalar)
y = py.pyline(x, a, b);
このオプションは、Python関数(Vector)よりも遅いため、小さいデータセットをフィッティングする場合にのみ選択してください。関数を作成するとき、関数名の前に"py." を追加する必要があります。
Python関数 (Vector)
y=pyGaussVectorEq(x,y0,xc,A,w);
大きなデータセットのフィットを行う場合このオプションを選択します。関数は、呼び出し中に各独立変数の独立値の配列(リストの形式)を受け取り、各従属変数の配列(リストの形式)を返します。このオプションはLabTalk処理を使用しないため比較的高速です。
LabTalk方程式
temp = 10;
y1 = A + exp( (x1 - xc) / temp^2 );
y2 = A + temp / (x2 - xc)^2;
このオプションは、複数行必要な場合や1つ以上の従属変数がある場合に使用します。このオプションは、loopやif-elseステートメントのような制御構造はサポートしません。しかし、三項演算子は使うことができます。このオプションは、Origin Cよりも高速なパフォーマンスを提供します。
Origin C
if ( x < -PI )
y = y0 + exp( -x-a*PI );
else if ( x > PI )
y = y0 + exp( x-a*PI );
else
y = cos(x);
このオプションは算術式より遅くなります。フィット関数が三項演算子では表せないloopや制御構造を必要とする場合、このオプションを選択します。厳密なC言語のシンタックスに従う必要があります。パラメータは大文字小文字を区別し、int型の除算とdouble型の除算は異なるものとして認識します。
LabTalkスクリプト
range rr = %C;
int b = %(rr[P1]$);
y = b + a*x;
このオプションは方程式やOrigin Cより遅くなります。制御構造が必要で、C言語に不慣れな場合、このオプションを選択してください。
外部DLL関数   このオプションは、外部DLLを使ってフィット関数を定義します。外部DLLを使うと、フィット時間を向上させることができます。この関数形式についての詳細は、外部DLLを使うを参照してください。
Note: Origin C関数を作成するとき、コードの前に次のステートメントを含めることが良い慣習となっています。
#pragma numlittype(push, TRUE)
		

すると、Originは整数-3を浮動小数点数- 3.0として扱います。これは、他の関数形式をOrigin Cに変換する場合に非常に便利です。LabTalkでは、3/2 = 1.5ですが、標準のCでは1です。#Pragma ステートメントは、関数形式を変更したときに一貫性を保つ上で便利です。

変数とパラメータページでできること

変数とパラメータページは、3番目のページで、独立変数、従属変数、パラメータ(派生パラメータを含む)、定数を定義します。このページ設定の詳細については、変数とパラメータページを参照してください。

Note: ピークアナライザのピークフィット用の関数またはNLFitの複製フィットを行う関数を使う場合、または非線形フィットで複製フィットをする場合、このページのピーク関数チェックボックスにチェックを入れる必要があります。

ピーク関数のパラメータの場合は、次のページで特別なピーク属性を設定する必要があります。パラメータリストの最初のパラメータには「y0」という名前を付け、ピーク属性「offset」を割り当てる必要があります。「y0」に加え、ピークの属性として、「X中心」、「幅」、「振幅/面積」の少なくとも3つのパラメータを定義する必要があります。次は、ピーク関数のサンプルです。

y = y0 + (2*A/PI)(w/(4*(x-xc)^2 + w^2))

関数本体のページでできること

関数本体ページは4番目のページで、関数を入力し、初期値の入力や固定などのパラメータのいくつかの基本設定を行います。ピークフィット関数を定義したければ、このページでパラメータのピーク属性を選択します。また、このページでフィット関数の動作を評価できます。このページ設定の詳細については、関数本体ページを参照してください。

関数本体を入力する

関数名と関数形式ページで紹介したように関数タイプは5つあり、それぞれに独自の形式で関数本体を定義します。フィット関数の記述の際には、関数名と関数形式ページの指示に従うか、関数本体ページの左側のパネルからヒントを参照してください。

Note: 新しい関数を作成するとき、ユーザは、nlf_FuncNameを使って、組み込み関数を引用することができます。例えば、以下のような関数を定義します。
y1 = nlf_Expdec1(x, y01, A11, t1);

ここで、nlf_Expdec1 は、組み込み関数のExpDec1です。

コードビルダで関数を編集する

関数名と関数形式ページでOrigin Cが選択されていたら、コードビルダでコードを編集します。関数本体編集ボックスの右上隅にあるボタンUser-Defined Fitting Functions-2.pngをクリックすると、コードビルダが開きます。このときのウィンドウの名前は_nlffunctionName.fitとなります。例えば、次図の場合、ウィンドウの名は_nlfAsymmetricGaussian.fitとなっています。このウィンドウの中で関数本体を編集できます。

User-Defined Fitting Functions-3.png

コードの最初の数行は、フィット関数のコンパイルに必要なさまざまなヘッダファイルを識別する#includeステートメントです。この例では、実際の関数定義は次のステートメントで始まります。

void _nlsfAsymmetricGaussian

パラメータ、独立変数、および従属変数は、この関数定義の最初で宣言されています。 これらの宣言の後に、関数定義を入力するための編集可能なセクション(白い領域)があります。

上の図では、サンプルとして非対称ガウス関数を定義しています。関数定義はCプログラミング言語の構文に準拠している必要があることに注意してください。たとえば、パラメータとすべての変数タイプでは大文字と小文字を区別します。中間変数(この例ではBなど)は、最初に次のようなステートメントを使用して宣言する必要があります。

double B;

この宣言は、変数が関数定義で使用される前に行ってください。

関数のタイプはvoidであり、関数から値が返されないことを示しています。代わりに、従属変数値が関数コード内に設定されます。この例では、従属変数yには、xが重心パラメーターxcより小さいか大きいかに応じて異なる値が割り当てられます。

関数を定義したら、構文が正しいか確認する必要があります。 コードビルダの上の方にあるコンパイルボタンをクリックするとテストできます。 コンパイルプロセスでのエラーは、ワークスペースの下部にあるコードビルダの出力ウィンドウに表示されます。ファイルが正常にコンパイルされた場合にもこのウィンドウに表示されます。

関数を定義してコンパイルしたら、ウィンドウの上部にあるNLSFに戻るボタンをクリックして、関数フィット関数ビルダに戻れます。これによりコードビルダは終了します。


関数を評価する

関数本体ページの下部に、関数の動作を確認するために立つクイックチェックというコントロールグループがあります。最初に、このページのパラメータタブの初期値列に値を入力してから、クイックチェックグループの独立変数編集ボックスに値を入力します。Ffb evaluate.pngボタンを押し、従属変数の出力値を確認します。関数の内容に誤りがあったり、パラメータや変数に不適切な値を与えると、出力ボックスは欠損値とエラーメッセージを返します。

パラメータ初期化ルーチンページでできること

パラメータ初期化ルーチンページは、5番目のページで、フィット関数パラメータの初期値を計算するための入力コードを実行します。このページはオプションなので、他の設定をするために進むボタンをクリックして次のページに進んでも構いません。 このページ設定の詳細については、パラメータ初期化ルーチンページを参照してください。

非線形曲線フィットで使用される反復法では、すべてのパラメータの初期値を指定する必要があります。良好なパラメータ初期値により、高速で信頼できるモデル/データの収束を得ることができます。新しい関数を定義するときにパラメータの初期化を制御する方法は2つあります。

  • 関数本体ページのパラメータタブで固定初期値を割り当てます。
  • パラメータ初期化コードに初期値を推定すための初期化コードを入力します。

パラメータ初期化セクションのパラメータ値の初期化についての説明を確認してください。 初期値またはコードは、フィット関数の定義において必須ではありません。 ただし、パラメータ初期化がフィット関数ファイルで処理されない場合は、NLFitダイアログボックスにおいてこの関数でフィットするときに手動で初期値を設定する必要があります。

境界と一般線形制約のページでできること

境界と一般線形制約ページは6番目のページで、フィット関数のパラメータに対する境界と線形制約を入力します。このページはオプションなので、他の設定をするために進むボタンをクリックして次のページに進んでも構いません。 このページ設定の詳細については、境界と一般線形制約ページを参照してください。

派生パラメータのページでできること

派生パラメータページは7番目のページで、派生パラメータを定義します。このページはオプションなので、他の設定をするために進むボタンをクリックして次のページに進んでも構いません。 このページ設定の詳細については、派生パラメータページを参照してください。

フィット前後のスクリプトページでできること

フィット前後のスクリプトページは8番目の最後のページで、フィット処理前あるいは後に実行するLabTalkスクリプトを入力できます。このページはオプションなので、案芋設定せずに完了ボタンをクリックして関数の作成を終了しても構いません。このページ設定の詳細については、フィット前後のスクリプトページを参照してください。