引言
三体运动模型是物理学中的一个经典问题,描述了三个质量点在相互引力作用下的运动。这个模型因其复杂性和无规律性而备受关注,成为研究非线性动力学和混沌理论的典型案例。本文将通过GIF动画的形式,带你深入了解三体运动模型的奥秘。
三体运动模型的基本原理
1. 引力定律
三体运动模型基于牛顿的万有引力定律,即两个物体之间的引力与它们的质量成正比,与它们之间距离的平方成反比。
2. 运动方程
三体运动模型可以用以下微分方程来描述: [ m_1\frac{d^2\mathbf{r}_1}{dt^2} = G\frac{m_1m_2}{|\mathbf{r}_1 - \mathbf{r}_2|^3}(\mathbf{r}_1 - \mathbf{r}_2) + G\frac{m_1m_3}{|\mathbf{r}_1 - \mathbf{r}_3|^3}(\mathbf{r}_1 - \mathbf{r}_3) ] [ m_2\frac{d^2\mathbf{r}_2}{dt^2} = G\frac{m_1m_2}{|\mathbf{r}_1 - \mathbf{r}_2|^3}(\mathbf{r}_2 - \mathbf{r}_1) + G\frac{m_2m_3}{|\mathbf{r}_2 - \mathbf{r}_3|^3}(\mathbf{r}_2 - \mathbf{r}_3) ] [ m_3\frac{d^2\mathbf{r}_3}{dt^2} = G\frac{m_1m_3}{|\mathbf{r}_1 - \mathbf{r}_3|^3}(\mathbf{r}_3 - \mathbf{r}_1) + G\frac{m_2m_3}{|\mathbf{r}_2 - \mathbf{r}_3|^3}(\mathbf{r}_3 - \mathbf{r}_2) ]
其中,( m_1, m_2, m_3 ) 分别是三个物体的质量,( \mathbf{r}_1, \mathbf{r}_2, \mathbf{r}_3 ) 是它们的位矢,( G ) 是万有引力常数。
GIF动画的制作
为了更直观地展示三体运动模型,我们可以通过以下步骤制作GIF动画:
1. 选择初始条件
设定三个物体的初始位置、速度和质量。
2. 求解运动方程
使用数值积分方法(如欧拉方法或龙格-库塔方法)求解运动方程,得到物体在不同时间点的位置。
3. 绘制动画
将求解得到的位置数据绘制成动画,展示三体系统的运动轨迹。
以下是一个使用Python和matplotlib库绘制三体运动模型GIF动画的示例代码:
”`python import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation
定义三体运动模型参数
G = 6.67430e-11 # 万有引力常数 m1, m2, m3 = 1.0, 1.0, 1.0 # 物体质量 r1_0, v1_0 = np.array([1.0, 0.0]), np.array([0.0, 1.0]) # 物体1初始位置和速度 r2_0, v2_0 = np.array([-1.0, 0.0]), np.array([0.0, -1.0]) # 物体2初始位置和速度 r3_0, v3_0 = np.array([0.0, 1.0]), np.array([-1.0, 0.0]) # 物体3初始位置和速度
定义运动方程
def equations_of_motion(t, state):
x1, y1, vx1, vy1, x2, y2, vx2, vy2, x3, y3, vx3, vy3 = state
forces = np.zeros_like(state)
forces[0:4] = G * m2 * (x1 - x2)**2 + G * m3 * (x1 - x3)**2
forces[4:8] = G * m1 * (x2 - x1)**2 + G * m3 * (x2 - x3)**2
forces[8:12] = G * m1 * (x3 - x1)**2 + G * m2 * (x3 - x2)**2
forces[0:4] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[4:8] *= (x2 - x1) / np.linalg.norm(x2 - x1)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3 - x2) / np.linalg.norm(x3 - x2)**3
forces[8:12] *= (x1 - x2) / np.linalg.norm(x1 - x2)**3
forces[0:4] += G * m3 * (x1 - x3)**2
forces[4:8] += G * m1 * (x2 - x3)**2
forces[8:12] += G * m2 * (x3 - x1)**2
forces[0:4] *= (x1 - x3) / np.linalg.norm(x1 - x3)**3
forces[4:8] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[8:12] *= (x3 - x1) / np.linalg.norm(x3 - x1)**3
forces[0:4] += G * m2 * (x2 - x3)**2
forces[4:8] += G * m1 * (x3 - x2)**2
forces[8:12] += G * m3 * (x1 - x2)**2
forces[0:4] *= (x2 - x3) / np.linalg.norm(x2 - x3)**3
forces[4:8] *= (x3
