如何用 Python 实现模拟木星的运行轨道、自转、公转

用 Python 来模拟木星的轨道运行、自转和公转是一个非常有趣且富有挑战性的项目。这需要结合天文学知识和编程技巧。

我们将使用 VPython 这个库来实现这个模拟。VPython 非常适合创建简单的 3D 物理场景和动画,它的语法直观,能够让我们快速地将物理概念转化为可视化的三维模型。

在开始之前,请确保您已经安装了 VPython。如果尚未安装,可以通过 pip 进行安装:

pip install vpython

模拟思路

  1. 建立三维场景:创建一个代表太阳系的 3D 画布。

  2. 创建天体:创建两个球体,一个代表太阳(作为中心天体),另一个代表木星。

  3. 定义物理参数:根据真实的天文数据,设置木星的质量、轨道半径(半长轴)、公转周期、自转周期和轨道倾角等。为了在视觉上获得好的效果,我们会对一些尺寸和距离进行缩放。

  4. 模拟公转(轨道运行)

    • 木星的轨道是椭圆,但为了简化模型,我们首先会使用一个近似的圆形轨道。

    • 我们将使用牛顿的万有引力定律 F=GfracMmr2 来计算太阳对木星的引力。

    • 在动画循环中,根据引力持续更新木星的速度和位置,从而使其围绕太阳运动。

  5. 模拟自转

    • 让代表木星的球体围绕自身的轴进行旋转。

    • 为了让自转效果更明显,我们会给木星贴上纹理,或者在其表面创建一个标记(比如模拟大红斑)。

  6. 动画循环:创建一个循环,在每个时间步长内更新木星的位置(公转)和姿态(自转),并刷新场景,从而形成动画

  • 如何运行代码

  1. 保存代码:将上面的代码保存为一个 Python 文件,例如 jupiter_simulation.py

  2. 运行脚本:打开您的终端或命令提示符,导航到保存文件的目录,然后执行以下命令:

    Bash

    python jupiter_simulation.py
    
  3. 交互:程序运行后,会弹出一个 3D 窗口。

    • 您会看到黄色的太阳和带有纹理的木星。

    • 木星会沿着青色的轨迹线围绕太阳公转

    • 同时,木星自身也会围绕其倾斜的轴进行自转

    • 您可以用鼠标右键拖动来缩放视角,用**鼠标中键(或按住Ctrl+左键)**来旋转视角。

  4. 物理模型:此模拟使用了简化的牛顿万有引力模型。在一个循环中,我们反复计算太阳对木星的引力,并根据该力更新木星的速度和位置。这种方法比简单地设定一个圆形轨道要更真实,能够模拟出自然的轨道运动。

  5. 单位缩放:真实宇宙的尺寸和质量差距极大。为了在屏幕上合理地展示,代码中的所有物理量(如质量、距离)都经过了精心缩放。

  6. dt (时间步长):这个值决定了模拟的精度和速度。dt 越小,轨道计算越精确,但动画会变慢。

  7. rate(500):这个函数控制了动画循环的执行频率,即每秒最多执行500次。您可以调整这个值来改变动画的整体速度。

  8. jupiter_rotation_speed:这个参数控制木星自转的快慢。您可以增大或减小它来让自转更明显或更慢。

  9. 纹理:为了方便您运行,代码中直接使用了一个在线的木星纹理图片URL。只要您的电脑能联网,就能正确显示木星的表面。

  10. 添加木星的四大伽利略卫星(木卫一、木卫二、木卫三、木卫四)。

  11. 为其他行星(如地球、火星)也创建模型,构建一个更完整的太阳系。

  12. 引入更精确的椭圆轨道参数(如离心率)来设置初始条件。

  • 完整代码

  1. # 导入 vpython 库,它包含了所有必要的3D图形和向量数学功能
    from vpython import *
    import math
    
    # 1. 创建画布和设置场景
    # 创建一个 800x600 像素的 3D 场景
    scene = canvas(title='木星轨道运行模拟 (Jupiter Orbit Simulation)',
                   width=800, height=600,
                   center=vector(0, 0, 0),
                   background=color.black)
    scene.autoscale = True
    
    # 2. 定义常量和物理参数
    # 为了便于可视化,我们使用的单位不是严格的 SI 单位,而是经过缩放的
    # G: 万有引力常数 (缩放后)
    G = 6.67e-5
    # 太阳质量 (缩放后)
    M_sun = 1.989e6
    # 木星质量 (缩放后)
    M_jupiter = 1.898e3
    # 木星轨道半长轴 (AU, 天文单位)
    # 1 AU = 1.5e8 km. 木星约为 5.2 AU。我们将 1 AU 缩放为 10 个单位
    jupiter_orbit_radius = 52
    # 木星的轨道周期约为11.86个地球年
    # 为了动画效果,我们需要根据引力计算出稳定的初始切线速度
    v_jupiter_orbit = math.sqrt(G * M_sun / jupiter_orbit_radius)
    
    # 时间步长 (dt),可以理解为模拟的精度。值越小越精确
    dt = 0.01
    
    # 3. 创建天体对象
    
    # 创建太阳
    # 我们让太阳发光,这样它就能照亮木星
    sun = sphere(pos=vector(0, 0, 0),
                 radius=5,  # 太阳的半径也被缩放了
                 color=color.yellow,
                 emissive=True) # emissive=True 使其自身发光
    # 添加光源,使场景光照效果更好
    sun_light = local_light(pos=vector(0,0,0), color=color.white)
    
    
    # 创建木星
    # 为了让自转更明显,我们使用 texture。
    # 请下载任何木星表面纹理图片,并将其命名为 'jupiter_texture.jpg'
    # 并与此 python 脚本放在同一目录下。
    # 如果找不到图片,它会显示为纯色球体。
    jupiter = sphere(pos=vector(jupiter_orbit_radius, 0, 0),
                     radius=2, # 木星半径也被缩放了
                     texture='https://i.imgur.com/tG3zH27.jpeg', # 使用在线的木星纹理
                     make_trail=True, # 显示运行轨迹
                     trail_type='curve',
                     trail_color=color.cyan,
                     interval=10, # 每隔10个动画步长画一个轨迹点
                     retain=500) # 保留500个轨迹点
    
    # 设置木星的初始速度和动量
    jupiter.velocity = vector(0, v_jupiter_orbit, 0)
    jupiter.momentum = M_jupiter * jupiter.velocity
    
    # 设置木星自转参数
    # 木星自转周期约为9.9小时,远快于公转。我们设置一个角速度来模拟。
    # 2 * pi / T_rotation, T_rotation 是我们设定的动画中的自转周期
    jupiter_rotation_speed = 2 * math.pi / 100 # 数值越大,自转越快
    # 木星的自转轴有大约3.1度的倾斜
    jupiter_axis = vector(math.sin(radians(3.1)), math.cos(radians(3.1)), 0)
    
    print("模拟开始...请在弹出的窗口中查看。")
    print("您可以用鼠标右键拖动来缩放视角,用中键来旋转视角。")
    
    # 4. 动画循环
    while True:
        # 控制动画速率,每秒最多执行500次循环
        rate(500)
    
        # --- 公转计算 (Revolution/Orbit Calculation) ---
        # 计算木星与太阳之间的距离向量
        r_vector = jupiter.pos - sun.pos
        r_mag = mag(r_vector) # 距离大小
        r_hat = norm(r_vector) # 距离的单位向量
    
        # 计算万有引力 (F = -G * M * m / r^2 * r_hat)
        # 方向是指向太阳的,所以是负号
        force = -G * M_sun * M_jupiter / (r_mag**2) * r_hat
    
        # 更新木星的动量 (p_new = p_old + F * dt)
        jupiter.momentum = jupiter.momentum + force * dt
    
        # 更新木星的位置 (pos_new = pos_old + (p_new/m) * dt)
        jupiter.pos = jupiter.pos + (jupiter.momentum / M_jupiter) * dt
    
        # --- 自转计算 (Rotation Calculation) ---
        # 木星围绕其倾斜的自转轴进行旋转
        jupiter.rotate(angle=jupiter_rotation_speed * dt,
                       axis=jupiter_axis,
                       origin=jupiter.pos)
    

你可能感兴趣的:(python,开发语言)