三体运动python模拟(代码能直接运行)

  • 原理说明
  • 程序代码(可直接运行)
  • 代码结果示例

原理说明

很高兴撰写CSDN首篇文章!写了一个简单的程序对三体运动进行了模拟以验证其运动的复杂性、难以预测性,基本原理如下。假设对第 i i i个天体,其在时刻 t t t的位置矢量为 r ⃗ i , t \vec{r}_{i,t} r i,t​、速度为 v ⃗ i , t \vec{v}_{i,t} v i,t​,按照基本的物理学规律可得如下关系:
a ⃗ i , t = ∑ j ≠ i G m i m j ∣ r ⃗ j , t − r ⃗ i , t ∣ 3 ( r ⃗ j , t − r ⃗ i , t ) r ⃗ i , t + 1 = r ⃗ i , t + v ⃗ i , t Δ t + 1 2 a ⃗ i , t Δ t 2 v ⃗ i , t + 1 = v ⃗ i , t + a ⃗ i , t Δ t \vec{a}_{i,t}=\sum_{j\ne i}{\frac{Gm_im_j}{\left| \vec{r}_{j,t}-\vec{r}_{i,t} \right|^3}}\left( \vec{r}_{j,t}-\vec{r}_{i,t} \right) \\ \vec{r}_{i,t+1}=\vec{r}_{i,t}+\vec{v}_{i,t}\varDelta t+\frac{1}{2}\vec{a}_{i,t}\varDelta t^2 \\ \vec{v}_{i,t+1}=\vec{v}_{i,t}+\vec{a}_{i,t}\varDelta t a i,t​=j=i∑​∣r j,t​−r i,t​∣3Gmi​mj​​(r j,t​−r i,t​)r i,t+1​=r i,t​+v i,t​Δt+21​a i,t​Δt2v i,t+1​=v i,t​+a i,t​Δt
由此便可进行一步步地迭代计算。

程序代码(可直接运行)

import numpy as np
import matplotlib.pyplot as plt
import mathclass Body:def __init__(self, weight, pos0, v0):self.m = weightself.pos = pos0self.v = v0def update(self, others, delta_t):# 更新当前天体的位置# others存储前一时刻所有body的pos和m,list类型ft = np.array([0, 0, 0])for bodyi in others:# 各个引力的单位向量ft_dir = (bodyi.pos - self.pos) / np.linalg.norm(bodyi.pos - self.pos)# 设置引力常数为1ft = ft + (bodyi.m * self.m / sum(np.square(bodyi.pos - self.pos))) * ft_dirat = ft / self.m# 位置更新,delta_r = v*delta_t + 0.5*a*(delta_t**2)self.pos = self.pos + self.v * delta_t + 0.5 * at * (delta_t ** 2)# 速度更新,delta_v = a*delta_tself.v = self.v + at * delta_tdef show(self, ax):# 展示当前天体,根据质量大小设置marker尺寸ax.scatter(self.pos[0], self.pos[1], self.pos[2], s=(self.m**0.5)**0.5*8,label='Position:(%.2f, %.2f, %.2f)' % (self.pos[0], self.pos[1], self.pos[2]))plt.legend()if __name__ == '__main__':# 设置初始参数,下面这个初始参数比较好body1 = Body(1000*math.sqrt(3),np.array([10, 0, 0]),np.array([10*math.cos(0.5*math.pi), 10*math.sin(0.5*math.pi), 15]))body2 = Body(1000*math.sqrt(3),np.array([10*math.cos(2/3*math.pi), 10*math.sin(2/3*math.pi), 0]),np.array([10*math.cos(0.5*math.pi+2/3*math.pi), 10*math.sin(0.5*math.pi+2/3*math.pi), -10]))body3 = Body(3000*math.sqrt(3),np.array([10*math.cos(4/3*math.pi), 10*math.sin(4/3*math.pi), 0]),np.array([10*math.cos(0.5*math.pi+4/3*math.pi), 10*math.sin(0.5*math.pi+4/3*math.pi), 5]))delta_t = 0.2  # 模拟时间步长all_t = 100  # 模拟总时间ax = plt.subplot(projection='3d')plt.ion()t = 0scale_show = 80  # 设置显示范围while t <= all_t:plt.cla()ax.set_title('3 Body, t = %.2fs' % t)ax.set_xlim(-scale_show, scale_show)ax.set_ylim(-scale_show, scale_show)ax.set_zlim(-scale_show, scale_show)ax.set_xlabel('X')  # 设置x坐标轴ax.set_ylabel('Y')  # 设置y坐标轴ax.set_zlabel('Z')  # 设置z坐标轴body_copy = [body1, body2, body3]body1.update([body_copy[1], body_copy[2]], delta_t)body1.show(ax)body2.update([body_copy[0], body_copy[2]], delta_t)body2.show(ax)body3.update([body_copy[0], body_copy[1]], delta_t)body3.show(ax)ax.plot([body1.pos[0], body2.pos[0]], [body1.pos[1], body2.pos[1]], [body1.pos[2], body2.pos[2]], 'r-')ax.plot([body2.pos[0], body3.pos[0]], [body2.pos[1], body3.pos[1]], [body2.pos[2], body3.pos[2]], 'r-')ax.plot([body3.pos[0], body1.pos[0]], [body3.pos[1], body1.pos[1]], [body3.pos[2], body1.pos[2]], 'r-')plt.pause(0.000001)plt.show()t = t + delta_t

