補間はデータに実行する一般的な数学関数の一つで、Originは2つの方法(1)範囲表記で一つの値とデータセットの補間(2)Xファンクションによる全曲線の補間、で補間をサポートしています。(1)範囲表記で一つの値とデータセットの補間、(2)Xファンクションによる全曲線の補間、で補間をサポートしています。
一度宣言したXY範囲(X値による部分範囲指定を利用可能)は、関数として使うことができます。 この関数への引数はスカラー(スカラーを返す)またはベクター(ベクターを返す)にすることができます。 どちらの場合でも、Xデータセットは単調に増加、減少している必要があります。 例えば:
newbook; wks.ncols = 4; col(1) = data(1,0,-.05); col(2) = gauss(col(1),0,.5,.2,100); range rxy = (1,2); rxy(.67)=; range newx = 3; // 列をX列データとして使用 newx = {0, 0.3333, 0.6667, 1.0}; // 新しいXデータ範囲を作成 range newy = 4; // これは補間する空の列 newy = rxy(newx);
そして、この範囲変数を以下の形式を持つ関数として使うことができます。
XYRangeVariable(RangeVariableOrScalar[,connect[,param]])
ここでconnectは、以下のいずれかを指定します。
そして、param はスムージングパラメータで、bspline接続法にのみ適用されます。param=-1の場合、単純なbsplineが使われます。これはプロット内でbspline line接続と同じになります。param >=0の場合、NAG関数 nag_1d_spline_function が使われます。
Note: XY範囲の補間を使うとき、 spline または bspline を接続法として使用する場合、x 値が重複してはいけません。代わりに、補間のXファンクションを使うことができます。 |
次のサンプルは、関数として範囲を使い、ワークシートからのデータを引数として補間を実行する方法を示します。
サンプル1: 次のコードは、bsplineのさまざまなスムージングパラメータの使用法を紹介します。
col(1)=data(1,9); // 列1に行番号を入力 col(2)=normal(9); // 列2に乱数を入力 col(3)=data(1,9,0.01); // 希望のX値でCol(3)に入力 wks.col3.type = 4; range bb=(1,2); // cols 1,2を使用する範囲を宣言; // 異なるパラメータ設定を使って補間した値を計算 loop(i, 4, 10) { wcol(i)=bb(col(3), bspline, $(i*0.1)); }
サンプル2: XY範囲を使って、次のようなコードを使ってどんなX値からでもY値のデータを取得することができます。
// いくつかのデータを生成 newbook; wcol(1)={1, 2, 3, 4}; wcol(2)={2, 3, 5, 6}; // XY範囲を定義 range rr =(1,2); // 線形補間で指定してX値に対するY値を探す rr(1.23) = ; // ANS: rr(1.23)=2.23 // 線形補間でX値の配列に対してY値を探す wcol(3)={1.5, 2.5, 3.5}; range rNewX = col(3); // 計算したY値を保持する新しい列を追加する wks.addcol(); wcol(4) = rr(rNewX);
サンプル3: 指定したY値に対するX値を探す場合、上記の例の引数を逆にします。 YからXを探す場合、Yデータセットが単調に増加または減少している必要があります。
// いくつかのデータを生成 newbook; wcol(1)={1, 2, 3, 4}; wcol(2)={2, 3, 5, 6}; // XY範囲を定義 range rr =(2,1); //XとYを入れ替え // 線形補間で指定したY値に対するX値を探す rr(2.23) = ; // ANS: rr(2.23)=1.23; // 計算したX値を保持する新しい列を追加 wks.addcol(); range rNewX = wcol(3); // 線形補間でY値の配列に対するX値を探す wcol(4)={2.5, 3.5, 5.5}; range rNewY = wcol(4); rNewX = rr(rNewY);
グラフページがアクティブなときに範囲補間を使うこともできます。
サンプル1: 配列の値の補間
// アクティブプロットの範囲を定義 range rg = %C; // 線形で使ったスカラー値に対する補間 rg(3.54)=; // 配列の値に対する補間 // 新しいX値の位置を与える: range newX = [Book2]1!1; // 新しいY値(出力)が行くべき場所を与える: range newY = [Book2]1!2; // 新しいY値を計算する: newY = rg(newX);
サンプル2: 補間法を指定します。
// 指定したプロットの範囲を定義 range -wx rWx = 2; // アクティブレイヤの2番目のプロットのX値を使う range -w rWy = 2; // アクティブレイヤで2プロット目のYを使用 range rr = (rWx,rWy); // 2つの範囲からXY範囲を構築 // 新しいX値の出力場所を定義 range newX = [Book2]1!1; newX = {5,15,25}; range newY1 = [Book2]1!2; // 新しいYの範囲 range newY2 = [Book2]1!3; // 新しいYの範囲 // 線形補間でX値の配列に対する新しいYの値を探す newY1 = rr(newX); // bspline補間でX値の配列に対する新しいYの値を出力 newY2 = rr(newX,bspline);
単調増加または減少している同じサイズの2つの任意データセットに対して、2つのデータセットを補間し、片方のデータセットにおける補間値を与える事で、もう片方のデータセットの補間値を出力できます。データセットは範囲変数、データセット変数、列にすることができます。このような補間を実行する形式は次の通りです。
dataset1(value, dataset2)
これは、dataset2 と dataset1で構築されるXYデータのグループを補間し、与えられたX (dataset2) 値.での Y (dataset1) 値を返します。例えば、
// データセットを使う dataset ds1 = {1, 2, 3, 4}; dataset ds2 = {2, 3, 5, 6}; // ds1のXが1.23での補間された値をds2に返す ds2(1.23, ds1) = ; // 2.23を返す // ds2のXが5.28での補間した値をds1に返す ds1(5.28, ds2) = ; // 3.28を返す // 範囲を使う newbook; wks.ncols = 3; range r1 = 2; // アクティブワークシートの列2 r1 = {1, 2, 3, 4}; range r2 = 3; // アクティブワークシートの列3 r2 = {2, 3, 5, 6}; r2(1.23, r1) = ; r1(5.28, r2) = ; // 列を使う col(3)(1.23, col(2)) = ; col(2)(5.28, col(3)) = ;
Originには、XYデータを補間して、新しい出力XYデータを作成する3つのXファンクションがあります。
名前 | 説明 |
---|---|
interp1xy |
XYデータの補間を実行し、均一な等間隔Xに対して出力します。 |
interp1 |
XYデータの補間を実行し、入力X値に対して出力します。 |
interp1trace |
Xが単調でないXYデータの補間を実行します。 |
以下の例は、既存のXデータセットを使って補間したY値を探すものです。
// 指定した列の属性を持つ新しいワークブックを作成 newbook sheet:=0; newsheet cols:=4 xy:="XYXY"; // サンプルデータファイルをインポート fname$ = system.path.program$ + "Samples\Mathematics\Interpolation.dat"; impasc; // col(3)のX値でcol(1) と col(2) のデータを補間 range rResult=col(4); interp1 ix:=col(3) iy:=(col(1), col(2)) method:=linear ox:=rResult; //元のデータと結果をプロット plotxy iy:=col(2) plot:=202 color:=1; plotxy iy:=rResult plot:=202 color:=2 size:=5 ogl:=1;
次のサンプルは、均一で等間隔なX値を出力として生成し、補間を実行します。
//新しいワークブックを作成し、データファイルをインポート fname$ = system.path.program$ + "Samples\Mathematics\Sine Curve.dat"; newbook; impasc; //列2でデータを補間 interp1xy iy:=col(2) method:=bspline npts:=50; range rResult = col(3); //元のデータと結果をプロット plotxy iy:=col(2) plot:=202 color:=1; plotxy iy:=rResult plot:=202 color:=2 size:=5 ogl:=1;
次のサンプルはX値が単調でないデータに対してトレース補間を実行します。
//新しいワークブックを作成し、データファイルをインポート fname$ = system.path.program$ + "Samples\Mathematics\circle.dat"; newbook; impasc; //トレース補間で列2の循環データを補間 interp1trace iy:=Col(2) method:=bspline; range rResult= col(4); //元のデータと結果をプロット plotxy iy:=col(2) plot:=202 color:=1; plotxy iy:=rResult plot:=202 color:=2 size:=1 ogl:=1;
補間のXファンクションは、入力データのX範囲の外側にあるY値を補外するのに使用することもできます。
minterp2 Xファンクションは、行列の補間/補外を実行するのに使うことができます。
// 新しい行列ブックを作成し、サンプルデータをインポート newbook mat:=1; filepath$ = "Samples\Matrix Conversion and Gridding\Direct.dat"; string fname$=system.path.program$ + filepath$; impasc; // 元のXおよびYデータサイズの10倍で行列を補間 range rin = 1; // 入力データで行列をポイント int nx, ny; nx = rin.ncols * 10; ny = rin.nrows * 10; minterp2 method:=bicubic cols:=nx rows:=ny ;
OriginProは、 interp3 Xファンクションも提供しており、これは、4次の散布データを補間するのに使うことができます。