使用 Python 模拟实现星际太空旅行

使用 Python 模拟实现星际太空旅行使用 Python 模拟实现星际太空旅行 在过去的几十年里,霍曼转移一直是所有月球和星际太空旅行的首选方法。本文将使用 Python 模拟一个虚拟航天器从地球到火星的转移。

使用 Python 模拟实现星际太空旅行

使用 Python 模拟一个虚拟航天器从地球到火星的转移。

在过去的几十年里,霍曼转移一直是所有月球和星际太空旅行的首选方法。本文将使用 Python 模拟一个虚拟航天器从地球到火星的转移。

11.gif

本文将讨论一种星际太空旅行的方法,以及使用 Python 的模拟实现。

什么是霍曼转移轨道

霍曼转移轨道是航天器如何在两个轨道(例如地球和火星)之间使用最少的能量移动,也被认为是最有效的转移轨道。霍曼转移轨道涉及到将宇宙飞船加速到一个椭圆轨道上,它的近日点(霍曼轨道上最接近太阳的点)位于内行星,而远日点(霍曼轨道上离太阳最远的点)位于外行星的轨道上。

22.jpg

霍曼转移的一个相对较新的应用是火星科学实验室(MSL)前往火星的任务,该任务耗时约九个月。霍曼转移轨道的一个重要考虑因素是确定发射时间,使得航天器到达火星时,火星将处于该确切位置。

霍曼转移轨道的关键步骤包括计算航天器的轨道周期。在地球到火星的情况下,这需要大约 520 天。航天器要走一半的轨道,所以一次旅行将是大约 260 天。利用航天器行驶的距离和火星的轨道周期(约 687 天),我们发现发射航天器的最佳时间是火星在其轨道上领先地球 44 度的时候,如上图所示。了解上述情况的一个极好方法是查看行星转移计算器,这是一个太阳系模拟器,可以计算行星、卫星和恒星之间的转移。

使用 Python 模拟实现

本节将介绍模拟霍曼转移的代码。首先,导入一些用于数值计算和绘图的基本库。

import numpy as np
import matplotlib as mpl
mpl.use(‘pdf’)
import matplotlib.pyplot as plt
from matplotlib import animation

下面的代码定义了火星在其轨道上应该领先的临界角,即 44 度。地球距离太阳平均为 1.5 亿公里,这个距离我们称之为 1 天文单位(AU),而火星距离太阳约为 1.52 AU。为了绘制地球和火星的轨道,我们使用 matplotlib 的 Circle() 函数,并分别赋予它们 1 和 1.52 的半径。

# 绘制地球和火星的轨道图
alpha = 44 # 度(应领先的角度)
Earth = plt.Circle((0,0), radius= 1.0,fill=False,color=’blue’)
Mars = plt.Circle((0,0), radius= 1.52,fill=False,color=’brown’)

移动部件,即蓝色的地球、棕色的火星和红色的航天器,是通过以下方式定义的:

# 移动地球、火星和航天器
patch_E = plt.Circle((0.0, 0.0),radius=0.04,fill=True,color=’blue’)
patch_M = plt.Circle((0.0, 0.0),radius=0.03,fill=True,color=’brown’)
patch_H = plt.Circle((0.0, 0.0),radius=0.01,fill=True,color=’red’)

然后定义两个基本函数。第一个函数创建了动画的基础帧,即所有运动部件的初始位置,而该函数只需要一个参数,即帧数 ianimate 函数包括所有描述各种运动的必要轨道方程。要进一步了解这两个函数,可以考虑看看这个教程

def init():
 patch_E.center = (0.0,0.0)
 ax.add_patch(patch_E)
 patch_M.center = (0.0,0.0)
 ax.add_patch(patch_M)
 patch_H.center = (0.0,0.0)
 ax.add_patch(patch_H)
 return patch_E,patch_M,patch_H

def animate(i):
 # 地球
 x_E, y_E = patch_E.center
 x_E = np.cos((2*np.pi/365.2)*i)
 y_E = np.sin((2*np.pi/365.2)*i)
 patch_E.center = (x_E, y_E)

