用python模拟地球飞越火星

简介: 当一个飞行器飞过一个行星时,如果距离较近,就会受到行星的引力影响:靠近时会逐渐加速,远离时会逐渐减速。由于能量守恒,飞行器在进入和离开行星轨道时,与行星的相对速度大小没有变化

本文涉及影片内容,但算不上剧透。想看还未看的同学请谨慎阅读。


春节档的几部电影里,《流浪地球》成为一匹黑马,刷爆微博和朋友圈,从最初不高的排片率,一跃上升到票房榜首。


看过影片的人可能会有一个疑问,太阳系那么空旷,为什么地球在“流浪”的过程中,非要作死往木星上靠?


这就牵涉到一个时常在影视作品中拿来做文章,实际在太空探测中很常见的一个概念:


引力弹弓效应


当一个飞行器飞过一个行星时,如果距离较近,就会受到行星的引力影响:靠近时会逐渐加速,远离时会逐渐减速。由于能量守恒,飞行器在进入和离开行星轨道时,与行星的相对速度大小没有变化,但方向却发生了变化。再加上行星本身的速度,从旁观者角度来看,飞行器的速度就发生了变化。举个更通俗的例子:你把一个网球以速度 v 砸向一面墙,球会以同样的速度 v 反弹回来;而如果你以速度 v 砸向一个以速度 u 迎面开来卡车头上,网球则会以 v + 2u 的速度反弹回来(相对速度 v + u 加上卡车速度 u



利用这个办法,可以在不额外消耗燃料的情况下,使太空探测器得到加速或者减速,取决于与行星接触的角度)。这看起来似乎不符合能量守恒定律和动量守恒定律,实则是因为行星的质量相较飞行器来说太大了,其速度的变化可以忽略不计。


目前离地球最远人造物体:旅行者1号,当年就连续利用了木星土星进行了加速。


640.gif


而在影片中,也就是为了获取更大的速度以脱离太阳系,人类才选择借助木星的引力弹弓效应


出于好奇,我用 python 写了一个简化的仿真,模拟地球飞越木星时可能发生的情况:


利用引力弹弓加速

640.gif


速度太快或距离太远,加速效果不明显


速度太慢或距离太近,坠入木星


利用引力弹弓减速


通过几次测试,我发现这“弹弓”可不是那么好用的,离得远了没啥效果,离得太近又可能被引力捕获,撞在木星上(事实在撞上之前,地球就会因达到洛希极限而被撕裂)。


至于剧中发生了什么,我这里也就不多说了。


我这个模拟代码中,为了视觉效果,地球和木星的大小,以及他们的相对距离是不成比例的,否则会更小。而且为了让速度变化更明显,对运行速度也做了放大。所以从绝对数值上来说是不准确的,但相对变化都是通过基本物理定律计算得出的


核心部分代码:


# 地木坐标差
delta_x = (jupiter[0] - earth[0]) * k
delta_y = (jupiter[1] - earth[1]) * k
# 地木距离平方
r2 = delta_x ** 2 + delta_y ** 2
# 地木间引力,万有引力定律
F = G * m * M / r2
# 地木夹角
theta = math.acos(delta_x / r2 ** 0.5)
# x、y 轴引力分量
fx = abs(F * math.cos(theta)) * sign(delta_x)
fy = abs(F * math.sin(theta)) * sign(delta_y)
# x、y 轴加速度,牛顿第二定律 F = ma
ax = fx / m
ay = fy / m
# 速度变化,vt = v0 + at
vel_x += ax * t
vel_y += ay * t
# 位移变化,st = s0 + vt
pos_x += vel_x * t / k
pos_y += vel_y * t / k


相关参数:


k = 1e7            # 距离缩放参数
m = 5.9742e24      # 地球质量
M = 1898.7e27      # 木星质量
G = 6.67259e-17    # 万有引力常量
t = 1e5            # 时间缩放参数
pos_x= 0           # 地球坐标
pos_y= 550earth = pos_x, pos_y
vel_x= 300         # 地球速度
vel_y= 0jupiter = 700, 150 # 木星坐标
v_j = 3            # 木星速度


想要测试不同效果,可以调整坐标、速度等参数。


“引力弹弓”的概念在几年前的《星际穿越》和《火星救援》中都有提及,我一直想写个模拟,直到这次趁《流浪地球》热映的机会才动手实现。这部电影我从去年7月尚未跳票之时比较期待,也看过原著,本来还担心会不会排片太少,没想到会火成这样。这里面当然有很多偶然的商业因素,影片本身也有很多不足,但我作为一个“科学爱好者”,乐见如此。之前流产的《三体》电影版或许也因此有机会重新投胎。


希望以后会有更多精彩的科幻作品出现,也希望更多的人在低头忙碌之余能抬头仰望星空。



其他内容回复左侧关键词获取:

python :零基础入门课程目录

新手 :初学者指南及常见问题

资源 :超过500M学习资料网盘地址

项目 :十多个进阶项目代码实例

如需了解视频课程及答疑群等更多服务,请号内回复 码上行动

代码相关问题可以在论坛上发帖提问 bbs.crossincode.com

推荐阅读:

Python转行 | 爬抖音 | AI名画 | 如何debug | 查天气 | 我用Python | 知乎 | 电影票 | 单词表 | 新手建议 | 如何提问 | 一图学Python | 智能防挡弹幕 | 红包提醒

相关文章
|
10月前
|
算法 Python
Python OJ题典例:【信息奥赛一本通】地球人口承载力估计-T1005
本文介绍了地球人口承载力估计的问题,通过给定的资源量和年限,计算了地球最多能够养活的人口数量。是一道典型的算法例题。
472 0
|
10月前
|
Python
Python:计算机等级考试真题之八十天环游地球代码
Python:计算机等级考试真题之八十天环游地球代码
284 0
|
存储 IDE 关系型数据库
你用Python 3了吗?这个飞向火星的语言已经30岁了!
Python30岁了!「没想到Python这么流行!」
164 0
你用Python 3了吗?这个飞向火星的语言已经30岁了!
|
7天前
|
存储 人工智能 数据处理
Python:编程的艺术与科学的完美交融
Python:编程的艺术与科学的完美交融
13 1
|
3天前
|
测试技术 调度 索引
python编程中常见的问题
【4月更文挑战第23天】
13 2
|
3天前
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver
|
3天前
|
机器学习/深度学习 数据挖掘 算法框架/工具
Python:编程的艺术与魅力
Python:编程的艺术与魅力
14 3
|
3天前
|
机器学习/深度学习 数据可视化 数据挖掘
实用技巧:提高 Python 编程效率的五个方法
本文介绍了五个提高 Python 编程效率的实用技巧,包括使用虚拟环境管理依赖、掌握列表推导式、使用生成器提升性能、利用装饰器简化代码结构以及使用 Jupyter Notebook 进行交互式开发。通过掌握这些技巧,可以让你的 Python 编程更加高效。
|
4天前
|
算法 Python
Python面向对象oop编程(二)
Python面向对象oop编程(二)