三体运动python模拟(代码能直接运行)
三体运动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∣3Gmimj(r j,t−r i,t)r i,t+1=r i,t+v i,tΔt+21a 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模拟(代码能直接运行)相关推荐
- matlab模拟三体运动_Matlab模拟三体运动
m1=1.5e30;%1号星的质量-红 m2=3.01e30;%2号星的质量-蓝 m3=3.5e30;%3号星的质量-绿 h1=animatedline('MaximumNumPoints',2000 ...
- python打完代码怎么运行-Python的代码是如何去进行运行的?
近年来,Python语言迅速崛起,其简洁.免费.易学习.兼容性好等特点以及其面向对象.函数式编程.过程编程.面向方面编程,受到众人的喜爱.与其他编程程序的语言基本相同,Python也是需要在相应的程序 ...
- python模拟“三体运动”轨迹
python讨论qq群:996113038 导语: 相信有很多朋友看过<三体>这部科幻小说.里面谈到过三体问题,这是一个不可预测的混沌系统.三体文明就是在这种逆境中发展,也就是因为三体问题 ...
- matlab模拟三体运动_如何写出三体的MATLAB程序-代码篇
如何写出三体的MATLAB程序-代码篇 写在前面 在上文当中我们已经对三个物体之间的受力进行了分析,也说明了在时间 下的加速度.速度和位移的计算方式. 本篇中将根据上一篇的公式来写出对应的代码,并且详 ...
- matlab模拟三体运动_如何写出三体的MATLAB程序-理论分析篇
如何写出三体的MATLAB程序-理论分析篇 写在前面 之所以写这个程序,是因为某天晚上无聊,室友正在学习MATLAB,于是提议写一个三体运动的物理模拟程序来练练手.就此,我也写一份该程序来为室友做一个 ...
- github的python代码怎么跑_如何利用Python模拟GitHub登录详解
前言 最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fiddler抓包分析 首先,我们想要 ...
- Python模拟登陆,解密js代码实例:知乎登陆
本文转载自公众号 | 日常学Python 作者 | sergiojune 如果你现在想模拟登陆知乎,会发现 fromdata 是一串加密的字符串 image 看了之后是不是很痛苦?你是不是就想使用 s ...
- 【运动学】基于matlab GUI三体运动模拟【含Matlab源码 871期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[运动学]基于matlab GUI三体运动模拟[含Matlab源码 871期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...
- 三体运动计算机模拟软件,三体运动模拟软件ThreeBody
这是三体运动模拟软件ThreeBody,是一款三体运动模拟软件. 软件介绍 三体运动模拟软件ThreeBody,可以看三体运动,程序启动后,会出现三个随机大小的球体在运动. 使用说明 1.打开已有的一 ...
最新文章
- 漫漫运维路——集群基础知识
- 闭包函数python_Python--函数对象闭包函数
- MySQL基础教程之IN的用法详解
- linux java程序控制台日志输出
- ModuleNotFoundError: No module named '_ctypes' ERROR:Command errored out with exit status 1: python
- lombok在IntelliJ IDEA下的使用
- 生成javaDoc文档MyEclipse 0914
- 13位数字转日期 oracle_12amp;13. 整数转罗马数字 - 中等amp;简单
- Java序列化中的SerialVersionUid
- 拓端tecdat|R语言深度学习探索德国数据科学就业市场
- python清屏命令-python清屏命令
- java实现随机抽取题目_随机抽取样本问题蓄水池算法按权重抽取问题
- 【转】微信小程序测试方法和心得
- 个人邮箱怎么在微信里登陆?
- 人工智能真的具有创造力?
- QTableWidget获取一行数据
- pytorch实现LeNet5手写数字识别+各层特征图可视化
- 【pygame小游戏】摸鱼系列:”躲避粒子“小游戏在线玩,看谁才是”最强王者“?
- 说说你对keep-alive的理解是什么?
- 解决win7(64位)Office(32位)安装64位Access驱动的方法