Saltar al contenido

Truncar un gráfico de superficie 3D singular con valores grandes

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:

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

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)

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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:

producción

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *