Tikz:使用轮廓 gnuplot 绘制隐函数图

Tikz:使用轮廓 gnuplot 绘制隐函数图

我尝试绘制一个隐式函数。我一直收到相同的错误消息:“未定义变量:设置”。

提前致谢。

\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}

答案1

在此处输入图片描述

在图中,我们可以看到f(x, y) = x/(2\sqrt{x +y}) +\sqrt{x +y} +2x与值 20 对应的函数的水平曲线。请注意,提问者的目标是表示 100 的水平曲线。

该解决方案基于一些计算,这些计算得出y作为函数的结果x(主要是求解二次方程)。当然,存在一个正性条件,它给出了的定义域x。绘图基于 TikZ 而不是 pgfplots。我不知道如何使命令contour起作用。

所绘制的函数被命名tmpM并按tmpP其形式引入;它们绘制在两个区间的并集上,这两个区间的边界由函数计算xLIni(即左区间的初始 x),......

在下面的代码中,有一个设置为 10 的变量;它对应于级别曲线的\a值。2*\a

评论。所涉及的数字很快就会变得太大。因此,必须全局修改单位(请参阅[x=6.7pt, y=.1pt])。

代码

\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}

答案2

如果您想使用该gnuplot set语法,您必须使用该raw gnuplot选项来调用它。

除非你真的需要 rawgnuplot来做 不支持的事情pgfplots,否则我建议使用gnuplot内部函数pgfplots,如下所示。请注意,要绘制的函数必须是pgfplots数学语法中,即您需要使用^而不是**

编辑:Gnuplot 需要write18启用(外部命令)。使用 进行编译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}

您还可以使用contour lua来完全绕过gnuplot编译,而使用lualatex。有关pgfplots等高线图的更多详细信息,请参阅手册pgfplots

相关内容