使用Tikz
/ pgfplots
,如何绘制具有两个变量的函数,例如:
|x| + |y| <= 1 / sqrt(2)
?
如果该函数只有一个输入,X
则很容易绘制:
\begin{figure}[!hb]
\centering
\begin{tikzpicture}[scale=1.0]
\begin{axis}
\addplot[domain=-10000:10000, blue, ultra thick] {abs(x)};
\end{axis}
\end{tikzpicture}
\caption{Plot of $\abs(x)$}
\end{figure}
但是,以下会产生错误
\addplot[domain=-10000:10000, blue, ultra thick] {abs(x) + abs(y) <= 1 / sqrt(2)};
答案1
您可以使用参数化(在本例中是两个):
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis lines=middle,
domain=-1/sqrt(2):1/sqrt(2),
samples=400,
xmin=-1.5,
xmax=1.5,
ymin=-1.5,
ymax=1.5,
axis on top=true
]
\addplot+[mark=none,cyan,fill] ({x},{max(1/sqrt(2)-abs(x),0)}) \closedcycle;
\addplot+[mark=none,cyan,fill] ({x},{min(abs(x)-1/sqrt(2),0)}) \closedcycle;
\end{axis}
\end{tikzpicture}
\end{document}
答案2
使用 PSTricks 的隐式情节宏:
\psplotImp[<options>](-2,-2)(2,2){abs(x)+abs(y)-const}
最小工作示例:
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-func}
\begin{document}
\begin{pspicture}(-2,-2)(2,2)
\pstVerb{/const 1 2 sqrt div def}%
\pspolygon*[linecolor=cyan](!const 0)(!0 const)(!const neg 0)(!0 const neg)
\psplotImp[linecolor=red,algebraic,stepFactor=0.1](-2,-2)(2,2){abs(x)+abs(y)-const}
\psaxes{->}(0,0)(-2,-2)(2,2)[$x$,0][$y$,90]
\end{pspicture}
\end{document}
算法
\psplotImp
下面的动画揭示了幕后使用的机密算法。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-func}
\begin{document}
\multido{\r=1.5+-0.1}{15}{%
\begin{pspicture}(-1,-1)(1,1)
\pstVerb{/const 1 2 sqrt div def}%
\psplotImp[linecolor=red,algebraic,stepFactor=\r](-1,-1)(1,1){abs(x)+abs(y)-const}
\end{pspicture}}
\end{document}
答案3
MWE
使用Asymptote
,使用contour
模块。
一些注释:边界构造为
guide g=(contour(f,(-1,-1),(1,1), new real[]{1/sqrt(2)}))[0][0];
,其中表达式new real[]{1/sqrt(2)}
代表级别值的内联数组(在本例中只有一个1/sqrt(2)
)。尾随[0][0]
意味着通常返回一个曲线矩阵,其中第一个索引对应于级别数组中的索引,第二个索引计数对应于特定级别值的曲线。
% imp.tex :
\documentclass{article}
\usepackage[inline]{asymptote}
\usepackage{lmodern}
\begin{document}
\begin{figure}
\begin{asy}
size(300);
import graph;
import contour;
defaultpen(fontsize(10pt));
pen bgColor=paleyellow;
real f(pair v){return abs(v.x)+abs(v.y);};
guide g=(contour(f,(-1,-1),(1,1), new real[]{1/sqrt(2)}))[0][0];
pen linePen=deepblue+1bp;
pen fillPen=deepblue+opacity(0.3);
pen xyPen=darkblue+0.4bp;
filldraw(g,fillPen,linePen);
real du=0.02;
xaxis(-0.8-du,0.8+du,xyPen, LeftTicks(OmitTick(0),Step=0.2,step=0.1),above=true);
yaxis(-0.8-du,0.8+du,xyPen,RightTicks(OmitTick(0),Step=0.2,step=0.1),above=true);
shipout(bbox(Fill(bgColor)));
\end{asy}
\end{figure}
\end{document}
%% Process:
%
% pdflatex imp.tex
% asy -f pdf imp-*.asy
% pdflatex imp.tex