我需要在 tikzpicture 中绘制函数(e^x-x)^(1/(x)^2)
,但接近 0,显然乳胶无法确定它,无法绘制它的图形。
这是我正在使用的代码:
\documentclass[1cm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
scale=1,
xlabel=$x$,
ylabel=$y$,
axis x line=middle,
axis y line=middle,
xtick={-2,-1,1,2,3,4,5,6},
xticklabels={},
ytick={-2,-1,1,2,3,4,5,6,7},
yticklabels={},
xmin=-0.7, xmax=4.7,
ymin=-0.5, ymax=4.7,
%xmajorgrids=true,
%ymajorgrids=true,
grid style=dashed
]
\addplot[domain=0.015:2,smooth,no marks,blue,samples=1000,line width=0.5] {(e^x-x)^(1/(x)^2)};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
e
未定义 --- 您必须使用exp(x)
。在这种情况下,它“有效”。(在这种情况下,会出现大量数值噪声,这是预料之中的……)
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning,calc}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
scale=1,
xlabel=$x$,
ylabel=$y$,
axis x line=middle,
axis y line=middle,
xtick={-2,-1,1,2,3,4,5,6},
xticklabels={},
ytick={-2,-1,1,2,3,4,5,6,7},
yticklabels={},
xmin=-0.7, xmax=4.7,
ymin=-0.5, ymax=4.7,
%xmajorgrids=true,
%ymajorgrids=true,
grid style=dashed
]
\addplot[domain=0.015:2,no marks,blue,samples=1000,line width=0.5] {(exp(x)-x)^(1/(x)^2)};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
Asymptote 适合这种情况。编译于http://asymptote.ualberta.ca/
import graph;
size(6cm);
//real f(real x) {return (x != 0.0) ? (exp(x)-x)^(1/(x)^2) : 1.0;}
real f(real x) {return (exp(x)-x)^(1/(x)^2);}
pair F(real x) {return (x,f(x));}
xaxis("$x$",xmin=-0.1,xmax=2.3, Ticks(Step=1, step=0.5, Size=3,NoZero),Arrow);
yaxis("$y$",ymin=-0.1,ymax=2, Ticks(Step=1, step=0.5,
Size=3,NoZero,end=false,endlabel=false),Arrow);
label("$0$",(0,0),2dir(-135));
draw(graph(f,2*sqrtEpsilon,2,300),blue+.7bp);
label("$ (e^x-x)^{\textstyle \frac{1}{x^2}}$",F(2),SW);
write(f(realEpsilon)); // 1
write(f(2*sqrtEpsilon)); // 1.64872127070013
write(2*sqrtEpsilon); // 2.98023223876953e-08
答案3
正如@hpekristiansen提到的,你可以使用泰勒展开来巧妙地解决这个问题。如果你不这样做,那么正如@Rmano指出的那样,存在“数值噪声”破坏图形外观的问题。类似的问题出现在这里。有 Asymptote 或 LuaTex 等选项可以提供您想要的数值精度。还有一个软件包sagetex
为您提供开源 CAS Sage。使用 Sage,您可以获得从矩阵到导数到积分、图论等的数学知识,以及数值精确的结果。请参阅这里了解更多信息。您还可以获得 Python。使用 Python、CAS 和 LaTeX,您可以解决各种问题。搜索此网站,您会发现各种问题都可以用sagetex
。例如,这里Sage 即时确定素数并绘制它们。无需文件。
正如我在文章中提到的那样,我们可以强制 Sage 进行计算并将数据推送到 LaTeX,这样您就可以获得准确的点数pgfplots
。我所做的就是更改点数之间的步长。由于step = .10
将包括 0,我将其更改为step = .13
。以下是针对您的函数改编的代码:
\documentclass[11pt,border=1mm]{standalone}
\usepackage{sagetex}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{sagesilent}
LowerX = -1
UpperX = 3
LowerY = -1
UpperY = 3
step = .13
t = var('t')
g(x)= (e^x-x)^(1/(x)^2)
x_coords = [t for t in srange(LowerX,UpperX,step)]
y_coords = [g(t).n(digits=6) for t in srange(LowerX,UpperX,step)]
output = r"\begin{tikzpicture}"
output += r"\begin{axis}[xmin=%f,xmax=%f,ymin= %f,ymax=%f,"%(LowerX,UpperX,LowerY, UpperY)
output += r"xlabel=$x$,ylabel=$y$,axis x line=middle,axis y line=middle,"
output += r"grid style=dashed]"
output += r"\addplot[thin, blue, unbounded coords=jump] coordinates {"
for i in range(0,len(x_coords)-1):
if (y_coords[i])<LowerY or (y_coords[i])>UpperY:
output += r"(%f , inf) "%(x_coords[i])
else:
output += r"(%f , %f) "%(x_coords[i],y_coords[i])
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\end{document}
结果,可钙看起来像这样:
你会发现数值噪音消失了。如果你想清楚地表明存在不连续性,你可以添加代码,如答案中所示这里。
我总是不得不提到 Sage 不是您的 LaTeX 发行版的一部分。使用它的最佳方式是使用免费的 Cocalc 帐户。如果您喜欢它,您可能希望将其下载到您的计算机,这样您就不需要 Cocalc 了。这可能更具挑战性,具体取决于您的计算机。
编辑:与您的评论相关,如果您运行我发布的代码然后注释掉,\pgfplotsset{compat=1.16}
那么当您构建文件时,警告区域会告诉您它不喜欢什么:
Cocalc 应该会给你一些关于问题所在。