splin2d
双3次スプラインのグリッド2次元補間
呼び出し手順
C = splin2d(x, y, z, [,spline_type])
引数
x
1行nx列のdouble行列, 補間点のx座標. i=1,2,...,nx-1について,
x(i)<x(i+1)であることが必要です.
y
1行ny列のdouble行列, 補間点のy座標. i=1,2,...,ny-1について,
y(i)<y(i+1)であることが必要です.
z
nx行ny列のdouble行列, 関数値.
spline_type
1行1列の文字列行列, 計算するスプラインの型.
利用可能な値は, spline_type="not_a_knot"および spline_type="periodic".
C
双3次パッチの係数. このsplin2dの出力引数はinterp2d関数の入力引数です.
説明
この関数は,点(xi,yj,zij)を補間する,
すなわち,全てのi=1,..,nxおよび
j=1,..,nyについて
s(xi,yj)=zijとなるような,
双3次スプラインまたはサブスプライン
sを計算します.
得られるスプラインはsは
(x,y,C)の組で定義されます.
ただし,C は,
(nx-1)(ny-1)個の双3次パッチの各々の係数
[x(i) x(i+1)]x[y(j) y(j+1)]
を有する
(長さ16(nx-1)(ny-1)の)ベクトルです,
sは次のように定義されます :
いくつかの点でinterp2d関数により
sの評価を行う必要があります.
適当なspline_typeパラメータを選択することにより,
複数の種類のスプラインを計算することができます.
双3次スプライン(またはサブスプライン)を計算するために使用する方法は,
古い形式の手法,すなわち,
各グリッドの点(xi,yj)において
1階微分ds/dx(xi,yj) および
ds/dy(xi,yj)と相互微分
d2s/dxdy(xi,yj)の近似値を計算する手法です.
これらの微係数は,C2関数
(sは連続2階微分可能)となる
1次元スプライン法の平均,または
C1関数となるローカルな近似法の平均により,計算されます.
この手法は,spline_typeパラメータにより
選択されます.(詳細は,
splinを参照ください) :
"not_a_knot"
これがデフォルトです.
"periodic"
基本関数に周期性がある場合に使用します:
[1,ny]の範囲のあらゆるjについてz(1,j) = z(nx,j),
[1,nx]の範囲のあらゆるuについてz(i,1) = z(i,ny)
となる必要がありますが,これはインターフェイスでは検証されません.
注意
精度の観点から,not_a_knot型,また
基本となる補間関数に周期性がある場合にはperiodic型を使用してください.
natural, monotone, fast (または
fast_periodic) 型は,
例えば発振を防止したい場合(monotone
がこの用途には最も強力です)に有用です.
より簡便な方法で双三次パッチの係数を得るには,
c = hypermat([4,4,nx-1,ny-1],C)を使用し,
続いてパッチ(i,j)(前記の式参照)
の係数(k,l)
をc(k,l,i,j)に保存します.
ただし,interp2d関数は,
ハイパー行列cではなく,
大きなベクトルCを引数として受け入れます
(C=c(:)とすることでcから
容易にCを取得できます).
例
n = 7; // a regular grid with n x n interpolation points
// will be used
x = linspace(0,2*%pi,n); y = x;
z = cos(x')*cos(y);
C = splin2d(x, y, z, "periodic");
m = 50; // discretization parameter of the evaluation grid
xx = linspace(0,2*%pi,m); yy = xx;
[XX,YY] = ndgrid(xx,yy);
zz = interp2d(XX,YY, x, y, C);
emax = max(abs(zz - cos(xx')*cos(yy)));
clf()
plot3d(xx, yy, zz, flag=[2 4 4])
[X,Y] = ndgrid(x,y);
param3d1(X,Y,list(z,-9*ones(1,n)), flag=[0 0])
str = msprintf(" with %d x %d interpolation points. ermax = %g",n,n,emax)
xtitle("spline interpolation of cos(x)cos(y)"+str)
// example 2 : different interpolation functions on random data
n = 6;
x = linspace(0,1,n); y = x;
z = rand(n,n);
np = 50;
xp = linspace(0,1,np); yp = xp;
[XP, YP] = ndgrid(xp,yp);
ZP1 = interp2d(XP, YP, x, y, splin2d(x, y, z, "not_a_knot"));
ZP2 = linear_interpn(XP, YP, x, y, z);
ZP3 = interp2d(XP, YP, x, y, splin2d(x, y, z, "natural"));
ZP4 = interp2d(XP, YP, x, y, splin2d(x, y, z, "monotone"));
xset("colormap", jetcolormap(64))
clf()
subplot(2,2,1)
plot3d1(xp, yp, ZP1, flag=[2 2 4])
xtitle("not_a_knot")
subplot(2,2,2)
plot3d1(xp, yp, ZP2, flag=[2 2 4])
xtitle("bilinear interpolation")
subplot(2,2,3)
plot3d1(xp, yp, ZP3, flag=[2 2 4])
xtitle("natural")
subplot(2,2,4)
plot3d1(xp, yp, ZP4, flag=[2 2 4])
xtitle("monotone")
show_window()
参照
cshep2d
linear_interpn
interp2d
履歴
5.4.0
以前では, 入力引数の虚部は暗黙のうちに無視されていました.