Please note that the recommended version of Scilab is 2025.0.0. This page might be outdated.
See the recommended documentation of this function
splin3d
3次元補間グリッドのスプライン
呼び出し手順
tl = splin3d(x, y, z, v, [order])
パラメータ
- x,y,z
3次元補間グリッドを定義する単調増加の行ベクトル (各行には最低3個の要素)
- v
nx x ny x nz ハイパー行列 (nx, ny, nz は
x
,y
およびz
の長さ)- order
(オプション) 1x3 ベクトル [kx,ky,kz] で, 各方向へのテンソルスプラインの次数を指定します (デフォルトは [4,4,4], すなわち, 3次元3次スプライン).
- tl
スプラインを定義するsplin3d型のtlist
説明
この関数は,
(xi,yj,zk,vijk)個の点を補間する
3次元テンソルスプラインs
を計算します.
すなわち,i=1,..,nx, j=1,..,ny
およびk=1,..,nzについて
s(xi,yj,zk)=vijkとなります.
得られるスプラインsは,sの
Bスプラインテンソル表現により構成されるtl
により定義されます.
いくつかの点で
(sおよびその1階微分を計算する)
interp3d関数,または,
(sの任意微分を計算する)
bsplin3val関数により,
sの評価を行う必要があります.
いくつかの種類のスプラインを,各方向のスプラインの次数
order=[kx,ky,kz]
を選択することにより
計算することができます.
注意
この関数は以下の条件で動作します:
これらの条件が考慮されない場合にエラーが発生します.
例
// 例1 // ============================================================================= func = "v=cos(2*%pi*x).*sin(2*%pi*y).*cos(2*%pi*z)"; deff("v=f(x,y,z)",func); n = 10; // n x n x n 補間点 x = linspace(0,1,n); y=x; z=x; // 補間グリッド [X,Y,Z] = ndgrid(x,y,z); V = f(X,Y,Z); tl = splin3d(x,y,z,V,[5 5 5]); m = 10000; // 近似誤差を計算 xp = grand(m,1,"def"); yp = grand(m,1,"def"); zp = grand(m,1,"def"); vp_exact = f(xp,yp,zp); vp_interp = interp3d(xp,yp,zp, tl); er = max(abs(vp_exact - vp_interp)) // n=20で再試行し,誤差を見る // 例 2 (linear_interpn のヘルプを参照ください, // trilinear補間に関する同じ例があります) // ============================================================================= exec("SCI/modules/interpolation/demos/interp_demo.sci") func = "v=(x-0.5).^2 + (y-0.5).^3 + (z-0.5).^2"; deff("v=f(x,y,z)",func); n = 5; x = linspace(0,1,n); y=x; z=x; [X,Y,Z] = ndgrid(x,y,z); V = f(X,Y,Z); tl = splin3d(x,y,z,V); // いくつかの断面で3次元スプラインを計算(および表示) m = 41; dir = ["z=" "z=" "z=" "x=" "y="]; val = [ 0.1 0.5 0.9 0.5 0.5]; ebox = [0 1 0 1 0 1]; XF=[]; YF=[]; ZF=[]; VF=[]; for i = 1:length(val) [Xm,Xp,Ym,Yp,Zm,Zp] = slice_parallelepiped(dir(i), val(i), ebox, m, m, m); Vm = interp3d(Xm,Ym,Zm, tl); [xf,yf,zf,vf] = nf3dq(Xm,Ym,Zm,Vm,1); XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf]; VF = [VF vf]; Vp = interp3d(Xp,Yp,Zp, tl); [xf,yf,zf,vf] = nf3dq(Xp,Yp,Zp,Vp,1); XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf]; VF = [VF vf]; end nb_col = 128; vmin = min(VF); vmax = max(VF); color = dsearch(VF,linspace(vmin,vmax,nb_col+1)); xset("colormap",jetcolormap(nb_col)); clf(); xset("hidden3d",xget("background")); colorbar(vmin,vmax) plot3d(XF, YF, list(ZF,color), flag=[-1 6 4]) xtitle("3d spline interpolation of "+func) show_window()
参照
- linear_interpn — n 次元線形補間
- interp3d — 3次スプライン評価関数
- bsplin3val — 3次元スプラインの任意微分評価関数
作者
- R.F. Boisvert, C. De Boor (code from the CMLIB fortran lib)
- B. Pincon (scilab interface)
<< splin2d | Interpolation | CACSD >> |