2013-05-17 46 views
7

我想複製柯蒂斯的軌道力學中的一個情節,但我無法完全理解它。不過,我已經從np.arctan切換到np.arctan2使用arctan/arctan2繪製一個從0到2π

也許我錯誤地執行了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和2pi的y範圍(0,2pi)不連接0和2pi時連接。

enter image description here

教材的情節和公式:

enter image description here

enter image description here

在Saullo卡斯特羅的要求,有人告訴我:

「問題可能出在將「原則值」作爲輸出的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將在第二象限中產生一個角度,而不是第四象限。「

+3

要正確使用arctan2,需要x的方程和y的方程。的arctan2是比例y/x對象限不明確: -/- == +/+和 -/+ == +/-。如果你把y作爲一個常數,你仍然只能在結果中佔據兩個象限。所以你所說的沒有意義:這不能既是方程,又是填充你所說的象限。 (既然你現在所說的是「我有這個方程式,它不起作用」,我們沒有足夠的信息來回答這個問題,這不是一個可以回答的問題。) – tom10

+0

@ tom10它非常接近如果我們取出.6 - .9,那麼解決方案是正確的。它低於.6,但可能下降,因爲範圍是.15 – dustin

+0

儘管如此,你還沒有給人足夠的信息,我想知道你去哪裏,而不是你開始的地方。 「接近正確」並不是特別有用。這似乎不是一個關於acrtan2的問題,而是一個關於你的教科書內容的問題。 – tom10

回答

9

通常的做法是在arctan()which can be done efficiently的否定結果中求和2 * pi.OP的建議替換Arctan(x)by arctan2(1,1/x),也由Maple 15的文檔,如@ Yay295指出的那樣,可以產生相同的結果,而不需要求和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

+1

如果您更改爲我的第二條評論,並且從0到2pi,則它也位於x軸的0到2pi的正確位置。 – dustin

+0

我在編輯時更新了...現在可以自由更新 –

+1

我添加了新的PNG文件並更改了邊界和arctan2。謝謝。 – dustin