【发布时间】:2016-12-01 20:42:37
【问题描述】:
我正在尝试使用 Tkinter 在 Python 中创建一个 GUI,该 GUI 使用 Runge-Kutta 方法绘制质量的轨道路径。我的 GUI 工作正常,但我的问题是,无论我向 GUI 输入什么值,它都只会绘制一条直线。 我希望有人能告诉我我在 GUI 中的功能有什么问题,以便它能够正确地绘制轨道。
def calcPath(self):
M = float(self.entM.get())
m = float(self.entm.get())
G = 6.67e-11
c = 3e8
velocity = np.array([float(self.entvx.get()),float(self.entvy.get()),float(self.entvz.get())])
pos = np.array([float(self.entx.get()), float(self.enty.get()), float(self.entz.get())])
Force = lambda pos: (G*m*M/(pos**2))
#assigning variables empty lists to append x, y and z values to
a = []
b = []
c = []
t = 0.0
tf = float(self.enttf.get())
dt = float(self.entdt.get())
while t < tf: # creating a while loop to trace the path for a set period of time
#using the Runge-kutta formula from the problem sheet to assign variables at different steps and half steps
k1v=(dt*Force(pos))/m
k2v=(dt*Force(pos+(k1v/2.0)))/m
k3v=(dt*Force(pos+(k2v/2.0)))/m
k4v=(dt*Force(pos+k3v))/m
velocity=velocity+(k1v/6.0)+(k2v/3.0)+(k3v/3.0)+(k4v/6.0) #calaculating the weighted average of the k values
pos=pos+velocity*dt #velocity is not a function of space or time so it will be identical at all 4 k values
a.append(pos[0]) # appending the lists for each vaiable to produce a plot
b.append(pos[1])
c.append(pos[2])
t = t+dt # setting the time steps
#generating the path plot figure and formatting it
ax = Axes3D(self.fig) #creating a 3D figure
ax.set_title("Path of planetary mass") #produces title on the figure
ax.plot3D(a,b,c, color='darkviolet', label='Runge-kutta path method')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.legend(loc='lower left') #selecting the location of legend
self.canvas.show()
【问题讨论】:
-
不确定,但
pos[0](和其他人)是否有可能对所有迭代使用相同的引用,从而导致a、b和c中的值相同? -
我已将 force 函数更改为在位置数组上使用 np.square 但不幸的是,当我运行它时它仍然只是绘制一条直线
-
你能在每次迭代时
print(id(pos[0])看看它是否产生相同的数字吗?
标签: python-2.7 runge-kutta orbital-mechanics