LabTalkによる数学的解析

 

概要

微分、積分、補間、複数曲線の平均化などのOriginの多くの数学的解析ツールは、LabTalkスクリプトからアクセスできます。これらの分析のほとんどには、1つ以上のXファンクションがに関連付けられており、多くのコマンド、オブジェクト、または算術演算子がこれらのXファンクションの実装として機能します。

数学的分析を実行する場合、ユーザ入力での値を使用してさらに計算するための対話型ダイアログを作成すると便利な場合があります。

学習する項目

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

  • ソースデータから行を減算
  • ユーザからの入力値を利用するための対話型ダイアログ (getn) を作成
  • 補間を使用して、指定したXのY値を計算
  • データ列を正規化
  • 複数の曲線の平均を計算

ステップ

  1. <Origin EXE folder>\Samples\GraphingのデータファイルWaterfall.dat を関連するインポートフィルタでワークブックWaterfallにインポートします。
  2. // 新規ブックを作成し、Waterfallと名前付け(ロングネームとショートネーム両方)
    newbook name:="Waterfall" option:=lsname;
    // ファイル名とフィルタ名を定義
    string fname$ = system.path.program$ + "Samples\Graphing\Waterfall.dat";
    string filtername$ = "waterfall.oif";  
    // Xファンクションimpfileを使用して、インポートフィルタで指定ファイルをインポート
    impfile fname:=fname$ filtername:=filtername$ location:=data orng:=[Waterfall]1!;
    
  3. ループとXファンクションsubtract_lineを使用して、エンドポイント接続の単純な基線を減算します。
  4. // SubtractedDataという名前の新しいシートを作成
    newsheet name:=SubtractedData;
    ///新しく作成したワークシート(現在アクティブ)を範囲変数として定義
    range sdwk = !;
    //Waterfallワークシートを名前でアクティブ化
    page.active$ = "Waterfall";
    //Waterfallシートの列数を保持する積分を定義
    int nc = wks.nCols;
    //SubtractedDataシートの列数も同様に設定
    sdwk.nCols = nc;
    //ループとXファンクションsubtract_lineを使用してベースラインを減算
    //最初と最後のデータポイントを検出して、線形に接続
    //この線はをソースデータからベースラインとして差し引く
    //減算データは、ソースデータの励起波長で名前付け
    loop(ii, 2, nc)
    {
      range rx = [Waterfall]Waterfall!col(1);
      range ry = [Waterfall]Waterfall!col($(ii));
      subtract_line iy:=[Waterfall]Waterfall!(1,$(ii)) 
      x1:=rx[1] /* 最初の点のX値を指定*/
      y1:=ry[1] /* 最初の点のY値を指定*/
      x2:=rx[$(wks.maxRows)] /* 最後の点のX値を指定*/
      y2:=ry[$(wks.maxRows)] /* 最後の点のY値を指定*/
      oy:=[Waterfall]SubtractedData!(1,$(ii));
    //SubtractedDataシートの列のロングネームを変更
    //Waterfall シートでユーザ定義パラメータ Wavelengthを使用
     [Waterfall]SubtractedData!col($(ii))[L]$ = [Waterfall]Waterfall!col($(ii))[D1]$ + "nm";
    }
    

  5. getnダイアログを使用して、正規化のために参照位置でのピーク高さを使用するか、単純に最大ピーク高さを使用するかをユーザに決定させます。
  6. //参照ピーク位置のX値についてユーザ入力を取得するためのダイアログを作成
    double xx;//初期値を与える
    //getnダイアログを作成
    int n;
    getn
    (Use Specified Reference Peak for Normalization) n:2s
    (Reference Peak Position X Value) xx
    (If not specified, the data will be normalized based on maximum Y value);
    
  7. 前のステップでの入力に基づいて、すべてのY列をループしてデータの正規化を行います。
  8. // Normalizedというワークシートを作成
    //前のワークシートと同じ列数に設定
    newsheet name:=Normalized cols:=nc outname:=sname1$;
    //SubtractedDataワークシートの列Aと同じデータを列Aに入力
    range r1 = col(1);
    range r2 = [Waterfall]SubtractedData!col(1);
    r1 = r2;
    
    if(n==0)/*"Use Specified Reference Peak for Normalization"を選択していない場合*/
      {
        loop(ii, 2, nc)
           {
             //Xファンクションrnormalizeを使用して列を正規化
             rnormalize -r 2 
             irng:=[Waterfall]SubtractedData!col($(ii)) 
             method:=max /*「最大値による除算」を正規化方法として使用 */
             orng:=%(sname1$)col($(ii));
             wks.col = ii;
             col($(ii))[L]$ = [Waterfall]Waterfall!col($(ii))[D1]$ + "nm";
           }
      }
    if(n==1)/*"Use Specified Reference Peak for Normalization"を選択した場合*/
      {
         loop(ii, 2, nc)
           {
             range rr=[Waterfall]SubtractedData!(1,$(ii));
            //指定されたXのY値を補間で計算
            double yy = rr(xx);
            // Xファンクションrnormalizeで列を正規化
            rnormalize -r 2 
            irng:=[Waterfall]SubtractedData!col($(ii)) 
            method:=specify /*正規化方法として「指定値で除算」を使用*/
            val:=yy /*補間により計算されたY値を基準値として使用*/
            orng:=%(sname1$)col($(ii));
            wks.col = ii;
            col($(ii))[L]$ = [Waterfall]Waterfall!col($(ii))[D1]$ + "nm";
           }
      }
    

    range()構文を除き、interp1 (XからYを補間)、 interp1q (線形補間と補外)、iinterp1xy (XYデータのグループに対する1D補間/補外) など、いくつかのXファンクション使って補間できます。

  9. 正規化されたデータをグループ化折れ線グラフとしてプロットします。
  10. //正規化データをグループ化折れ線グラフとしてプロット。凡例なし
    plotxy iy:=(1,2:end) plot:=200 legend:=0;
    
  11. Xファンクションavecurvesを使用して、複数の曲線の平均を計算します。
  12. win -a Waterfall;
    //Avecurveという名前の新しいシートを作成
    newsheet name:=Avecurve;
    //ループを使用して、4 つの曲線ごとに平均を計算
    for(ii=2; ii<nc; ii=ii+4)
    {
    avecurves -r 2 iy:=%(sname1$)(1,$(ii):$(ii+4)) rd:=[Waterfall]Avecurve!col($(ii/2));
    }
    
  13. 平均曲線の結果を別のグループ化折れ線グラフとしてプロットします。
  14. // Avecurveワークシート全体を選択
    worksheet -s 0 0 0 0;
    //グループ化折れ線としてアクティブな範囲をプロット
    plotxy plot:=200 legend:=0;