
Я попытался построить график неявной функции. Я получаю одно и то же сообщение об ошибке: "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
.