我试图编写一个代码,使用椭圆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吐出正确的值,但是图是空白的。出现极坐标图窗口,但没有绘制任何内容。
请帮忙。提前谢谢。
答案 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()
顺便说一句,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))
这将theta
和r
定义为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()