笔者学习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,下载相应的材质图片,并保存到相应路径之下(关于路径,不明白的可以自行查阅相关资料)
下面代码设置了双星的材质,材质所采用的图片为太阳的表面图,然后定义了双星的位置和半径,并且使双星留下运动的轨迹,其中大星的轨迹类型为“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.双星的质量与动量
一个物体由于具有质量和速度而具有动量,并由以下公式定义了动量,
假设该系统仅受到彼此间的万有引力的作用,则系统总动量守恒。大星,小星的质量以及大星的初始速度均由人为设定。由动量守恒,可求得小星的动量,
G = 6.7e-11 # 万有引力常数
bigstar.mass = 2e30
bigstar.p = vector(0, 0, -1e4) * bigstar.mass
smallstar.mass = 1e30
smallstar.p = -bigstar.p
4.更新双星的运动
万有引力定律可以写成如下表达式,为r方向的单位向量
由冲量定理可知,
由此则可编写代码,在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
运行效果图如下所示:
按照以上思路,即可实现相互绕转的双星的案例,以下为源代码:
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.