三体模拟器(python)

原文来自本人博客:三体模拟器(python)

vpython

vpython库是一个能做3D动画的第三方库,安装起来很容易,利用anacanda或者pycharm都能简单安装

导入vpython

from vpython import *

设置画布参数

scene.forward = vector(0, -0.5, 1) # 视角角度
scene.width = 1280                 # 宽
scene.height = 720                 # 高
scene.background = color.white     # 背景颜色

定义物理参数

G = 6.672e-11  # 万有引力常数
# 某个物体的参数
body1 = sphere(pos=vector(2e11, 0, 2e11), radius=2e10, color=color.red,
               make_trail=True, interval=10, retain=50) # 位置、半径、颜色。。。
body1.mass = 4.001e30  # 质量
body1.p = vector(0, 2e4, 0) * body1.mass  # 动量

物理帧间隔

这里利用微元思想,设置一个物理帧间隔参数,并假定在这一小段时间内,力的作用效果不变

dt = 1e4  # 物理帧间隔

动量定理

利用动量定理,得到天体位置的变化

body1.p = body1.p + F1 * dt - F3 * dt  # 动量定理
body2.p = body2.p - F1 * dt - F2 * dt
body3.p = body3.p + F2 * dt + F3 * dt

body1.pos = body1.pos + (body1.p / body1.mass) * dt
body2.pos = body2.pos + (body2.p / body2.mass) * dt
body3.pos = body3.pos + (body3.p / body3.mass) * dt

完整代码示例

from vpython import *

scene.forward = vector(0, -0.5, 1)
scene.width = 1280
scene.height = 720
scene.background = color.white

G = 6.672e-11  # 万有引力常数

body1 = sphere(pos=vector(2e11, 0, 2e11), radius=2e10, color=color.red,
               make_trail=True, interval=10, retain=50)
body1.mass = 4.001e30  # 质量
body1.p = vector(0, 2e4, 0) * body1.mass  # 动量

body2 = sphere(pos=vector(-1.3e11, (3 ** 0.5) * 1e11, 0), radius=1e10, color=color.blue,
               make_trail=True, interval=10, retain=50)
body2.mass = 2e30
body2.p = vector(-(3 ** 0.5) * 1e4, -1e4, -0.4e4) * body2.mass

body3 = sphere(pos=vector(-1e11, 3e11, -1e11), radius=3e10, color=color.yellow,
               make_trail=True, interval=10, retain=50)
body3.mass = 6e30
body3.p = -body1.p - body2.p  # 保证整体动量为0,防止球飞到屏外

dt = 1e4  # 物理帧间隔

while True:
    rate(1000)

    r1 = body2.pos - body1.pos
    F1 = G * body1.mass * body2.mass * r1.hat / mag2(r1)  # 万有引力定律

    r2 = body2.pos - body3.pos
    F2 = G * body2.mass * body3.mass * r2.hat / mag2(r2)

    r3 = body1.pos - body3.pos
    F3 = G * body1.mass * body3.mass * r3.hat / mag2(r3)

    body1.p = body1.p + F1 * dt - F3 * dt  # 动量定理
    body2.p = body2.p - F1 * dt - F2 * dt
    body3.p = body3.p + F2 * dt + F3 * dt

    body1.pos = body1.pos + (body1.p / body1.mass) * dt
    body2.pos = body2.pos + (body2.p / body2.mass) * dt
    body3.pos = body3.pos + (body3.p / body3.mass) * dt

