splin3d
interpolação spline em grides 3d
Seqüência de Chamamento
tl = splin3d(x, y, z, v) tl = splin3d(x, y, z, v, order)
Parâmetros
- x,y,z
vetores linhas estritamente crescentes (cada um com pelo menos três componentes) definindo o grid de interpolação 3d
- v
uma hipermatriz nx x ny x nz (nx, ny, nz sendo de comprimentos de
x
,y
ez
, respectivamente)- order
(opcional) um vetor 1x3 [kx,ky,kz] dada a ordem do tensor spline em cada direção (o padrão é [4,4,4], i.e. spline tricúbico)
- tl
um tlist do tipo splin3d definindo o spline
Descrição
Esta função computa um spline tensor 3d s que
interpola os pontos (xi,yj,zk,vijk), i.e., temos
s(xi,yj,zk)=vijk para todo
i=1,..,nx, j=1,..,ny e
k=1,..,nz. O spline resultante s
é definido por tl
que consiste em uma representação
B-tensor-spline de s. A avaliação de s em alguns
pontos deve ser feita pela função interp3d
(para computar s e suas derivadas primeiras) ou pela função
bsplin3val (para computar uma derivada
arbitrária de s) . Vários tipos de splines podem ser computados
selecionando a ordem dos splines em cada direção
order=[kx,ky,kz]
.
Observação : Esta função funciona sob as condições
nx, ny, nz ≥ 3 |
2 ≤ kx < nx |
2 ≤ ky < ny |
2 ≤ kz < nz |
Há erro quando estas condições não são respeitadas.
Exemplos
// exemplo 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 pontos de interpolação x = linspace(0,1,n); y=x; z=x; // grid de interpolação [X,Y,Z] = ndgrid(x,y,z); V = f(X,Y,Z); tl = splin3d(x,y,z,V,[5 5 5]); m = 10000; // computando um erro aproximado 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)) // tente agora com n=20 e veja o erro
// exemplo 2 (veja a página de ajuda de linear_interpn que contém o // mesmo exemplo com interpolação trilinear) // ============================================================================= exec("SCI/modules/interpolation/demos/interp_demo.sci", -1); 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); // computando e exibindo o spline interpolante 3d em algumas fatias 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 clf [nb_col, vmin, vmax] = (128, min(VF), max(VF)); color = dsearch(VF,linspace(vmin,vmax,nb_col+1)); gcf().color_map = jet(nb_col); gca().hiddencolor = gca().background; colorbar(vmin,vmax) plot3d(XF, YF, list(ZF,color), flag=[-1 6 4]) title("interpolação por spline 3d da função "+func, "fontsize",3)
Ver Também
- linear_interpn — interpolação linear n-dimensional
- interp3d — função de avaliação spline 3d
- bsplin3val — função de avaliação de derivada arbitrária de spline 3d
Report an issue | ||
<< splin2d | Interpolação | CACSD >> |