python 使用arctan /arctan 2绘制从0到2π的a

yeotifhr  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(158)

我试图复制柯蒂斯的《轨道力学》中的一个情节,但我就是不太明白。但是,我已经从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()

在下图中,出现了不连续性。该函数应该是平滑的,并且在(0,2 pi)的y范围内的0和2 pi处连接,而不接触0和2 pi。

教科书图和方程:

应Saullo Castro的要求,我被告知:
问题可能在于反正切函数,它给出“主值”作为输出。
因此,如果x是第二或第三象限中的Angular ,则arctan(tan(x))不会产生x。如果你画出从x = 0到x = Pi的arctan(tan(x)),你会发现它在x = Pi/2处有一个不连续的跳跃。
对于你的例子,而不是写arctan(arg),我相信你会写arctan 2(1,1/arg),其中arg是你的arctan函数的参数。这样,当arg变为负值时,arctan 2将在第二象限而不是第四象限产生一个Angular 。

okxuctiv

okxuctiv1#

通常的做法是在arctan()的负结果中对2pi求和,这可以有效地完成。OP建议用arctan 2(1,1/x)代替arctan(x),Yay 295指出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()

9q78igpj

9q78igpj2#

给定x和y坐标,下面的代码将正确计算0到2pi之间的Angular (假设Angular 是从x轴逆时针测量的)。如果arctan2的输出是负的,它只是以简单有效的方式对2pi求和。

import numpy as np
np.arctan2(y,x) + -1*(np.sign(np.arctan2(y,x))-1)*np.pi

相关问题