2013-05-17 10 views
7

Ich versuche, eine Grafik in Orbital Mechanics von Curtis zu replizieren, aber ich kann es nicht ganz bekommen. Ich habe jedoch den Weg frei gemacht, indem ich von np.arctan2 von np.arctan wechselte.mit arctan/arctan2 zum plotten a von 0 bis 2π

Vielleicht implementiere ich arctan2 falsch?

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

In der Abbildung unten tauchen Diskontinuitäten auf. Die Funktion soll glatt sein und bei 0 und 2 Pi im y-Bereich von (0, 2pi) verbinden und 0 und 2pi nicht berühren.

enter image description here

Lehrbuch Handlung und Gleichung:

enter image description here

enter image description here

Auf Antrag des Saullo Castro, wurde mir gesagt, dass:

„Das Problem liegt in kann die Arctan-Funktion, die "Hauptwerte" als Ausgabe angibt.

Somit ergibt arctan (tan (x)) nicht x, wenn x ein Winkel im zweiten oder dritten Quadranten ist. Wenn Sie arctan (tan (x)) von x = 0 bis x = Pi zeichnen, werden Sie feststellen, dass es einen diskontinuierlichen Sprung bei x = Pi/2 hat.

Für Ihren Fall, anstatt arctan (arg) zu schreiben, glaube ich, dass Sie arctan2 (1, 1/arg) schreiben würden, wo arg das Argument Ihrer arctan Funktion ist. Auf diese Weise, wenn arg negativ wird, arctan2 einen Winkel im zweiten Quadranten ergibt eher als die vierten.“

+3

Um korrekt arctan2 zu verwenden, benötigen Sie eine Gleichung für x und eine Gleichung für y. Der ganze Punkt von arctan2 ist, dass das Verhältnis y/x um den Quadranten mehrdeutig ist: -/- == +/+ und -/+ == +/-. Wenn Sie y als Konstante eingeben, können Sie im Ergebnis immer nur zwei Quadranten belegen. Was du sagst, ergibt keinen Sinn: Das kann nicht die Gleichung sein und die Quadranten füllen, die du sagst. (Da alles, was Sie jetzt sagen, ist "Ich habe diese Gleichung und es funktioniert nicht", haben wir nicht genug Informationen, um dies zu beantworten und es ist keine Frage, die beantwortet werden kann.) – tom10

+0

@ tom10 es sehr nah an funktioniert, wenn wir .6 - .9 herausnehmen, ist die Lösung richtig. Es ist oberhalb von .6 aber vielleicht niedriger, da der Bereich von .15 ist. – dustin

+0

Dennoch gibst du den Leuten nicht genug Informationen, ich würde gerne wissen wohin du gehst, nicht wo du angefangen hast. "In der Nähe zu korrigieren" ist nicht besonders hilfreich. Dies scheint keine Frage zu sein, sondern eine Frage zu dem, was in deinem Lehrbuch steht. – tom10

Antwort

9

Die übliche Praxis, 2 * pi in den negativen Ergebnissen von arctan(), which can be done efficiently zu summieren ist. Das Vorschlag des OP zu ersetzen, arctan (x) durch arctan2 (1,1/x), die ebenfalls von Maple 15 der Dokumentation vorgeschlagen, wie durch @ Yay295 wies darauf hin, erzeugt die gleichen Ergebnisse ohne die Notwendigkeit 2 * pi zusammenzufassen Beide sind wie folgt:.

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

Wenn Sie zu meinem zweiten Kommentar wechseln und von 0 auf 2pi gehen, ist es auch an der richtigen Stelle von 0 bis 2pi auf der x-Achse. – dustin

+0

Ich aktualisiert, während Sie editierten ... zögern Sie nicht, es jetzt zu aktualisieren –

+1

Ich habe die neue PNG-Datei hinzugefügt und die Grenzen und arctan2 geändert. Vielen Dank. – dustin