Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
5.3.1 - Português

Change language to:
English - Français - 日本語 -

Please note that the recommended version of Scilab is 2025.0.0. This page might be outdated.
See the recommended documentation of this function

Ajuda Scilab >> Interpolação > splin3d

splin3d

interpolação spline em grides 3d

Seqüência de Chamamento

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 e z, 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")
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
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("interpolação por spline 3d da função "+func)
show_window()

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

Autores

  • R.F. Boisvert, C. De Boor (código da biblioteca FORTRAN CMLIB)
  • B. Pincon (interface Scilab)
<< splin2d Interpolação CACSD >>

Copyright (c) 2022-2024 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Thu Mar 03 11:00:30 CET 2011