代码结果示例

截取若干中间结果如下图所示。

三体运动python模拟(代码能直接运行)相关推荐

  1. matlab模拟三体运动_Matlab模拟三体运动

    m1=1.5e30;%1号星的质量-红 m2=3.01e30;%2号星的质量-蓝 m3=3.5e30;%3号星的质量-绿 h1=animatedline('MaximumNumPoints',2000 ...

  2. python打完代码怎么运行-Python的代码是如何去进行运行的?

    近年来,Python语言迅速崛起,其简洁.免费.易学习.兼容性好等特点以及其面向对象.函数式编程.过程编程.面向方面编程,受到众人的喜爱.与其他编程程序的语言基本相同,Python也是需要在相应的程序 ...

  3. python模拟“三体运动”轨迹

    python讨论qq群:996113038 导语: 相信有很多朋友看过<三体>这部科幻小说.里面谈到过三体问题,这是一个不可预测的混沌系统.三体文明就是在这种逆境中发展,也就是因为三体问题 ...

  4. matlab模拟三体运动_如何写出三体的MATLAB程序-代码篇

    如何写出三体的MATLAB程序-代码篇 写在前面 在上文当中我们已经对三个物体之间的受力进行了分析,也说明了在时间 下的加速度.速度和位移的计算方式. 本篇中将根据上一篇的公式来写出对应的代码,并且详 ...

  5. matlab模拟三体运动_如何写出三体的MATLAB程序-理论分析篇

    如何写出三体的MATLAB程序-理论分析篇 写在前面 之所以写这个程序,是因为某天晚上无聊,室友正在学习MATLAB,于是提议写一个三体运动的物理模拟程序来练练手.就此,我也写一份该程序来为室友做一个 ...

  6. github的python代码怎么跑_如何利用Python模拟GitHub登录详解

    前言 最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fiddler抓包分析 首先,我们想要 ...

  7. Python模拟登陆,解密js代码实例:知乎登陆

    本文转载自公众号 | 日常学Python 作者 | sergiojune 如果你现在想模拟登陆知乎,会发现 fromdata 是一串加密的字符串 image 看了之后是不是很痛苦?你是不是就想使用 s ...

  8. 【运动学】基于matlab GUI三体运动模拟【含Matlab源码 871期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[运动学]基于matlab GUI三体运动模拟[含Matlab源码 871期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  9. 三体运动计算机模拟软件,三体运动模拟软件ThreeBody

    这是三体运动模拟软件ThreeBody,是一款三体运动模拟软件. 软件介绍 三体运动模拟软件ThreeBody,可以看三体运动,程序启动后,会出现三个随机大小的球体在运动. 使用说明 1.打开已有的一 ...

最新文章

  1. 漫漫运维路——集群基础知识
  2. 闭包函数python_Python--函数对象闭包函数
  3. MySQL基础教程之IN的用法详解
  4. linux java程序控制台日志输出
  5. ModuleNotFoundError: No module named '_ctypes' ERROR:Command errored out with exit status 1: python
  6. lombok在IntelliJ IDEA下的使用
  7. 生成javaDoc文档MyEclipse 0914
  8. 13位数字转日期 oracle_12amp;13. 整数转罗马数字 - 中等amp;简单
  9. Java序列化中的SerialVersionUid
  10. 拓端tecdat|R语言深度学习探索德国数据科学就业市场
  11. python清屏命令-python清屏命令
  12. java实现随机抽取题目_随机抽取样本问题蓄水池算法按权重抽取问题
  13. 【转】微信小程序测试方法和心得
  14. 个人邮箱怎么在微信里登陆?
  15. 人工智能真的具有创造力?
  16. QTableWidget获取一行数据
  17. pytorch实现LeNet5手写数字识别+各层特征图可视化
  18. 【pygame小游戏】摸鱼系列:”躲避粒子“小游戏在线玩,看谁才是”最强王者“?
  19. 说说你对keep-alive的理解是什么?
  20. 解决win7(64位)Office(32位)安装64位Access驱动的方法

热门文章

  1. ps之制作电影海报灵感网站
  2. 请简述HTML和XHTML最重要的4点不同?
  3. 语音播报功能的几种实现办法(包含TTS)
  4. 消除游戏(力扣 390)Java
  5. “s.t.”是个啥意思
  6. 三分钟读完《人人都是产品经理》
  7. STM32_HAL库_常用函数库
  8. 最新QT从入门到实战完整版(07 对象树)
  9. 从零到一,臻于至善|网易邮箱基于StarRocks 开发大数据平台的实践
  10. 通用mapper常用查询方法测试