用arctan/arctan2绘制0到2π的a

2024-10-01 02:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图复制柯蒂斯在轨道力学中的一个情节,但我只是不能完全理解。然而,我已经通过从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。

enter image description here

教科书情节和方程式:

enter image description here

enter image description here

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

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

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

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


Tags: 函数importnppiargnu情节象限
1条回答
网友
1楼 · 发布于 2024-10-01 02:22:32

通常的做法是在arctan()which can be done efficiently的负结果中求和2*pi。OP建议用arctan2(1,1/x)代替arctan(x),Maple 15的文档也建议用@Yay295来代替arctan(x),产生相同的结果,而无需求和2*pi。两者都显示如下:

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()

enter image description here

相关问题 更多 >