Python 实现:三个球相互引力运动的可视化模拟
要在Python中模拟三个球体之间的引力运动,可以使用`matplotlib`库进行可视化,以及`numpy`库进行数学运算。这里,我们将使用牛顿的万有引力公式来计算球体之间的相互作用力,并利用简单的欧拉方法来更新它们的速度和位置。 以下是一个简单的示例代码,模拟三个球体在引力作用下的运动: ```python import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 常量 G = 1.0 # 万有引力常数 # 初始化球的属性 class Ball: def __init__(self, position, mass, velocity): self.position = np.array(position, dtype='float64') self.mass = mass self.velocity = np.array(velocity, dtype='float64') # 计算引力 def compute_gravitational_force(ball1, ball2): r_vector = ball2.position - ball1.position distance = np.linalg.norm(r_vector) if distance == 0: return np.array([0.0, 0.0]) force_magnitude = G * ball1.mass * ball2.mass / distance2 return force_magnitude * (r_vector / distance) # 更新位置和速度 def update_balls(balls, dt): forces = [np.array([0.0, 0.0]) for _ in balls] # 计入每一对球的引力 for i, ball1 in enumerate(balls): for j, ball2 in enumerate(balls): if i != j: forces[i] += compute_gravitational_force(ball1, ball2) # 更新速度和位置 for i, ball in enumerate(balls): acceleration = forces[i] / ball.mass ball.velocity += acceleration * dt ball.position += ball.velocity * dt # 创建三个球体 balls = [ Ball(position=[-1, 0], mass=5, velocity=[0, 0.5]), Ball(position=[1, 0], mass=5, velocity=[0, -0.5]), Ball(position=[0, 1], mass=5, velocity=[-0.5, 0]), ] # 动画设置 fig, ax = plt.subplots() ax.set_xlim(-3, 3) ax.set_ylim(-3, 3) scat = ax.scatter([], []) def init(): scat.set_offsets([]) return scat, def update(frame): update_balls(balls, dt=0.1) scat.set_offsets([ball.position for ball in balls]) return scat, ani = FuncAnimation(fig, update, frames=200, init_func=init, blit=True) plt.show() ``` 代码说明 1. Ball类: 用于表示球体,包括位置、质量和速度。 2. compute_gravitational_force函数: 计算两个球体之间的引力。 3. update_balls函数: 更新不同球体的速度和位置。 4. 动画部分: 使用`matplotlib.animation.FuncAnimation`来创建动态模拟图形。 注意事项 - 本示例中,万有引力常数`G`被设置为1。如果需要实际结果,可以根据具体情况调整。 - 可以调整球体的初始位置和速度以观察不同的运动模式。 - 请确保你已经安装了`numpy`和`matplotlib`库。 运行这个程序后,你将会看到三个球体在相互的引力作用下进行运动的动态效果。 ######[AI写代码神器 | 1715点数解答 | 2024-08-20 16:29:01]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)489
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)371
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)442
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)435
- 揭秘引力:从牛顿公式到爱因斯坦时空弯曲的奇妙之旅(字节豆包 | 175点数解答 | 2025-09-12 19:43:31)67
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)343
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)415
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)440
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)546
- 解决Java调用Python接口时中文值乱码问题:设置字符编码为UTF-8(讯飞星火 | 264点数解答 | 2024-06-06 17:27:09)413
- 洛谷乒乓球题解:11 分制与 21 分制比赛结果计算全攻略(DeepSeek | 675点数解答 | 2025-04-28 18:19:45)318
- C++ 模拟:助冒险者用神秘数字构建直角三角形,开发要点大揭秘! (DeepSeek | 156点数解答 | 2025-09-14 21:30:10)315