如何在 TikZ 中绘制包含上限的函数?

如何在 TikZ 中绘制包含上限的函数?

我正在尝试在 TikZ 中绘制以下函数:

在此处输入图片描述

注意 log(.) 是自然对数。函数的不连续性发生在

在此处输入图片描述

这是 Mathematica 中函数的图。任何关于前进方向的帮助或建议都将不胜感激。

在此处输入图片描述

编辑:根据 marmot 的建议,端点(在不连续点处)似乎对计算点的误差很敏感。这是带有上限和下限的函数的样子。使用 marmot 建议的方法,当 x 接近较大的值(例如 x~0.7)时,函数停止“接触”边界。

在此处输入图片描述

答案1

如果你使用 Mathematica 等计算机代数系统 (CAS) 进行计算,那么自然的选择是使用名为 SAGE 的开源 CAS,它可以通过以下方式链接到 LaTeXsagetex文档是这里。您可以在文档中快速绘制 SAGE 图,但如果您想要获得更漂亮的图,则可以强制 SAGE 进行图计算并将数据推送到 tikz。快速简便绘图的一个例子是我答案中的 zeta 函数的第二个图这里在该示例中,zeta 函数绘制在一行中:\sageplot[width=6cm]{plot(zeta(x), (x, -3, 3),ymin=-4, ymax=5,detect_poles=True)},而强制将输出放入 tikz(第一个图)则需要更多的编码。

函数中的不连续性使我想要绘制成点的集合,就像我为Thomae 函数。还有一个额外的困难,即为了使输出看起来不像点,必须有很多点组合在一起才能呈现出一条线的外观。通过将函数分成 4 个图并减少绘制点之间的距离可以解决这个问题。请注意,过多地减少步长会产生比 LaTeX 可以处理的更多的点,因此这种方法需要进行一定程度的调整,以确保有足够的点,使图形看起来平滑,但又不能太多,以免 TeX 的内存超载。

\documentclass[border=5pt]{standalone}
\usepackage{sagetex}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\begin{document}
\begin{sagesilent}
LowerX = 0
UpperX = .85
LowerY = 0
UpperY = .01
step = .001
Scale = 1.2
xscale=1
yscale=1

x_coords = [t for t in srange(LowerX,.25,step)]
y_coords = [(t^(ceil(log(.01)*(1/(t-1)+1/2)))).n(digits=5) for t in srange(LowerX,.25,step)]

output = r""
output += r"\begin{tikzpicture}[scale=1]"
output += r"\begin{axis}[xmin=%f,xmax=%f,ymin= %f,ymax=%f]"%(LowerX,UpperX,LowerY, UpperY)
output += r"\addplot[red,only marks,mark options={mark size=.5pt}] 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"};"
################# SECOND PART
step = .0005
x_coords = [t for t in srange(.24,.48,step)]
y_coords = [(t^(ceil(log(.01)*(1/(t-1)+1/2)))).n(digits=5) for t in srange(.24,.48,step)]

output += r"\addplot[red,only marks,mark options={mark size=.5pt}] 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"};"

################# THIRD PART
x_coords = [t for t in srange(.47,.57,step)]
y_coords = [(t^(ceil(log(.01)*(1/(t-1)+1/2)))).n(digits=5) for t in srange(.47,.57,step)]

output += r"\addplot[red,only marks,mark options={mark size=.5pt}] 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"};"

###########FOURTH PART
step = .0001
x_coords = [t for t in srange(.56,UpperX,step)]
y_coords = [(t^(ceil(log(.01)*(1/(t-1)+1/2)))).n(digits=5) for t in srange(.56,UpperX,step)]

output += r"\addplot[red,only marks,mark options={mark size=.5pt}] 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}

在Cocalc中运行的代码如下所示: 在此处输入图片描述

由于 SAGE 不是 LaTeX 的一部分,你需要在你的机器上本地安装它,或者更好的选择是通过免费的 Cocalc 帐户访问它,你可以在这里。使用 Cocalc 帐户启动并运行不应超过 10 分钟;本地安装 SAGE 将花费更长时间。互联网上有大量有关 SAGE 的文档。以下是2D 绘图

相关内容