用python实现三体运动可视化
时间: 2024-01-16 12:03:39 浏览: 43
以下是一个基本的三体运动可视化的Python代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 三体的质量
m1 = 1
m2 = 2
m3 = 3
# 初始位置和速度
r1_0 = np.array([1, 0, 0])
r2_0 = np.array([0, 1, 0])
r3_0 = np.array([0, 0, 1])
v1_0 = np.array([0, 1, 1])
v2_0 = np.array([1, 0, 1])
v3_0 = np.array([1, 1, 0])
# gravitational constant
G = 1
# 定义加速度函数
def acceleration(r1, r2, r3):
r12 = r2 - r1
r13 = r3 - r1
r23 = r3 - r2
a1 = G * m2 * r12 / np.linalg.norm(r12)**3 + G * m3 * r13 / np.linalg.norm(r13)**3
a2 = G * m1 * -r12 / np.linalg.norm(r12)**3 + G * m3 * r23 / np.linalg.norm(r23)**3
a3 = G * m1 * -r13 / np.linalg.norm(r13)**3 + G * m2 * -r23 / np.linalg.norm(r23)**3
return a1, a2, a3
# 模拟时间和步长
t_max = 10
dt = 0.01
t_array = np.arange(0, t_max, dt)
# 模拟位置和速度
r1 = np.zeros((len(t_array), 3))
r2 = np.zeros((len(t_array), 3))
r3 = np.zeros((len(t_array), 3))
v1 = np.zeros((len(t_array), 3))
v2 = np.zeros((len(t_array), 3))
v3 = np.zeros((len(t_array), 3))
r1[0], r2[0], r3[0] = r1_0, r2_0, r3_0
v1[0], v2[0], v3[0] = v1_0, v2_0, v3_0
for i in range(1, len(t_array)):
a1, a2, a3 = acceleration(r1[i-1], r2[i-1], r3[i-1])
r1[i] = r1[i-1] + v1[i-1] * dt + 0.5 * a1 * dt**2
r2[i] = r2[i-1] + v2[i-1] * dt + 0.5 * a2 * dt**2
r3[i] = r3[i-1] + v3[i-1] * dt + 0.5 * a3 * dt**2
a1_new, a2_new, a3_new = acceleration(r1[i], r2[i], r3[i])
v1[i] = v1[i-1] + 0.5 * (a1 + a1_new) * dt
v2[i] = v2[i-1] + 0.5 * (a2 + a2_new) * dt
v3[i] = v3[i-1] + 0.5 * (a3 + a3_new) * dt
# 画图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(r1[:,0], r1[:,1], r1[:,2], label='Body 1')
ax.plot(r2[:,0], r2[:,1], r2[:,2], label='Body 2')
ax.plot(r3[:,0], r3[:,1], r3[:,2], label='Body 3')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.legend()
plt.show()
```
该代码将三个质点的初始位置和速度定义为向量,并使用欧拉法模拟了它们的运动。它假设三个质点之间存在万有引力,并使用加速度函数计算它们的加速度。它使用matplotlib创建了一个3D图形实例,将三个质点的路径绘制在其中。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)