【问题标题】:Python plotting in 3dPython 3d 绘图
【发布时间】:2013-04-17 11:30:00
【问题描述】:

如何在 python 中进行 3D 绘图?

我正在尝试绘制轨道轨迹。 Plotting Orbital Trajectories

通过上面的链接,我能够获得有关设置功能的帮助。但是我不知道如何在 3D 中绘图。

运行时,它不会生成正确的轨迹。

np.linspace 切换到np.arnage 会导致内存错误,我在运行Xubuntu 和16 GB 内存的64 位系统上运行它。

所以我尝试转换距离单位和时间单位,但有些地方不正确。也许是我的数学或其他东西。

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

但这个情节也不正确。它应该是一个保持相同轨迹的椭圆。

#!/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()

【问题讨论】:

  • @sashkello 我只使用 Python 一周,所以我不熟悉如何做到这一点。
  • 我给了你一个明确解释如何做的链接。在询问之前自己尝试一下,伙计:)
  • @sashkello 好吧,您的链接对 6 个一阶微分方程的解集没有帮助。
  • 您的问题不是关于微分方程,而是关于绘图。你有(参数?)函数,你需要绘制它,就是这样。重新表述问题,以便清楚为什么标准绘图工具不起作用,否则看起来你要求做你的工作......

标签: python matplotlib


【解决方案1】:

您可以从 @sashkello 的那个页面中取出前几行,然后插入您从 ode 求解器获得的 xyz

复制自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()

【讨论】:

  • 我一直收到Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information. Traceback (most recent call last): File "/home/dustin/Documents/School/UVM/Engineering/OrbitalMechanics/hw8problem4.py", line 31, in &lt;module&gt; ax = fig.add_subplot(111, projection='3d') AttributeError: 'function' object has no attribute 'add_subplot'
  • @sashkello 我可以在 Mathematica 中绘制一整天。我正在努力学习 Python。找到我的其他帖子,您会看到我可以实现我需要查看其他方式的内容。我也可以在 Matlab 中绘制它。所以不要妄下结论,因为我正在尝试绘制一些我可以在另一个程序中做的事情。
  • @dustin,问题不在于此处的绘图,而在于您的其他问题的 ode 的解决方案。看看那里代码的 x、y 和 z 输出:它大部分是零,这就是绘图显示的内容。我的猜测是初始条件有问题,或者我在其他答案中对 odeint 求解器的实现有问题,但是考虑到您的输入,这些图很好。
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2021-03-30
相关资源
最近更新 更多