绘制椭圆轨道

时间:2012-09-11 18:19:27

标签: python matplotlib astronomy orbital-mechanics

我试图编写一个代码,使用椭圆r = a(1-e ^ 2)/(1 + e * cos(theta))的等式绘制对象的椭圆路径。我也希望将这些数据放入数组中供其他用途。

from numpy import *#Imports Python mathematical functions library
import matplotlib.pyplot as plt #Imports plot library
from pylab import *

a = 5
e = 0.3
theta = 0
while theta <= 2*pi:
    r = (a*(1-e**2))/(1+e*cos(theta))
    print("r = ",r,"theta = ",theta)
    plt.polar(theta, r)
    theta += pi/180

plt.show()

代码为r和theta吐出正确的值,但是图是空白的。出现极坐标图窗口,但没有绘制任何内容。

请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:8)

不要为每一点致电plt.polar一次。相反,调用它一次,将所有数据作为输入:

import numpy as np #Imports Python mathematical functions library
import matplotlib.pyplot as plt #Imports plot library
cos = np.cos
pi = np.pi

a = 5
e = 0.3
theta = np.linspace(0,2*pi, 360)
r = (a*(1-e**2))/(1+e*cos(theta))
plt.polar(theta, r)

print(np.c_[r,theta])

plt.show()

enter image description here


顺便说一句,numpy可以做一个双线计算,而不是使用while循环:

theta = np.linspace(0,2*pi, 360)   # 360 equally spaced values between 0 and 2*pi
r = (a*(1-e**2))/(1+e*cos(theta))  

这将thetar定义为numpy数组(而不是单个值)。

答案 1 :(得分:2)

我认为你需要做points.append([theta,r])然后在最后plt.polar(points) ...这也是一个有点整洁的设计

from numpy import *#Imports Python mathematical functions library
import matplotlib.pyplot as plt #Imports plot library
from pylab import *

a = 5
e = 0.3
theta = 0

points = []
while theta <= 2*pi:
    r = (a*(1-e**2))/(1+e*cos(theta))
    print("r = ",r,"theta = ",theta)
    points.append((theta, r))
    theta += pi/180
#plt.polar(points) #this is cool but probably not what you want
plt.polar(*zip(*points))
plt.show()