img

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、打开已有的一组三体配置文件(.tbc)并运行(点击播放按钮)。 "File"菜单下有导入(Import)、导出(Export)功能,在不能上传附件时方便以纯文本方式交流自己搜索出来的三体配置! 2、手工设定初始条件的全部数值(点击魔术棍按钮)。分别指定三个物体的初始条件(X、Y、Z坐标,质量,初始速度的幅度、在XY平面上的角度0~360、在XZ平面上的角度0~360)。四个圆形选项(Radio Button)是参照系选择:默认的"Normalize to Centroid"是按三体系统质心作为参照系进行速度平衡,相当于观察者总是跟随三体的质心运动。另外三个选项分别是以第一、二、三个天体作为参照系,即总是把这个天体放在中心位置从不移动--注意这是非惯性参照系!(一般应选取行星主要围绕的那个恒星,方便观察行星轨道) 如果XZ平面上的初始速度角度都是0,则退化为二维的三体。 不过手工设定的条件通常都很难稳定运行。 3、设定搜索条件,让软件自动搜索。搜索分为两步: 3.1、搜索稳定的三体解(点击望远镜按钮) 第一部分是每个物体的约束条件:坐标最大值、最小质量、最大质量、最小速度幅度、最大速度幅度。 第二部分是是否要求三体在最初N步里超出一个边长为M的方框范围。这样看起来比较有趣,但搜索起来可能很慢。 第三部分是三体必须在N步里不超出一个边长为M的方框范围。否则它们很快发散就不好玩了。 然后那个复选框是:是否只进行二维搜索。 搜索结束后会出现一组初始条件值,点OK就开始运行了。 3.2、在三体解的基础上,搜索稳定的行星解(点击右下有小球的望远镜按钮) 手工设定或者自动搜索出来的解,如果喜欢的话,可以存盘,也可以导出为纯文本贴在论坛上与大家共享。压缩包里的.tbc也是偶自己用这个软件搜出来的。 四个播放按钮: 第一个播放形状的,是开始或者继续运行; 第二个暂停形状的,是暂停; 第三个短箭头,是减速运行; 第三个双箭头,是加速运行。 速度有很多档次,从减速6倍到加速运行100倍,直到加速100倍跳3125帧(相当于加倍312500倍,但每隔3125帧才显示一帧,所以看起来很不连续),每5倍为一个档次。
三体运动是指三个物体之间的相互作用和运动,可以使用Python进行模拟。其中,可以使用scipy库中的odeint函数求解微分方程组,来模拟三体运动。 以下是一个简单的三体运动模拟代码示例: ```python import numpy as np from scipy.integrate import odeint # 定义微分方程组 def three_body_equations(w, t, G, m1, m2, m3): x1, y1, vx1, vy1, x2, y2, vx2, vy2, x3, y3, vx3, vy3 = w r12 = np.sqrt((x2 - x1)**2 + (y2 - y1)**2) r13 = np.sqrt((x3 - x1)**2 + (y3 - y1)**2) r23 = np.sqrt((x3 - x2)**2 + (y3 - y2)**2) dx1dt = vx1 dy1dt = vy1 dvx1dt = G * m2 * (x2 - x1) / r12**3 + G * m3 * (x3 - x1) / r13**3 dvy1dt = G * m2 * (y2 - y1) / r12**3 + G * m3 * (y3 - y1) / r13**3 dx2dt = vx2 dy2dt = vy2 dvx2dt = G * m1 * (x1 - x2) / r12**3 + G * m3 * (x3 - x2) / r23**3 dvy2dt = G * m1 * (y1 - y2) / r12**3 + G * m3 * (y3 - y2) / r23**3 dx3dt = vx3 dy3dt = vy3 dvx3dt = G * m1 * (x1 - x3) / r13**3 + G * m2 * (x2 - x3) / r23**3 dvy3dt = G * m1 * (y1 - y3) / r13**3 + G * m2 * (y2 - y3) / r23**3 return dx1dt, dy1dt, dvx1dt, dvy1dt, dx2dt, dy2dt, dvx2dt, dvy2dt, dx3dt, dy3dt, dvx3dt, dvy3dt # 定义初始状态和参数 w0 = [1, 0, 0, 6, -1, 0, 0, -6, 0, 0, 0, 0] t = np.linspace(0, 10, 1000) G = 1 m1 = 1 m2 = 1 m3 = 1 # 求解微分方程组 wsol = odeint(three_body_equations, w0, t, args=(G, m1, m2, m3)) # 绘制轨迹图 import matplotlib.pyplot as plt plt.plot(wsol[:,0], wsol[:,1], label='Body 1') plt.plot(wsol[:,4], wsol[:,5], label='Body 2') plt.plot(wsol[:,8], wsol[:,9], label='Body 3') plt.legend() plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clerk.Max(well)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值