Solución:
Un primer acercamiento consiste en parametrizar la función o dibujarla con coordenadas polares. Esto puede ser un desafío arduo en el caso de funciones complejas como en la que está trabajando.
Un segundo enfoque es usar la opción con estrella *
de restrict z to domain*=0:1000
para recortar los valores grandes. Sin embargo, el inconveniente es que la superficie de truncamiento está retraída:
MWE:
documentclass[]{article}
usepackage{pgfplots}
begin{document}
pgfplotsset{compat=1.17}
begin{tikzpicture}
begin{axis}[zmin=0,zmax=1000,restrict z to domain*=0:1000]
addplot3[surf,samples=85, samples y= 85,domain=-1:1,y domain=-1:1,opacity=0.5]{1/(x*y)^2};
end{axis}
end{tikzpicture}
end{document}
Un tercer enfoque basado en una solución alternativa dada por Christian Feuersänger (autor de Pgfplots) de la segunda es superponer la superficie de truncamiento con otro color de superficie. Esto se puede hacer teóricamente implementando un gráfico de contorno con contour gnuplot
en lugar de surf
. Desafortunadamente, esto no funciona como se esperaba.
MWE (nombre del archivo.Texas):
documentclass[]{article}
usepackage{pgfplots}
usepgfplotslibrary{colormaps}
begin{document}
pgfplotsset{compat=1.8}
begin{tikzpicture}
begin{axis}[zmin=0,zmax=1000,colormap/autumn,]
addplot3[surf,samples=80, restrict z to domain*=0:1000,samples y= 80,domain=-1:1,y domain=-1:1, opacity=0.5]({x},{y},{1/(x*y)^2}); %{1/(x*y)^2};
% the contour plot:
addplot3[
contour gnuplot={levels={1000},labels=false,contour dir=z,},samples=80,domain=-1:1,y domain=-1:1,z filter/.code={defpgfmathresult{1000}},]
({x},{y},{1/(x*y)^2});
%filling the contour:
addplot3[
/utils/exec={pgfplotscolormapdefinemappedcolor{1000}},
draw=none,
fill=mapped color]
file {filename_contourtmp0.table};
end{axis}
end{tikzpicture}
end{document}
Un cuarto enfoque es con gnuplot 5.4 y el comando set pm3d clip z
(esto no es compatible con versiones anteriores de gnuplot)
MWE (gnuplot 5.4):
set border 4095;
set bmargin 6;
set style fill transparent solid 0.50 border;
unset colorbox;
set view 56, 15, .75, 1.75;
set samples 40, 40;
set isosamples 40, 40;
set xyplane 0;
set grid x y z vertical;
set pm3d depthorder border linewidth 0.100;
set pm3d clip z;
set pm3d lighting primary 0.8 specular 0.3 spec2 0.3;
set xrange [-1:1];
set yrange [-1:1];
set zrange [0:1000];
set xtics 0.5 offset 0,-0.5;
set ytics 0.5 offset 0,-0.5;
set ztics 100;
f(x,y) = 1/(x*y)**2;
splot f(x,y) with pm3d fillcolor "red";
Desafortunadamente, TikZ no puede leer archivos de tabla GNUPLOT 3D (generar con splot
), consulte TikZ PGF Packages Manual 3.1.5, página 342, es decir,
documentclass[]{article}
usepackage{pgfplots}
begin{document}
pgfplotsset{compat=1.8}
begin{tikzpicture}
begin{axis}
addplot3[raw gnuplot,surf] gnuplot[id=surf] { %
set border 4095;
set bmargin 6;
set style fill transparent solid 0.50 border;
unset colorbox;
set view 56, 15, .75, 1.75;
set samples 40, 40;
set isosamples 40, 40;
set xyplane 0;
set grid x y z vertical;
set pm3d depthorder border linewidth 0.100;
set pm3d clip z;
set pm3d lighting primary 0.8 specular 0.3 spec2 0.3;
set xrange [-1:1];
set yrange [-1:1];
set zrange [0:1000];
set xtics 0.5 offset 0,-0.5;
set ytics 0.5 offset 0,-0.5;
set ztics 100;
f(x,y) = 1/(x*y)**2;
splot f(x,y) with pm3d fillcolor "red";
};
end{axis}
end{tikzpicture}
end{document}
da: Tabular output of this 3D plot style not implemented
Una solución alternativa es utilizar gnuplottex
paquete con el terminal de salida TikZ.
MWE (aún no probado, ya que trabajo con TeX Live)
documentclass{article}
usepackage{graphicx}
usepackage{latexsym}
usepackage{ifthen}
usepackage{moreverb}
usepackage{tikz}
usepackage{gnuplot-lua-tikz}
usepackage[miktex]{gnuplottex}
begin{document}
begin{figure}%
centering%
begin{gnuplot}[terminal=tikz]
set out "tex-gnuplottex-fig1.tex"
set term lua tikz latex createstyle
set border 4095;
set bmargin 6;
set style fill transparent solid 0.50 border;
unset colorbox;
set view 56, 15, .75, 1.75;
set samples 40, 40;
set isosamples 40, 40;
set xyplane 0;
set grid x y z vertical;
set pm3d depthorder border linewidth 0.100;
set pm3d clip z;
set pm3d lighting primary 0.8 specular 0.3 spec2 0.3;
set xrange [-1:1];
set yrange [-1:1];
set zrange [0:1000];
set xtics 0.5 offset 0,-0.5;
set ytics 0.5 offset 0,-0.5;
set ztics 100;
f(x,y) = 1/(x*y)**2;
splot f(x,y) with pm3d fillcolor "red";
end{gnuplot}
caption{This is using the texttt{tikz}-terminal}%
label{pic:tikz}%
end{figure}%
end{document}
Un quinto enfoque con PSTricks y psplotThreeD
MWE:
documentclass[pstricks,border=12pt]{standalone}
usepackage{pst-3dplot}
begin{document}
centering
begin{pspicture}(-10,-4)(15,20)
psset{Beta=15}
psplotThreeD[plotstyle=line,linecolor=blue,drawStyle=yLines,
yPlotpoints=100,xPlotpoints=100,linewidth=1pt](-5,5)(-5,5){%
x y mul 2 neg exp
dup 5 gt { pop 5 } if % truncation
}
psplotThreeD[plotstyle=line,linecolor=cyan,drawStyle=xLines,
yPlotpoints=100,xPlotpoints=100,linewidth=1pt](-5,5)(-5,5){%
x y mul 2 neg exp
dup 5 gt { pop 5 } if % truncation
}
pstThreeDCoor[xMin=-1,xMax=5,yMin=-1,yMax=5,zMin=-1,zMax=6]
end{pspicture}
end{document}
Siguiendo la respuesta de John Bowman, profundicé en Asíntota. Mientras aprendía a usarlo, me sorprendieron bastante sus posibilidades. Mi respuesta sigue a esta publicación, que presenta un truco de Asymptote llamado crop3D
eso resuelve mi problema. Aunque es bastante ‘caro’ (computacionalmente), me gusta el hecho de que esta técnica no requiere mucha instalación adicional, y que se puede aplicar casi a ciegas (por lo tanto, también podría usarse para obtener una bonito truncamiento de la función Gamma, por ejemplo). Aqui esta mi codigo
documentclass{article}
usepackage{asymptote}
begin{document}
begin{figure}[h!]
begin{asy}
import crop3D;
import graph3;
unitsize(1cm);
size3(5cm,5cm,3cm,IgnoreAspect);
real f(pair z) {
if ((z.x*z.y)^2 > 0.001)
return 1/(z.x*z.y)^2;
else
return 1000;
}
currentprojection = orthographic(10,5,5000);
currentlight = (1,-1,2);
surface s = surface(f,(-1,-1),(1,1),nx=100,Spline);
s = crop(s,(-1,-1,0),(1,1,500));
draw(s,lightyellow,render(merge=true));
xaxis3("$x$",Bounds,OutTicks(Step=1));
yaxis3("$y$",Bounds,OutTicks(Step=1));
zaxis3("$z$",Bounds,OutTicks(Step=500));
end{asy}
end{figure}
end{document}
y la salida correspondiente:
Muchas gracias a todos por su esfuerzo y apoyo.
Aquí está el código de Asíntota para producir un gráfico 3D interactivo de la función Gamma.