Tikz: График неявной функции с использованием контура gnuplot

Tikz: График неявной функции с использованием контура gnuplot

Я попытался построить график неявной функции. Я получаю одно и то же сообщение об ошибке: "undefined variable: set".

Заранее спасибо.

\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 левого интервала), ...

В приведенном ниже коде есть переменная \a, которой присвоено значение 10; она соответствует значению 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опцией.

Если вам действительно не нужно raw gnuplotдля выполнения вещей, которые не поддерживаются pgfplots, я бы рекомендовал использовать gnuplotего изнутри, pgfplotsкак показано ниже. Обратите внимание, что функция, которую нужно построить, должна бытьв pgfplotsматематическом синтаксисе, т. е. вам нужно использовать ^вместо **.

EDIT: 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.

Связанный контент