Main Content

多変量テンソル積スプライン

多変量テンソル積スプラインの紹介

このツールボックスには、一変量スプラインのテンソル積として、任意の個数の変数による (多項式) スプライン関数が用意されています。これらの多変量スプラインには、B 型および pp 型という標準的な形式が両方あり、それらの作成と使用は、前出のセクションpp 型スプラインの作成と操作 およびB 型スプラインの作成と操作 で説明した一変量スプラインの場合とまったく同じです。作成と使用には同じコマンドが使用されます。

簡単にするため、次の説明では、二変量スプラインのみを取り上げます。

B 型のテンソル積スプライン

テンソル積の考え方は非常にシンプルです。f が x の関数、g が y の関数である場合、テンソル積 p(x,y) := f(x)g(y) は x と y の関数、つまり、二変量関数となります。より一般的には、s = (s1,...,sm+h) 個および t = (t1,...,tn+k) 個の節点シーケンスと、対応する係数配列 aij (i = 1,...,m; j = 1,...n) を使用して、次の 二変量スプラインが得られます。

f(x,y)=i=1mj=1nB(x|si,...,si+h)B(y|tj,...,tj+k)aij

このスプラインの B 型は、節点シーケンスの cell 配列 {s,t}、係数配列 a、数値ベクトル [m,n]、および次数ベクトル [h,k] により構成されます。以下のコマンドを入力します。

sp = spmak({s,t},a);

これで、この形式が作成されます。さらに、fnpltfnvalfnderfndirfnrfn、および fn2fm を使用して、この形式のプロット、評価、微分と積分、調整、および変換を実行できます。

グリッド データを使用した作成

多くの場合、グリッド データの内挿または近似を求めることにより、このような形式を作成します。たとえば、直交グリッドのすべての点における関数 g の値 z(i,j)=g(x(i),y(j)),i=1:m, j=1:n がわかっている場合、厳密に増加するシーケンス x が上記の節点シーケンス s に関して Schoenberg-Whitney 条件を満たし、厳密に増加するシーケンス y が上記の節点シーケンス t に関して Schoenberg-Whitney 条件を満たすと仮定すると、コマンド

sp=spapi({s,t},[h,k],{x,y},z);

は、与えられた値に適合する上記形式の固有の 二変量スプラインを作成します。コマンド fnplt(sp) により、内挿をすばやくプロットできます。コマンド pp = fn2fm(sp,'pp') は、このスプラインの pp 型を提供します。これはおそらく、細かいグリッド ( i=1:M, j=1:N に対する (xx(i),yy(j)) ) で、次のコマンドによってスプラインを評価する場合に必要となります。

values = fnval(pp,{xx,yy});

pp 型のテンソル積スプライン

このような 二変量スプラインの pp 型も同様に、ブレーク シーケンスの cell 配列、多次元係数配列、数値区分のベクトル、および多項式次数のベクトルにより構成されます。幸い、ツールボックスは、通常は、ユーザーがいずれの型の詳細も考慮する必要がない方法でセットアップされます。内挿、近似、または平滑化を使用してスプラインを作成し、その後、fn... コマンドでそれらを使用します。

例: メビウスの帯

以下に、3 次元値 二変量スプラインとして作成された曲面の例を示します。この曲面は、有名なメビウスの帯です。細長い紙切れを用意し、ねじって両端を接着することで取得できます。Figure は、以下のコマンドによって得られます。

x = 0:1; y = 0:4; h = 1/4; o2 = 1/sqrt(2); s = 2; ss = 4;
v(3,:,:) = h*[0, -1, -o2, 0, o2, 1, 0;0, 1, o2, 0, -o2, -1, 0];
v(2,:,:) = [ss, 0, s-h*o2, 0, -s-h*o2, 0, ss;...
            ss, 0, s+h*o2, 0,-s+h*o2, 0, ss];
v(1,:,:) = s*[0, 1, 0, -1+h, 0, 1, 0; 0, 1, 0, -1-h, 0, 1, 0];
cs = csape({x,y},v,{'variational','clamped'});
fnplt(cs), axis([-2 2 -2.5 2.5 -.5 .5]), shading interp
axis off, hold on
values = squeeze(fnval(cs,{1,linspace(y(1),y(end),51)}));
plot3(values(1,:), values(2,:), values(3,:),'k','linew',2)
view(-149,28), hold off

ベクトル値 二変量スプライン内挿によって作成されたメビウスの帯

The image shows a two-dimensional loop with a single twist. A black curve follows one of the edges before and after the twist.

関連するトピック