Python 代码实现:模拟三个球的相互引力运动轨迹
要使用Python模拟三个球体之间的相互引力作用,我们可以借助一些基本的物理原理和数学计算。这里提供一个简单的示例代码,使用欧拉方法来近似求解牛顿万有引力定律。 首先,我们需要定义几个基本参数: - 球的质量(mass) - 初始位置(position) - 初始速度(velocity) - 万有引力常数(G) 下面是一个具体的实现: ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 定义万有引力常数 G = 6.67430e-11 # 单位:m^3 kg^-1 s^-2 class Ball: def __init__(self, mass, position, velocity): self.mass = mass self.position = np.array(position, dtype=float) self.velocity = np.array(velocity, dtype=float) def gravitational_force(ball1, ball2): """计算两个球体之间的引力""" r_vec = ball2.position - ball1.position r_mag = np.linalg.norm(r_vec) force_mag = G * ball1.mass * ball2.mass / (r_mag 2) force_vec = -force_mag * r_vec / r_mag return force_vec def update(balls, dt): """更新每个球的位置和速度""" forces = [] for i in range(len(balls)): net_force = np.zeros(3) for j in range(len(balls)): if i != j: net_force += gravitational_force(balls[i], balls[j]) forces.append(net_force) for i, ball in enumerate(balls): ball.velocity += forces[i] / ball.mass * dt ball.position += ball.velocity * dt # 创建三个球 ball1 = Ball(1e24, [0, 0, 0], [0, 2000, 0]) ball2 = Ball(1e24, [1e8, 0, 0], [0, 0, 2000]) ball3 = Ball(1e24, [1e8, 1e8, 0], [0, -2000, -2000]) balls = [ball1, ball2, ball3] # 模拟时间步长和总步数 dt = 60 # 单位:秒 total_steps = 10000 # 存储轨迹 trajectories = {ball: [] for ball in balls} for step in range(total_steps): update(balls, dt) for ball in balls: trajectories[ball].append(ball.position.copy()) # 绘制轨迹 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') colors = ['r', 'g', 'b'] for ball, color in zip(balls, colors): x, y, z = zip(*trajectories[ball]) ax.plot(x, y, z, color=color, label=f'Ball {balls.index(ball) + 1}') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.legend() plt.show() ``` 说明: 1. Ball 类:用于表示球的基本属性。 2. gravitational_force 函数:根据牛顿万有引力定律计算两个球之间的引力。 3. update 函数:更新每个球的位置和速度。 4. 绘图:使用 Matplotlib 的 3D 图形功能来展示轨迹。 这段代码可以作为起点,你可以根据需要调整参数、添加更多的物理细节或改进数值积分方法。 ######[AI写代码神器 | 802点数解答 | 2024-08-20 16:31:28]
- 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
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)493
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)379