補間

補間はデータに実行する一般的な数学関数の一つで、Originは2つの方法(1)範囲表記で一つの値とデータセットの補間(2)Xファンクションによる全曲線の補間、で補間をサポートしています。(1)範囲表記で一つの値とデータセットの補間、(2)Xファンクションによる全曲線の補間、で補間をサポートしています。

内容

XY範囲を使う

一度宣言した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は、以下のいずれかを指定します。

line
直線の接続
spline
スプライン接続
bspline
B-スプライン接続

そして、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)

これは、dataset2dataset1で構築される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)) = ;

補間曲線を作成する

曲線補間用のXファンクション

Originには、XYデータを補間して、新しい出力XYデータを作成する3つのXファンクションがあります。

名前 説明
interp1xy

XYデータの補間を実行し、均一な等間隔Xに対して出力します。

interp1

XYデータの補間を実行し、入力X値に対して出力します。

interp1trace

Xが単調でないXYデータの補間を実行します。

既存のXデータセットを使用

以下の例は、既存の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出力

次のサンプルは、均一で等間隔な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次の散布データを補間するのに使うことができます。