2013-04-17 103 views
-4

如何在python中繪製三維圖形?在3d中繪製Python

我想繪製軌道軌跡。 Plotting Orbital Trajectories

從上面的鏈接,我能夠得到設置功能的幫助。但我不知道如何在3D中進行繪圖。

運行時,它不會生成正確的軌跡。

切換np.linspacenp.arnage會導致內存錯誤,我在一臺運行Xubuntu的64位系統上運行16 GB Ram。

所以我嘗試轉換距離單位和時間單位,但有些不正確。也許我的數學或別的東西。

我讓149.6 * 10 ** 6 = 1 DU。一個TU被定義爲mu = DU ** 3/TU ** 2所以1TU = 2241.15DU/TU = 66751.4使用這些轉換,我有:我也嘗試使用x2,y2,z2來看看是否會工作。

import numpy as np 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt 
from numpy import linspace 
from mpl_toolkits.mplot3d import Axes3D 

mu = 1 
# r0 = [-149.6 * 10 ** 6, 0.0, 0.0] # Initial position 
# v0 = [29.9652, -5.04769, 0.0]  # Initial velocity 
u0 = [-1, 0.0, 0.0, 0.000448907, -0.0000756192, 0.0] 


def deriv(u, dt): 
    n = -mu/np.sqrt(u[0] ** 2 + u[1] ** 2 + u[2] ** 2) 
    return [u[3],  # dotu[0] = u[3]' 
      u[4],  # dotu[1] = u[4]' 
      u[5],  # dotu[2] = u[5]' 
      u[0] * n,  # dotu[3] = u[0] * n 
      u[1] * n,  # dotu[4] = u[1] * n 
      u[2] * n]  # dotu[5] = u[2] * n 

dt = np.arange(0.0, 20, .0001) # Time to run code in seconds' 
u = odeint(deriv, u0, dt) 
x, y, z, x2, y2, z2 = u.T 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot(x2, y2, z2) 
plt.show() 

但這個情節是不正確的。它應該是一個保持相同軌跡的橢圓。

enter image description here

#!/usr/bin/env python 
# This program solves the 3 Body Problem numerically and plots the 
# trajectories 

import numpy as np 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt 
from numpy import linspace 
from mpl_toolkits.mplot3d import Axes3D 

mu = 132712000000.0 
# r0 = [-149.6 * 10 ** 6, 0.0, 0.0] # Initial position 
# v0 = [29.9652, -5.04769, 0.0]  # Initial velocity 
u0 = [-149.6 * 10 ** 6, 0.0, 0.0, 29.9652, -5.04769, 0.0] 


def deriv(u, dt): 
    n = -mu/np.sqrt(u[0] ** 2 + u[1] ** 2 + u[2] ** 2) 
    return [u[3],  # dotu[0] = u[3]' 
      u[4],  # dotu[1] = u[4]' 
      u[5],  # dotu[2] = u[5]' 
      u[0] * n,  # dotu[3] = u[0] * n 
      u[1] * n,  # dotu[4] = u[1] * n 
      u[2] * n]  # dotu[5] = u[2] * n 

dt = np.linspace(0.0, 86400 * 700, 5000) # Time to run code in seconds' 
u = odeint(deriv, u0, dt) 
x, y, z, x2, y2, z2 = u.T 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot(x, y, z) 
plt.show() 

enter image description here

+0

到底是什麼問題? http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html – sashkello

+1

@sashkello我只用了一個星期的Python,所以我不熟悉如何做到這一點。 – dustin

+0

我給了你明確解釋如何去做的鏈接。在詢問之前自己嘗試一下,配對:) – sashkello

回答

1

你可以從字面上採取從頁面@sashkello第幾行,並插上xy,並且z您從ODE求解了。

http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html複製:

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

#<<solve for x, y, z here>># 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot(x, y, z) 
plt.show() 
+0

我一直在接受'在這個調用中完成了過多的工作(可能是錯誤的Dfun類型)。 以full_output = 1運行以獲取定量信息。 Traceback(最近一次調用最後一次): 文件「/home/dustin/Documents/School/UVM/Engineering/OrbitalMechanics/hw8problem4.py」,line 31,in ax = fig.add_subplot(111,projection ='3d ') AttributeError:'function'對象沒有屬性'add_subplot' – dustin

+1

「hw8problem4」 - 所以你期望有人做你的功課? – sashkello

+3

@sashkello我可以整天在Mathematica中畫這個。我正在學習Python。找到我的其他帖子,你會看到我可以實現我需要的其他方式。我也可以在Matlab中進行繪製。所以不要妄下結論,因爲我正在嘗試繪製一些我可以在另一個程序中做的事情。 – dustin