Main Content

csapi

3 次スプライン内挿

説明

メモ

設定が少なく簡単な方法で 3 次スプラインを内挿するには、曲線フィッターアプリまたは関数 fit を使用してみてください。また、平滑化スプラインについても参照してください。

pp = csapi(x,y) は、j=1:length(x) に対して x(j) で値 y(:,j) となるノット シーケンス x をもつ 3 次スプライン s の pp 型を返します。値 y(:,j) はスカラー、ベクトル、行列、N 次元配列にすることができます。関数は、同じデータ サイトをもつデータ点を平均化し、サイトで並べ替えます。並べ替えられた後のデータ サイト x で、スプライン s は、次のようなノットなしの端点条件を満たします。

jumpx(2)Ds3=0=jumpx(end1)D3(s)

ここで、D3ss の 3 階微分です。

x が、それぞれ長さ n1, ..., nm のシーケンス x1, ..., xm の cell 配列である場合、y はサイズ [n1,...,nm] (または内挿が d 値の場合はサイズ [d,n1,...,nm]) の配列です。その場合、pp はそのデータに対する m 3 次スプライン内挿 s の pp 型です。特に、次が成り立ちます。

s(x(i1),,x(im))=y(:,i1,,im)

ここで、i1=1:nl また im=1:nm です。

評価、微分、プロットなど、この内挿 3 次スプラインの操作を実行するには、pp 構造体を使用します。詳細については、関数 fnvalfnderfnplt を参照してください。

values = csapi(x,y,xx) は、点 xx において評価された平滑化スプラインの値を返します。この構文は、fnval(csapi(x,y),xx) と同じです。

このコマンドは本質的には MATLAB® の関数 spline で、csapi (spline も) がベクトル値のデータを受け入れ、グリッド データを処理できることを除き、"PGS" における Fortran ルーチン CUBSPL の機能を削減したものです。

すべて折りたたむ

この例では、Curve Fitting Toolbox™ の csapi コマンドを使用して、3 次スプライン内挿を作成する方法を示します。

2 つの点への内挿

以下のコマンドを入力します。

values = csapi(x,y,xx)

は、ノットなしの端点条件を使用して、与えられたデータ (x,y) に対する 3 次スプライン内挿の xx における値を返します。この内挿は、ブレーク シーケンス x をもつ区分的三次関数であり、その 3 次部分が結合して、2 つの連続状態変数の微係数をもつ関数を形成します。"ノットなし" の端点条件とは、最初と最後の内部ブレークで、3 階微分でも連続である (丸め誤差を除く) ことを意味します。

2 つのデータ点のみを指定すると、直線内挿になります。

x = [0 1];
y = [2 0];
xx = linspace(0,6,121);
plot(xx,csapi(x,y,xx),'k-',x,y,'ro')
title('Interpolant to Two Points')

Figure contains an axes object. The axes object with title Interpolant to Two Points contains 2 objects of type line. One or more of the lines displays its values using only markers

3 つの点への内挿

3 つのデータ点を指定すると、関数は放物線を出力します。

x = [2 3 5];
y = [1 0 4];
plot(xx,csapi(x,y,xx),'k-',x,y,'ro')
title('Interpolant to Three Points')

Figure contains an axes object. The axes object with title Interpolant to Three Points contains 2 objects of type line. One or more of the lines displays its values using only markers

5 つの点への内挿

より一般的な例として、4 つまたは 5 つのデータ点を指定すると、関数は 3 次スプラインを出力します。

x = [1 1.5 2 4.1 5];
y = [1 -1 1 -1 1];
plot(xx,csapi(x,y,xx),'k-',x,y,'ro')
title('Cubic Spline Interpolant to Five Points')

Figure contains an axes object. The axes object with title Cubic Spline Interpolant to Five Points contains 2 objects of type line. One or more of the lines displays its values using only markers

