我想为我所教的一门课程制作一个漂亮的单摆相空间图。本质上,这归结为绘制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 上运行的代码:
如果这更符合您的想法,我可以删除第一个“答案”。