Tikz: Gráfico de una función implícita usando gnuplot de contorno

Tikz: Gráfico de una función implícita usando gnuplot de contorno

Intenté trazar una función implícita. Sigo recibiendo el mismo mensaje de error: "variable indefinida: establecida".

Gracias de antemano.

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{pgfplots.fillbetween} 
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    title={Implicit Function Plot},
    xlabel={$x$},
    ylabel={$y$},
    xmin=0, xmax=50,
    ymin=0, ymax=50,
    view={0}{90}, % 
]

\addplot3[
    thick,
    contour gnuplot={levels={0}, labels=false}, % Adjust 'levels' as needed
    samples=50, % Increase for higher resolution
    samples y=50, % Explicitly defining samples y for clarity
    domain=0:50,
    domain y=0:50,
] 
    gnuplot {
        set contour base;
        set cntrparam levels discrete 0;
        unset surface;
        set view map;
        splot -1/2*(x+y)**(-1/2)*x + 100 - (x+y)**(1/2) - 2*x;
    };

\end{axis}
\end{tikzpicture}
\end{document}

Respuesta1

ingrese la descripción de la imagen aquí

En la figura podemos ver la curva de nivel de la función f(x, y) = x/(2\sqrt{x +y}) +\sqrt{x +y} +2xcorrespondiente al valor 20. Tenga en cuenta que el objetivo del interrogador era representar la curva de nivel de 100.

La solución se basa en algunos cálculos que dan ycomo resultado x(principalmente resolviendo ecuaciones cuadráticas). Por supuesto hay una condición de positividad que da el dominio para x. El dibujo está basado en TikZ y no en pgfplots. No sé cómo hacer que contourfuncione el comando.

Las funciones dibujadas se nombran tmpMy tmpPse presentan como tales; se dibujan en la unión de dos intervalos cuyos límites se calculan mediante las funciones xLIni(es decir, x inicial del intervalo izquierdo), ...

En el código siguiente, hay una variable \aque se establece en 10; Corresponde al valor 2*\ade la curva de nivel.

Observación.Las cifras involucradas se vuelven demasiado grandes muy rápidamente. Por este motivo, las unidades deben modificarse globalmente (ver [x=6.7pt, y=.1pt]).

El código

\documentclass[11pt, margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}

\tikzmath{%
  function xLIni(\c) {%
    return {\c -2*\c};
  };
  function xLEnd(\c) {%
    return {(2*\c +1/2 -pow(2*\c +1/4, .5))/2};
  };
  function xRIni(\c) {%
    return {(2*\c +1/2 +pow(2*\c +1/4, .5))/2};
  };
  function xREnd(\c) {%
    return {\c +2*\c};
  };
  function tmpM(\t, \c) {%
    \tmp = (\t -\c)*(\t -\c) -\t/2;
    return {2*\tmp -\t/2 -2*(\t -\c)*pow(\tmp, .5)};
  };
  function tmpP(\t, \c) {%
    \tmp = (\t -\c)*(\t -\c) -\t/2;
    return {2*\tmp -\t/2 +2*(\t -\c)*pow(\tmp, .5)};
  };
}
\begin{tikzpicture}[x=6.7pt, y=.1pt,
  evaluate={\a = 10; \b = int(\a*\a); \cst = int(2*\a);}]
  \draw[->] ({xLIni(\a) -1}, 0) -- ({xREnd(\a) +1}, 0) node[above] {$x$};
  \draw[->] (0, -.2) -- (0, {1.7*xREnd(\a)*xREnd(\a)}) node[left] {$y$};

  \draw (\a, 0) -- +(0, 20) -- +(0, -20) node[below] {$\a$};
  \draw (0, \b) -- +(.3, 0) -- +(-.3, 0) node[left] {$\b$};
  
  \begin{scope}[every path/.style={%
      blue, very thick, variable=\t, samples=100
    }]
    \draw[domain={xLIni(\a)}:{xLEnd(\a)}] plot (\t, {tmpM(\t, \a)});
    \draw[domain={xLIni(\a)}:{xLEnd(\a)}] plot (\t, {tmpP(\t, \a)});
    \draw[domain={xRIni(\a)+.05}:{xREnd(\a)}] plot (\t, {tmpP(\t, \a)});
    \draw[domain={xRIni(\a)+.05}:{xREnd(\a)}] plot (\t, {tmpM(\t, \a)});      
  \end{scope}
\end{tikzpicture}

\end{document}

Respuesta2

Si desea utilizar la gnuplot setsintaxis, debe invocarla con la raw gnuplotopción.

A menos que realmente necesites raw gnuplotpara hacer cosas que no son compatibles con pgfplots, recomendaría usarlo gnuplotdesde dentro pgfplotscomo se muestra a continuación. Tenga en cuenta que la función que se va a trazar debe seren pgfplotssintaxis matemática, es decir, es necesario utilizar ^en lugar de **.

EDITAR: Gnuplot necesita write18(comandos externos) habilitados. Compilar usando pdflatex --shell-escape file.tex.

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{pgfplots.fillbetween} 
\pgfplotsset{compat=newest}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[
      title={Implicit Function Plot},
      xlabel={$x$},
      ylabel={$y$},
      xmin=0, xmax=50,
      ymin=0, ymax=50,
      view={0}{90}, % 
      ]
      \addplot3[
        thick,
        contour gnuplot={levels={0,10,20,30}, labels=false},
        samples=100, 
        samples y=100,
        domain=0:50,
        domain y=0:50,
        ]{-1/2*(x+y)^(-1/2)*x + 100 - (x+y)^(1/2) - 2*x};
    \end{axis}
  \end{tikzpicture}
\end{document}

También puede utilizar contour luapara omitir por completo gnuplota favor de la compilación utilizando lualatex. Para obtener más detalles sobre pgfplotslos gráficos de contorno, consulteel pgfplotsmanual.

información relacionada