vpython数值模拟系列(3. 相互绕转的双星)

         笔者学习VPython的时候曾遇到了不少困难,所以在此撰写系列教程与案例,希望能对学习VPython提供相关借鉴。如有任何错误或疑问,欢迎评论指出!

        本案例将实现相互绕转的双星,以下为详细教程:

1.初始准备

导入VPython库,设置模拟的画布,为了更好观察双星的绕转,这里稍微更改了摄像机的视角。

from vpython import *
display = canvas(width=500, height=500)
display.forward = vector(0,-.3,-1)

2.双星的构建与材质

这里双星的构建我们使用VPython中的sphere对象,我们将质量重的天体称为大星bigstar,将质量轻的天体称为小星smallstar。为使可视化更逼真,可以为天体添加材质,我们可以从以下网址:Solar Textures | Solar System Scope,下载相应的材质图片,并保存到相应路径之下(关于路径,不明白的可以自行查阅相关资料)

545ef9245db64a8c93b5ed708ae72171.png

7823e3257ab1495d9abf0e17f8f282de.png

下面代码设置了双星的材质,材质所采用的图片为太阳的表面图,然后定义了双星的位置和半径,并且使双星留下运动的轨迹,其中大星的轨迹类型为“points”,轨迹的间隔为10,停留时间为50,并通过emissive=True使双星自发光(为区分双星,在导入表面纹理材质图片之前,对图片的色彩进行了处理)。

bigstar= sphere(texture="images/bigstar.jpg", pos=vector(-1e11,0,0), radius=2e10,
                make_trail=True, trail_type='points', interval=10, retain=50, emissive=True)
smallstar = sphere(texture="images/smallstar.jpg", pos=vector(1.5e11,0,0), radius=1e10,
                make_trail=True, interval=10, retain=50, emissive=True)

3.双星的质量与动量

一个物体由于具有质量和速度而具有动量,并由以下公式定义了动量,

eq?%5Cvec%20p%20%3D%20m%20%5Cvec%20v

假设该系统仅受到彼此间的万有引力的作用,则系统总动量守恒。大星,小星的质量以及大星的初始速度均由人为设定。由动量守恒,可求得小星的动量,

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

bigstar.mass = 2e30
bigstar.p = vector(0, 0, -1e4) * bigstar.mass

smallstar.mass = 1e30
smallstar.p = -bigstar.p

4.更新双星的运动

万有引力定律可以写成如下表达式,eq?%5Chat%20r为r方向的单位向量

\vec F = \displaystyle{\frac{Gm_1 m_2}{r^2}\hat r}

由冲量定理可知,

eq?m%20%5Cvec%20v%20%3D%20%5Cvec%20F%20t

由此则可编写代码,在while循环中不断更新双星的位置与动量。

dt = 1e5
while True:
    rate(200)
    r = smallstar.pos - bigstar.pos
    F = G * bigstar.mass * smallstar.mass * r.hat / mag(r)**2
    bigstar.p = bigstar.p + F*dt
    smallstar.p = smallstar.p - F*dt
    bigstar.pos = bigstar.pos + (bigstar.p/bigstar.mass) * dt
    smallstar.pos = smallstar.pos + (smallstar.p/smallstar.mass) * dt

运行效果图如下所示:

bcbda5b7a4a0439dab0bbd25e9427d2d.png

按照以上思路,即可实现相互绕转的双星的案例,以下为源代码:

from vpython import *
display = canvas(width=500, height=500)
display.forward = vector(0,-.3,-1)

bigstar= sphere(texture="images/bigstar.jpg", pos=vector(-1e11,0,0), radius=2e10,
                make_trail=True, interval=10, retain=50, emissive=True)
smallstar = sphere(texture="images/smallstar.jpg", pos=vector(1.5e11,0,0), radius=1e10,
                make_trail=True,  interval=10, retain=50, emissive=True)

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

bigstar.mass = 2e30
bigstar.p = vector(0, 0, -1e4) * bigstar.mass

smallstar.mass = 1e30
smallstar.p = -bigstar.p

dt = 1e5
while True:
    rate(200)
    r = smallstar.pos - bigstar.pos
    F = G * bigstar.mass * smallstar.mass * r.hat / mag(r)**2
    bigstar.p = bigstar.p + F*dt
    smallstar.p = smallstar.p - F*dt
    bigstar.pos = bigstar.pos + (bigstar.p/bigstar.mass) * dt
    smallstar.pos = smallstar.pos + (smallstar.p/smallstar.mass) * dt

参考文献
[1]. Morgan, Windsor A. and English, Lars Q., "VPython for Introductory Mechanics: Complete Version" (2019). VPython for Introductory Mechanics. 1.

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值