京都工芸繊維大学工芸科学部 生命物質科学域高分子機能工学部門 高分子物性工学研究室

  • JP
  • EN
  • menu

    Functionの作成例:フィッティング関数

    Functionの作成例:フィッティング関数

    Igor によるプログラミングは、主にMacro, Proc, Functionで始めます。Macroは、IgorのMacrosメニューから呼び出しが可能であり、メニューに表示させたくないマクロは、Procで書き始めます。MacroとProcによって、自由度の高いプログラム作成が可能ですが、速度が遅いことが欠点です。後日説明するSilent命令である程度の高速化が行えますが、スピード勝負のサブルーチンは、Functionを使って書くべきです。ただし、Functionにはいろいろな制約があり、変則的にExecute命令を使うこともあります。これについても後日説明します。さて、今回はプログラミングのためのFunctionではなく、むしろ前回作ったノイズ入りデータを、ユーザーが作成した関数に対してフィッティングする事を試みます。Windowsメニューから、Procedure Window(コマンド+Mキー)を開いておいて下さい。

    ■Functionの基本は、

    Function myFunction(x)
    variable x
    プログラム命令をここに書く
    必要に応じて Return命令をおく
    End

    です。y=f(x)と記述したとき、「fという関数は、xの関数である」という意味だったと思います。それと同じように、myFunctionは、xの関数なのです。

    ■フィッティングには未知の係数があって、それを求めるのが目的であるため、フィッティング用の関数は、

    Function myFunction(w,x): FitFunc
    wave w
    variable x
    return 式をここに書く
    end

    と書くのが基本です。前回作成したデータをフィットするための関数を作ってみましょう。

    Function TestFunc(w,x): FitFunc
    wave w
    variable x
    return w[0]*x^2+w[1]*x
    end

    ここで、w[0]とw[1]は、xの2次と1次の係数です。今回の場合は、すでに答えはわかっていますが、通常はこのw[0], w[1]を決定する事がフィッティングの目的です。

    ■Igorにはじめから組み込まれている関数は、それぞれの係数が全く未知でもよいのですが、ユーザー定義関数にはある程度近い値(推測値)が必要です。またこの推測値は適切な値でないと真の値に収束せず、場合によってはとんでもない解析結果がはじき出されます。

    フィッティング結果を返すためのwaveを作成しましょう。今回は結果も既知であるので、

    make/O/D/N=2 w={1,3}

    でよいでしょう。

    ■次にグラフの方も準備が必要です。Graphメニューから”Show Info”を呼び出し、グラフの下に現れた○と□のマーカーカーソルをグラフの両端にマウスでセットしてください。

    ■いざフィッティング(その1)  Analysisメニューから、”CurveFitting…” を選んで、以下の手順でフィッティングを行って下さい。 (1)Functionメニューから関数を選ぶ(今回はTestFunc) (2)Y Data と X Data を選ぶ(今回は、それぞれ wave1 とwave0) (3)Data optionsの欄にある、Rangeで、Cursorsボタンを押して、カーソルをセットする。(カーブフィッティングはこの範囲で実行される。) (4)Coefficientsの欄にある、Coefficient Waveから係数設定用のwaveを選ぶ(今回は、w) (5)Do Itでフィッティングを実行する。

    実行した結果はどうだろうか?今回はわざと意地悪しており、xの小さいところでフィッティングがうまくいかないはずだ。縦軸のデータの変化がlogスケールであるため、1+gnoise(0.1)で加えた揺らぎ幅が、データ点にかなり依存した結果、ずれが生じるのだ。このような場合には、フィッティングの重みwaveを作成する。

    ■makeが「新規wave作成」であるのに対して、duplicateは、「waveの複製」である。

    Duplicate/O wave1 wave2
    によって、wave2という新たなコピーが作成される。

    さてカーブフィッティングを呼び出し、Data Optionsパネルの”Weighting”から、先ほど作成したwave2を選ぼう。これにより、縦軸のレベルに対応してカーブフィッティング重み付け(大きなyほど解析で重視する)が行われる。以下は、その結果である。

    フィッティングがうまくいった。