使用 pgfplots 绘制简单摆相空间图:寻找巧妙的参数化

使用 pgfplots 绘制简单摆相空间图:寻找巧妙的参数化

我想为我所教的一门课程制作一个漂亮的单摆相空间图。本质上,这归结为绘制y^2/2 = cos(x) + e不同值e(能量)的图。如果我求解y并绘制结果表达式,则曲线在附近出现断裂y=0。求解x并绘制反函数只会将问题转移到x=0。以下是 MWE(对于e = -0.5):

\documentclass{article}

\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
 \begin{axis}
  \addplot[domain=-1:1,samples=100] ({ acos(x^2/2+0.5)}, x);
  \addplot[domain=-1:1,samples=100] ({-acos(x^2/2+0.5)}, x);
 \end{axis}
\end{tikzpicture}

\begin{tikzpicture}
 \begin{axis}
  \addplot[domain=-60:60,samples=100] { sqrt(2*(cos(x)-0.5))};
  \addplot[domain=-60:60,samples=100] {-sqrt(2*(cos(x)-0.5))};
 \end{axis}
\end{tikzpicture}

\end{document}

我猜测存在一个巧妙的曲线参数化方法可以消除这个问题,但到目前为止还无法找到它。

答案1

这是解决您在上面的评论中提到的问题的一种方法:使用为sagetex您提供 CAS 功能的软件包智者运行计算。代码可能对您来说没有多大意义,但您需要做的就是更改 e 的值。通过使用 Sage 的隐式绘图函数,我们不需要那么多样本。

\documentclass{article}
\usepackage{sagetex}
\usepackage{pgfplots}
\begin{document}
\begin{sagesilent}
e = -.5
y,t = var('y,t')
f(x,y) = y^2-cos(x)
p = implicit_plot(f==e,(-4, 4),(-4, 4))
P = p.matplotlib()
R = P.get_children()[1]
S = R.collections[0]
r = S.get_paths()[0]
v = r.vertices
xvals = v[:,0]
yvals = v[:,1]

output = ""
output += r"\begin{tikzpicture}"
output += r"\begin{axis}[xmin=-3,xmax=3,ymin=-3,ymax=3]"
output += r"\addplot+[blue,mark size=0.17pt] coordinates {"
for i in range(0,len(xvals)):
    output += r"(%f, %f) "%(xvals[i],yvals[i])
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\begin{sagesilent}
e = .8
y,t = var('y,t')
f(x,y) = y^2-cos(x)
p = implicit_plot(f==e,(-4, 4),(-4, 4))
P = p.matplotlib()
R = P.get_children()[1]
S = R.collections[0]
r = S.get_paths()[0]
v = r.vertices
xvals = v[:,0]
yvals = v[:,1]

output = ""
output += r"\begin{tikzpicture}"
output += r"\begin{axis}[xmin=-3,xmax=3,ymin=-3,ymax=3]"
output += r"\addplot+[blue,mark size=0.17pt] coordinates {"
for i in range(0,len(xvals)):
    output += r"(%f, %f) "%(xvals[i],yvals[i])
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\end{document}

您需要在计算机上安装 Sage 才能sagetex使用软件包,或者使用(免费)帐户SageMath 云您可以在云端工作时访问 Sage。以下是在 SageMath Cloud 上运行的代码:在此处输入图片描述

如果这更符合您的想法,我可以删除第一个“答案”。

相关内容