# 火星
 x_M, y_M = patch_M.center
 x_M = 1.52*np.cos((2*np.pi/686.98)*i+(np.pi*alpha/180.))
 y_M = 1.52*np.sin((2*np.pi/686.98)*i+(np.pi*alpha/180.))
 patch_M.center = (x_M,y_M)

# 航天器
 Period = 516.0
 x_H = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period)*i))*np.cos((2*np.pi/Period)*i)
 y_H = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period)*i))*np.sin((2*np.pi/Period)*i)
 patch_H.center = (x_H,y_H)
 return patch_E,patch_M,patch_H

为了创建动画,需要使用 Writer() 函数设置影片文件格式,它能够控制每秒的帧数(fps)和比特率。在下面的代码中,我们还设置了绘图布局,即字体和标签大小。为了更好地引导视线,我们沿着航天器的路径绘标记了灰色的记号。

# 设置影片的文件格式
# plt.rcParams[‘savefig.bbox’] = ‘tight’ # 严重乱码的视频!!!
Writer = animation.writers[‘ffmpeg’]
writer = Writer(fps=60, metadata=dict(artist=’Me’), bitrate=1800)

plt.rc(‘font’, family=’serif’, serif=’Times’)
plt.rc(‘text’, usetex=True)
plt.rc(‘xtick’, labelsize=8)
plt.rc(‘ytick’, labelsize=8)
plt.rc(‘axes’, labelsize=8)

# 设置路径,引导视线
Period = 516.
x_H_B = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*75)))*np.cos((2*np.pi/Period*75))
y_H_B = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*75)))*np.sin((2*np.pi/Period*75))
x_H_C = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*150)))*np.cos((2*np.pi/Period*150))
y_H_C = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*150)))*np.sin((2*np.pi/Period*150))
x_H_D = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*200)))*np.cos((2*np.pi/Period*200))
y_H_D = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*200)))*np.sin((2*np.pi/Period*200))
x_H_M = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*250)))*np.cos((2*np.pi/Period*250))
y_H_M = 1.26*(1.0.21**2)/(1. + 0.21*np.cos((2*np.pi/Period*250)))*np.sin((2*np.pi/Period*250))

最后,使用下面的代码把完整动画放在一起。这段代码的主要内容是设置图表、各种坐标轴和前面定义的星球。关键的几行是调用 animation.FuncAnimation(),以及保存动画。

fig, ax = plt.subplots(figsize=(10,8))
# fig.subplots_adjust(left=.15, bottom=.16, right=.99, top=.97)

ax.plot(0,0,color=’orange’,marker=’o’,linestyle=’’,markersize=16,markerfacecolor=’yellow’,label=’Sun’)
ax.plot([],[],color=’blue’,linestyle=’’,marker=’o’,label=’Earth’)
ax.plot([],[],color=’brown’,linestyle=’’,marker=’o’,label=’Mars’)
ax.plot([],[],color=’red’,linestyle=’’,marker=’o’,label=’spacecraft’)
ax.plot(x_H_B,y_H_B,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’,linestyle=’’,label=’path’)
ax.plot(x_H_C,y_H_C,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’)
ax.plot(x_H_D,y_H_D,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’)
ax.plot(x_H_M,y_H_M,color=’dimgray’,marker =’p’,markerfacecolor=’dimgray’)
ax.add_patch(Earth)
ax.add_patch(Mars)
ax.set_xlabel(‘X [AU]’,fontsize=12)
ax.set_ylabel(‘Y [AU]’,fontsize=12)
ax.legend(loc=’best’,fontsize=12)
anim = animation.FuncAnimation(fig, animate,init_func=init,frames=260,interval=40,blit=True)
plt.axis(‘scaled’) # 实时缩放绘图
plt.savefig(‘Hohmann.pdf’)
anim.save(‘Hohmann.mp4’, writer=writer)
plt.show()

假如发射偏离 10 度会怎样

33.gif

正如预期的那样,将发射角度从 44 度改为 54 度,导致航天器与火星的拦截点偏差相当大。


以上就是本文全部内容,我希望你觉得它很有趣!如果你也在 Python 中创建了任何很酷的动画,欢迎与我分享。

谢谢您的阅读!

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

今天的文章使用 Python 模拟实现星际太空旅行分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/21192.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注