三体模拟器(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
    评论
三体运动是指三个物体之间的相互作用和运动,可以使用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、付费专栏及课程。

余额充值