🌙 引言
今天我们进步一点点,利用 VPython 来模拟经典的自由落体运动。通过编程实现物理仿真,不仅能加深我们对物理规律的理解,还能直观地看到物体运动的全过程。
⚡ 自由落体运动的物理原理
什么是自由落体?
自由落体是指物体只在重力作用下从静止开始下落的运动。其核心特点:
运动方程
自由落体的运动方程为:
当物体从高度 h 处自由下落时,落地时间可以通过公式计算:
📝 完整代码实现
""" 自由落体运动 2026/5/28 written by 顾振兴"""from vpython import *# 1. 参数设定, 设置变量及初始值size = 1# 小球半径h = 15# 小球离地高度g = 9.8# 重力加速度 9.8 m/s^2t = 0# 时间dt = 0.001# 时间间隔# 2. 画面设定scene = canvas(title="自由落体运动", width=600, height=500, x=0, y=0, center=vec(0, h/2, 0), background=vec(0.9, 0.9, 0.9))floor = box(pos=vec(0, 0, 0), size=vec(40, 0.01, 10), color=color.blue)ball = sphere(pos=vec(0, h, 0), radius=size, color=color.red, v=vec(0, 0, 0), a=vec(0, -g, 0))# 数据图形窗口gd = graph(title="y-t (蓝色) 和 v-t (红色)", width=600, height=400, x=0, y=600, xtitle="t(s)", ytitle="y(m) / v(m/s)")yt = gcurve(graph=gd, color=color.blue) # 位置曲线vt = gcurve(graph=gd, color=color.red) # 速度曲线# 3. 物体运动部分, 小球触地时停止ball_bottom_y = ball.pos.y - sizefloor_top_y = floor.pos.y + 0.5*floor.size.ywhile ball_bottom_y > floor_top_y: rate(1000) ball.v += ball.a * dt ball.pos += ball.v * dt yt.plot(pos=(t, ball.pos.y)) vt.plot(pos=(t, ball.v.y)) t += dt ball_bottom_y = ball.pos.y - sizeprint("落地时间 t =", t)
🔍 代码解析
第一部分:参数设定
size = 1# 小球半径h = 15# 小球离地高度(小球中心初始位置)g = 9.8# 重力加速度t = 0# 初始时间dt = 0.001# 时间步长,越小越精确
第二部分:场景搭建
scene = canvas(title="自由落体运动", ...) # 创建画布floor = box(...) # 创建地面ball = sphere(...) # 创建小球gd = graph(...) # 创建数据图表
关键知识点:
- •
canvas:VPython 的主画布,用于显示 3D 场景 - •
sphere:球体对象,通过 pos、radius、color 等属性定义 - •
graph:数据图表窗口,用于实时绘制运动曲线
第三部分:运动循环
while ball_bottom_y > floor_top_y: rate(1000) # 控制帧率 ball.v += ball.a * dt # 更新速度 ball.pos += ball.v * dt # 更新位置 yt.plot(pos=(t, ball.pos.y)) # 绘制位置曲线 vt.plot(pos=(t, ball.v.y)) # 绘制速度曲线 t += dt
数值方法:这里使用的是 欧拉法,这是最简单的数值积分方法。虽然精度有限,但对于简单的物理模拟已经足够。
终止条件
ball_bottom_y = ball.pos.y - sizefloor_top_y = floor.pos.y + 0.5*floor.size.ywhile ball_bottom_y > floor_top_y:
检测小球底部是否触地,确保物理模拟的准确性。
📊 运行效果
预期输出
控制台输出:
落地时间 t = 1.6899999999999247
理论验证:
程序计算结果与理论值高度吻合!
图形输出
运行程序后会看到两个窗口:
💡 拓展知识
欧拉法的优缺点
改进建议
如果需要更高精度,可以考虑:
- • 使用更高级的积分方法(如龙格-库塔法等),后续我们会在改进
如果你觉得这篇文章对你有帮助,请点赞、在看、转发三连支持一下!🎉
📮 关注我们,获取更多有趣的物理仿真教程!