丸め誤差を除き、x が少なくとも 4 つのエントリをもつベクトルであると仮定すると、ステートメント pp = csapi(x,y) は次のステートメントと同じスプラインを pp に配置します。ただし、この 2 つ目の方法で取得したスプラインの記述では、x(2)x(n-1) でブレークを使用しません。

pp = fn2fm(spapi(augknt(x([1 3:(end-2) end]),4),x,y),"pp");

簡単な二変量の例として、Ricker ウェーブレットに双三次スプライン内挿をプロットします。

x =.0001 + (-4:.2:4); 
y = -3:.2:3;
[yy,xx] = meshgrid(y,x);
r = pi*sqrt(xx.^2+yy.^2); 
z = sin(r)./r;
bcs = csapi({x,y},z); 
fnplt(bcs) 
axis([-5 5 -5 5 -.5 1])

Figure contains an axes object. The axes object contains an object of type surface.

MATLAB® ではエントリ z(i,j) を (x(j),y(i)) の値と見なすため、コードでは meshgrid の呼び出しで xy が逆になります。対して、Curve Fitting Toolbox® は近似理論標準に従うため、z(i,j) は (x(i),y(j)) の値になります。

このため、以下に示すように、MATLAB の関数 mesh を使用してこのような二変量スプラインの値をプロットするときは注意が必要です。

xf = linspace(x(1),x(end),41); 
yf = linspace(y(1),y(end),41);
mesh(xf,yf,fnval(bcs,{xf,yf}).')

Figure contains an axes object. The axes object contains an object of type surface.

fnval から取得した値の転置行列を使用している点に注意してください。

入力引数

すべて折りたたむ

近似対象のデータ値 y のデータ サイト。ベクトル、または多変量データの場合は cell 配列として指定します。スプライン f は、j のすべての値について f(x(j)) = y(:,j) を満たすよう、各データ サイト x のノットによって作成されます。

多変量グリッド データの場合、x を、各変数の次元のデータ サイトを指定する cell 配列として指定できます。f(x1(i),x2(j),...xn(k)) = y(:,i,j,...,k)

データ型: single | double

スプライン作成時の近似対象のデータ値。ベクトル、行列、または配列として指定します。データ値 y(:,j) は、スカラー、行列、または n 次元配列にすることができます。同じデータ サイト x のデータ値は平均化されます。

データ型: single | double

スプラインが評価される評価点。ベクトル、または多変量データの場合はベクトルの cell 配列として指定します。スプラインの評価は fnval を使用して実行されます。

データ型: single | double

出力引数

すべて折りたたむ

pp 型のスプライン。次のフィールドがある構造体として返されます。pp 型の詳細については、pp 型を参照してください。

スプラインの形式。pp として返されます。pp は、スプラインが区分的多項式型であることを示します。

スプラインのノットの位置。ベクトル、または多変量データの場合はベクトルの cell 配列として返されます。ベクトルには厳密に増加する要素が含まれます。これらの要素は、多項式区分が定義される各区間の開始と終了を表します。

各区分の多項式の係数。行列、または多変量データの場合は配列として返されます。

スプラインを記述する多項式区分の数。スカラー、または多変量データの場合は各変数の区分数のベクトルとして返されます。

スプラインの各多項式区分を記述する多項式関数の次数。スカラー、または多変量データの場合は各変数の次数を含むベクトルとして返されます。

ターゲット関数の次元。スカラーとして返されます。

評価されたスプライン。ベクトルまたは行列として、または多変量データの場合は配列として返されます。スプラインは特定の評価点 xx で評価されます。

アルゴリズム

csapiPGS からの Fortran ルーチン CUBSPL の実装です。

このアルゴリズムでは、MATLAB のスパース行列機能を使用して、関連する三重対角線形システムを構成し、解決します。

このアルゴリズムはさらに、ノットなしの端点条件を使用しているため、内挿の最初および 2 番目の多項式区分と、最後から 2 番目および最後の多項式区分を強制的に一致させます。

バージョン履歴

R2006b で導入