Python 使用arctan/arctan2绘制从0到2π的曲线;

Python 使用arctan/arctan2绘制从0到2π的曲线;,python,numpy,matplotlib,Python,Numpy,Matplotlib,我试图复制柯蒂斯在《轨道力学》中的一个情节,但我就是不太明白。然而,我已经通过从np.arctan切换到np.arctan2取得了进展 也许我没有正确地实现arctan2 import pylab import numpy as np e = np.arange(0.0, 1.0, 0.15).reshape(-1, 1) nu = np.linspace(0.001, 2 * np.pi - 0.001, 50000) M2evals = (2 * np.arctan2(1, 1 / ((

我试图复制柯蒂斯在《轨道力学》中的一个情节,但我就是不太明白。然而,我已经通过从
np.arctan
切换到
np.arctan2
取得了进展

也许我没有正确地实现
arctan2

import pylab
import numpy as np

e = np.arange(0.0, 1.0, 0.15).reshape(-1, 1)

nu = np.linspace(0.001, 2 * np.pi - 0.001, 50000)
M2evals = (2 * np.arctan2(1, 1 / (((1 - e) / (1 + e)) ** 0.5 * np.tan(nu / 2) -
           e * (1 - e ** 2) ** 0.5 * np.sin(nu) / (1 + e * np.cos(nu)))))

fig2 = pylab.figure()
ax2 = fig2.add_subplot(111)

for Me2, _e in zip(M2evals, e.ravel()):
    ax2.plot(nu.ravel(), Me2, label = str(_e))

pylab.legend()
pylab.xlim((0, 7.75))
pylab.ylim((0, 2 * np.pi))
pylab.show()
在下图中,出现了间断。该函数应该是平滑的,在y范围(0,2pi)内以0和2pi连接,不接触0和2pi

教科书情节和方程式:

应索洛·卡斯特罗的要求,我被告知:

问题可能在于arctan函数,该函数将“原理值”作为输出

因此,如果x是第二象限或第三象限中的角度,则arctan(tan(x))不会产生x。如果你从x=0到x=Pi绘制arctan(tan(x)),你会发现它在x=Pi/2处有一个不连续的跳跃


对于您的情况,我相信您应该编写arctan2(1,1/arg),而不是编写arctan(arg),其中arg是arctan函数的参数。这样,当arg变为负值时,arctan2将在第二象限而不是第四象限产生一个角度。”

通常的做法是将2pi加在
arctan()的负值结果中。OP建议用arctan2(1,1/x)代替arctan(x),也由Maple 15的文档建议为,产生相同的结果,无需求和2pi。两者如下所示:

import pylab
import numpy as np
e = np.arange(0.0, 1.0, 0.15).reshape(-1, 1)
nu = np.linspace(0, 2*np.pi, 50000)
x =  ((1-e)/(1+e))**0.5 * np.tan(nu/2.)
x2 = e*(1-e**2)**0.5 * np.sin(nu)/(1 + e*np.cos(nu))
using_arctan = True
using_OP_arctan2 = False

if using_arctan:
    M2evals = 2*np.arctan(x) - x2
    M2evals[M2evals<0] += 2*np.pi
elif using_OP_arctan2:
    M2evals = 2 * np.arctan2(1,1/x) - x2

fig2 = pylab.figure()
ax2 = fig2.add_subplot(111)
for M2e, _e in zip(M2evals, e.ravel()):
    ax2.plot(nu.ravel(), M2e, label = str(_e))
pylab.legend(loc='upper left')
pylab.show()
导入pylab
将numpy作为np导入
e=np.arange(0.0,1.0,0.15)。重塑(-1,1)
nu=np.linspace(0,2*np.pi,50000)
x=((1-e)/(1+e))**0.5*np.tan(nu/2.)
x2=e*(1-e**2)**0.5*np.sin(nu)/(1+e*np.cos(nu))
使用_arctan=True
使用_OP_arctan2=False
如果使用_arctan:
M2evals=2*np.arctan(x)-x2

M2evals[M2Evalst要正确使用arctan2,你需要一个x的方程和一个y的方程。arctan2的全部要点是y/x的比值对于象限是不明确的:-/-=+/+和-/+=+=+/-。如果你把y作为常数,你仍然只能在结果中占据两个象限。所以你说的没有意义:这不可能都是e求一个等式,然后填充你说的象限。(因为你现在说的是“我有这个等式,它不起作用”,我们没有足够的信息来回答这个问题,这不是一个可以回答的问题。)太好了!请注意,在教科书中的方程中,arctan仅在第一项上,而不是整个方程。请看tan^-1正右侧的括号,其中是匹配的括号。它位于tan之后(θ/2),而不是在整个等式的末尾。在你的等式中,你在做整个事情的arctan。我同意@tom10,这似乎是一个错误的结束paren的例子。或者两个。这个问题应该结束了,imho。这只是OP部分的一个括号输入错误,没有说明其他任何事情(由于方向错误,尤其不是arctan vs arctan 2)。因此,以“过于本地化”结束。在这里使用arctan 2(1,1/x)而不是arctan(x)是非常荒谬的。@tom10我明白你的意思,最初我建议使用
arctan
从-pi到pi,但是使用
arctan 2(1,1/x)
它给出了与教科书相同的图形。请随意使用arctan应用任何更正并获得相同的图形results@dustin你能解释一下你用的是arctan(x)=arctan 2(1,1/x)吗?因为通常的做法是使用arctan(x)并将
2pi
和为负数results@SaulloCastro一位物理学家建议在
arctan2
@dustin中使用
1,1/x
,最好在问题或答案中包含这一点