引言

大家好!今天我们将一起探索一个经典的天文学问题——开普勒行星运动定律,并通过 Python 进行验证。开普勒定律是描述行星围绕太阳运动的基本定律,它不仅改变了我们对宇宙的认识,还为后来的物理学发展奠定了基础。通过这篇文章,你将了解开普勒定律的基本原理,并学习如何用 Python 进行数值模拟和验证。

什么是开普勒行星运动定律?

开普勒行星运动定律是由德国天文学家约翰内斯·开普勒在 17 世纪提出的,主要包括三个定律:

  1. 行星轨道是椭圆形的,太阳位于椭圆的一个焦点上。

  2. 行星在围绕太阳运动时,连线与太阳的连线在相等的时间内扫过相等的面积,即“面积定律”。

  3. 行星的公转周期的平方与轨道半长轴的立方成正比,即“调和定律”。

开普勒定律通过对行星轨道的观测总结出了行星的运动规律。这些定律对于天体力学的发展起到了至关重要的作用,尤其是牛顿的万有引力定律就是建立在这些基础之上的。

如何用 Python 验证开普勒定律?

为了验证开普勒定律,我们可以通过数值模拟来分析行星的运动。我们将模拟一个行星绕太阳运动的过程,并检查行星轨道是否符合开普勒的三个定律。首先,我们从万有引力定律出发,通过数值方法求解行星的轨道。

万有引力与运动方程

根据牛顿的万有引力定律,行星受到太阳的引力作用,这个引力使得行星沿着椭圆轨道运动。万有引力公式为:

\[F = \frac{G M m}{r^2} \]

其中:

  • F 是引力
  • G 是万有引力常数
  • M 是太阳的质量
  • m 是行星的质量
  • r 是行星与太阳的距离

根据牛顿的第二定律,行星的加速度由以下方程给出:$$F = m \cdot a$$

结合这两个公式,我们可以得到行星的运动方程:

\[m \cdot \frac{d^2r}{dt^2} = - \frac{G M m}{r^2} \]

这个方程描述了行星的运动,我们将通过数值积分方法来求解这个方程,进而得到行星的轨道。

编写 Python 代码

下面是一个使用 Python 进行数值模拟的示例代码。我们将模拟一个行星围绕太阳的运动,并绘制出其轨道。

# coding=utf-8
import matplotlib

matplotlib.use('Agg')
import numpy as np
import matplotlib.pyplot as plt

# 常数定义
G = 6.67430e-11  # 万有引力常数 (单位: m^3 kg^-1 s^-2)
M = 1.989e30  # 太阳质量 (单位: kg)
m = 5.972e24  # 地球质量 (单位: kg)
AU = 1.496e11  # 天文单位 (单位: m)

# 初始条件:假设地球的初始位置和速度
r0 = np.array([AU, 0], dtype=np.float64)  # 使用 float64 类型
v0 = np.array([0, 29780], dtype=np.float64)  # 速度大约为 29.78 km/s(地球公转速度)

# 时间参数
T = 365 * 24 * 60 * 60  # 模拟一年的时间 (单位: 秒)
dt = 1000  # 时间步长 (单位: 秒)
steps = int(T / dt)  # 总步数


# 计算加速度函数
def compute_acceleration(r):
    r_mag = np.linalg.norm(r)
    force = -G * M * m / r_mag ** 2  # 计算万有引力
    return force * r / r_mag / m  # 加速度方向与位置相同,单位矢量化


# 四阶Runge-Kutta方法
def runge_kutta(r, v, dt, steps):
    positions = np.zeros((steps, 2))
    velocities = np.zeros((steps, 2))

    # 初始位置和速度
    for i in range(steps):
        positions[i] = r
        velocities[i] = v

        # 计算加速度
        acc = compute_acceleration(r)

        # 四阶Runge-Kutta积分
        k1_v = dt * acc
        k1_r = dt * v
        k2_v = dt * compute_acceleration(r + 0.5 * k1_r)
        k2_r = dt * (v + 0.5 * k1_v)
        k3_v = dt * compute_acceleration(r + 0.5 * k2_r)
        k3_r = dt * (v + 0.5 * k2_v)
        k4_v = dt * compute_acceleration(r + k3_r)
        k4_r = dt * (v + k3_v)

        # 更新位置和速度
        r += (k1_r + 2 * k2_r + 2 * k3_r + k4_r) / 6
        v += (k1_v + 2 * k2_v + 2 * k3_v + k4_v) / 6

    return positions


# 计算轨道
positions = runge_kutta(r0, v0, dt, steps)

# 绘制轨道
plt.figure(figsize=(6, 6))
plt.plot(positions[:, 0], positions[:, 1], label="Orbits", color="b")
plt.scatter(0, 0, color='r', label="Sun")  # 太阳位置
plt.xlabel('x(m)')
plt.ylabel('y(m)')
plt.title('Planetary orbits')
plt.legend()
plt.axis('equal')
plt.savefig('Kepler.png')

代码解析

  1. 常数定义:我们定义了万有引力常数 G、太阳和地球的质量、以及天文单位 AU(地球和太阳之间的平均距离)。
  2. 初始条件:假设地球的初始位置是距离太阳 1 个天文单位,并且初速度是地球公转速度(大约 29780 m/s)。
  3. 数值积分:我们使用 Runge-Kutta 方法来计算行星的轨道。每一步,根据万有引力计算加速度,再更新速度和位置。
  4. 绘制轨道:最终我们使用 matplotlib 绘制出行星的轨道。

运行结果

运行代码后,你将看到地球围绕太阳的椭圆轨道。虽然我们使用了简单的欧拉方法,但结果已经足够直观地展示了行星的运动轨迹。

验证开普勒定律

  1. 轨道是椭圆形的:通过模拟结果,我们可以清楚地看到行星沿椭圆轨道围绕太阳运动,验证了开普勒的第一定律。
  2. 面积定律:我们可以通过计算在相同时间间隔内扫过的面积来验证开普勒的第二定律。理论上,行星与太阳的连线在相等时间内扫过的面积应该相等。
  3. 调和定律:开普勒的第三定律表明,行星的公转周期的平方与轨道半长轴的立方成正比。我们可以通过改变初始条件(如轨道半径)来验证这一点。

总结

今天,我们使用 Python 通过数值模拟验证了开普勒行星运动定律。我们从万有引力定律出发,利用数值积分方法模拟了行星的轨道,并通过结果验证了开普勒的三个定律。虽然这只是一个简单的模拟,实际中还有更复杂的情况,比如考虑多个天体之间的相互作用等,但这个模型已经很好地展示了行星运动的基本规律。

希望这篇文章能帮助大家更好地理解开普勒定律,并且对使用 Python 进行科学计算和模拟有更深入的认识。欢迎大家在评论区分享自己的想法和问题!