Main Content

spapi

説明

spline = spapi(knots,x,y) は、次の次数のスプライン f (存在する場合) を返します。

k = length(knots) - length(x)
節点シーケンス knots は次の場合に使用します。
(*)  f(x(j)) = y(:,j), all j.
x のエントリのいくつかが同じである場合、次のようになります。

Dm(j)f(x(j))=y(:,j)

ここで、m(j)={i<j:x(i)=x(j)} であり、Dmf は、f の m 階微分です。この場合、x におけるサイト z の r 倍の反復は、z での f の、値の規定と最初の r – 1 導関数に対応します。代わりに、すべてのデータ値の平均を同じデータと一致させるには、追加の 4 番目の引数を指定して spapi を呼び出します。

データ値 y(:,j) は、スカラー、ベクトル、行列、または N 次元配列にすることができます。

spapi(k,x,y) (k は正の整数) は、必要なスプラインの次数 k を指定します。この場合、関数 spapi は関数 aptknt を呼び出して、特定のサイト x の実行可能な (必ずしも最適ではない) 節点シーケンスを判定します。つまり、コマンド spapi(k,x,y) には、より明示的なコマンド spapi(aptknt(x,k),x,y) と同じ効果があります。

spapi({knork1,...,knorkm},{x1,...,xm},y) は、"グリッド" データのテンソル積スプライン内挿の B 型を返します。ここで、各 knorki は節点シーケンス、または i 番目の変数で使用される多項式の次数を指定する正の整数のどちらかです。その後、関数 spapi は、i 番目の変数に対応する節点シーケンスを提供します。さらに、y は (r+m) 次元配列でなければならず、y(:,i1,...,im) であればデータは i1, ..., im のすべてにわたり、サイト [x{1}(i1),...,x{m}(im)] で当てはめられます。一変量の場合とは異なり、スプラインがスカラー値の場合には、ym 次元配列になることができます。

spapi(...,'noderiv') では、文字ベクトルまたは string スカラー 'noderiv' が 4 番目の引数となり、同じサイトを共有するデータ値が異なる方法で解釈される場合を除き、spapi(...) と同じ効果があります。4 番目の引数がある場合、同じデータ サイトをもつデータ値の平均がそのサイトで内挿されます。この引数がない場合、同じデータ サイトをもつデータ値は、この「説明」の最初の段落で説明したように、そのサイトにおいて一致する連続する導関数の値と見なされます。

すべて折りたたむ

関数 spapi([0 0 0 0 1 2 2 2 2],[0 1 1 1 2],[2 0 1 2 -1]) は、次の 5 つの条件を満たす、内部節点を 1 に 1 つだけもつ区間 [0...2] における一意の 3 次スプライン f を生成します。

f(0+)=2,f(1)=0,Df(1)=1,D2f(1)=2,f(2-)=-1.

これには、1 に 3 倍の一致、つまり関数の指定された値とその最初の 2 つの導関数との一致が含まれます。

次に、サイト x における 5 次スプラインによる値 y と勾配 s に対する接触内挿の例を示します。

sp = spapi(augknt(x,6,2),[x,x,min(x),max(x)],[y,s,ddy0,ddy1]);

ここで、ddy0 値と ddy1 の値は端点の 2 階微分に対応します。

関連する例として、3 次スプラインによって異なるデータ サイトに関数 sin(x) を内挿し、その勾配をサブシーケンス x(s) に一致させる場合は、次の引数で関数 spapi を呼び出します。

sp = spapi(4,[x x(s)], [sin(x) cos(x(s))]).

関数 aptknt は適切な節点シーケンスを提供します。同じデータを 5 次スプラインで内挿する場合は、単に値を 4 から 6 に変更するだけです。

二変量の例として、二変量内挿を次に示します。

x = -2:.5:2; y = -1:.25:1; [xx, yy] = ndgrid(x,y);
z = exp(-(xx.^2+yy.^2));
sp = spapi({3,4},{x,y},z); fnplt(sp)

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

グリッド データへの接触内挿の例としてここで示すのは、双三次多項式 g(u,v)=u3v3 から明示的に派生したデータを使用する、完全な双三次内挿です。これは、指定されたデータ値における勾配と、勾配の勾配 (交差微分) を置かなければならない正確な場所を確認するのに役立ちます。g は双三次多項式であるため、その内挿 fg そのものでなければなりません。これをテストします。

sites = {[0,1],[0,2]}; coefs = zeros(4,4); coefs(1,1) = 1;
g = ppmak(sites,coefs);
Dxg = fnval(fnder(g,[1,0]),sites);
Dyg = fnval(fnder(g,[0,1]),sites);
Dxyg = fnval(fnder(g,[1,1]),sites);
f = spapi({4,4}, {sites{1}([1,2,1,2]),sites{2}([1,2,1,2])}, ...
          [fnval(g,sites), Dyg ; ...
           Dxg.'         , Dxyg]);
if any( squeeze( fnbrk(fn2fm(f,'pp'), 'c') ) - coefs )
'something went wrong', end

入力引数

すべて折りたたむ

スプラインの節点シーケンス。非減少のベクトルとして指定します。

スプライン関数 f を評価する点。ベクトル、行列、または cell 配列として指定します。

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

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

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

データ型: single | double

出力引数

すべて折りたたむ

スプライン。次のフィールドがある構造体として返されます。

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

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

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

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

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

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

制限

与えらえた (一変量) 節点とサイトは、内挿を定義するために Schoenberg-Whitney 条件を満たさなければなりません。サイト シーケンス x が非減少の場合、次のようになります。

knots(j)<x(j)<knots(j+k), all j

ここで、knots(1) と knots(end) で等式が成り立ちます。多変量の場合、これらの条件は各変数に個別に保持しなければなりません。

アルゴリズム

関数は、spcol を呼び出して、概ブロック対角選点行列 (Bj,k(x)) (上記で説明したように、x には導関数を示す反復あり) を提供し、slvblk は、ブロック QR 分解を使用して線形システム (*) を解きます。

関数は、一変量のスプライン近似が近似されている値に比例するという事実を利用して、グリッド データをテンソル積により一度に 1 変数ずつ近似します。

バージョン履歴

R2006b で導入