当前位置: 首页 > article >正文

用Python模拟完全弹性碰撞:从公式推导到可视化演示(附完整代码)

用Python模拟完全弹性碰撞从公式推导到可视化演示附完整代码在物理仿真领域完全弹性碰撞是一个经典的研究课题。它不仅帮助我们理解动量守恒和能量守恒的基本原理还能通过编程实现直观的可视化效果。本文将带你从零开始用Python构建一个完整的弹性碰撞模拟系统并通过matplotlib实现动态演示。1. 理解完全弹性碰撞的物理原理完全弹性碰撞是指两个物体碰撞前后总动能保持不变的理想情况。这种碰撞满足两个基本守恒定律动量守恒系统总动量在碰撞前后保持不变动能守恒系统总动能在碰撞前后保持不变用数学公式表示为动量守恒m₁v₁₀ m₂v₂₀ m₁v₁ m₂v₂ 动能守恒½m₁v₁₀² ½m₂v₂₀² ½m₁v₁² ½m₂v₂²注意在实际编程中我们通常会简化场景假设第二个物体初始静止(v₂₀0)这样公式推导会更简洁。2. 碰撞后的速度公式推导基于上述守恒定律我们可以推导出碰撞后两物体的速度表达式。假设物体2初始静止(v₂₀0)推导过程如下由动量守恒 m₁v₁₀ m₁v₁ m₂v₂由动能守恒 ½m₁v₁₀² ½m₁v₁² ½m₂v₂²通过代数运算可以得到碰撞后的速度v₁ (m₁ - m₂)/(m₁ m₂) * v₁₀ v₂ (2m₁)/(m₁ m₂) * v₁₀这个结果有几个有趣的特例质量比碰撞后物体1速度碰撞后物体2速度物理意义m₁m₂0v₁₀物体1停止物体2获得全部速度m₁m₂v₁₀2v₁₀大质量物体几乎不受影响小质量物体获得两倍速度m₁m₂-v₁₀0小质量物体反弹大质量物体几乎不动3. Python实现碰撞模拟现在我们将上述物理原理转化为Python代码。首先需要安装必要的库pip install numpy matplotlib然后创建一个CollisionSimulator类来封装我们的模拟逻辑import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation class CollisionSimulator: def __init__(self, m11.0, m21.0, v11.0, v20.0): self.m1 m1 # 物体1质量 self.m2 m2 # 物体2质量 self.v1 v1 # 物体1初速度 self.v2 v2 # 物体2初速度 self.x1 -5 # 物体1初始位置 self.x2 0 # 物体2初始位置 self.radius 0.5 # 物体显示半径 self.time 0 self.dt 0.01 # 时间步长 def calculate_velocities(self): 计算碰撞后的速度 v1_new ((self.m1 - self.m2) / (self.m1 self.m2)) * self.v1 \ ((2 * self.m2) / (self.m1 self.m2)) * self.v2 v2_new ((2 * self.m1) / (self.m1 self.m2)) * self.v1 \ ((self.m2 - self.m1) / (self.m1 self.m2)) * self.v2 return v1_new, v2_new def update_positions(self): 更新物体位置 self.x1 self.v1 * self.dt self.x2 self.v2 * self.dt self.time self.dt # 检测碰撞 if abs(self.x1 - self.x2) 2 * self.radius: self.v1, self.v2 self.calculate_velocities() def get_state(self): 返回当前状态 return { time: self.time, x1: self.x1, x2: self.x2, v1: self.v1, v2: self.v2 }4. 可视化碰撞过程有了模拟器后我们可以用matplotlib创建动画来直观展示碰撞过程def run_simulation(m11.0, m21.0, v11.0, v20.0, duration10): sim CollisionSimulator(m1, m2, v1, v2) # 设置图形 fig, ax plt.subplots(figsize(10, 4)) ax.set_xlim(-10, 10) ax.set_ylim(-1, 1) ax.set_aspect(equal) ax.grid(True) # 创建物体表示 circle1 plt.Circle((sim.x1, 0), sim.radius, colorblue) circle2 plt.Circle((sim.x2, 0), sim.radius, colorred) ax.add_patch(circle1) ax.add_patch(circle2) # 添加质量标签 mass_text1 ax.text(sim.x1, 0.7, fm1{m1}, hacenter) mass_text2 ax.text(sim.x2, 0.7, fm2{m2}, hacenter) # 动画更新函数 def update(frame): sim.update_positions() circle1.center (sim.x1, 0) circle2.center (sim.x2, 0) mass_text1.set_position((sim.x1, 0.7)) mass_text2.set_position((sim.x2, 0.7)) return circle1, circle2, mass_text1, mass_text2 # 创建动画 frames int(duration / sim.dt) ani FuncAnimation(fig, update, framesframes, interval20, blitTrue) plt.title(完全弹性碰撞模拟) plt.xlabel(位置) plt.show() return ani5. 模拟不同质量比的碰撞效果现在我们可以通过改变质量参数来观察不同的碰撞效果。以下是几个典型场景的模拟5.1 等质量碰撞(m1m21)run_simulation(m11.0, m21.0, v12.0)这种情况下物体1会完全停止物体2会获得物体1的全部速度。5.2 大质量撞击小质量(m110, m21)run_simulation(m110.0, m21.0, v11.0)大质量物体几乎不受影响小质量物体会被高速弹开。5.3 小质量撞击大质量(m11, m210)run_simulation(m11.0, m210.0, v12.0)小质量物体会以接近原速度反弹大质量物体几乎保持静止。6. 扩展功能能量和动量跟踪为了更深入理解碰撞过程我们可以添加能量和动量的计算与显示def run_simulation_with_metrics(m11.0, m21.0, v11.0, v20.0): sim CollisionSimulator(m1, m2, v1, v2) # 设置图形 fig, (ax1, ax2) plt.subplots(2, 1, figsize(10, 8)) ax1.set_xlim(-10, 10) ax1.set_ylim(-1, 1) ax1.set_aspect(equal) ax1.grid(True) # 创建物体 circle1 plt.Circle((sim.x1, 0), sim.radius, colorblue) circle2 plt.Circle((sim.x2, 0), sim.radius, colorred) ax1.add_patch(circle1) ax1.add_patch(circle2) # 初始化能量和动量曲线 time_data [] momentum_data [] energy_data [] line_momentum, ax2.plot([], [], b-, label总动量) line_energy, ax2.plot([], [], r-, label总动能) ax2.legend() ax2.set_xlim(0, 10) ax2.set_ylim(0, max(1, 0.5*m1*v1**2 0.5*m2*v2**2)*1.2) ax2.set_xlabel(时间) ax2.set_ylabel(值) ax2.grid(True) def update(frame): sim.update_positions() circle1.center (sim.x1, 0) circle2.center (sim.x2, 0) # 计算动量和能量 momentum m1 * sim.v1 m2 * sim.v2 energy 0.5 * m1 * sim.v1**2 0.5 * m2 * sim.v2**2 time_data.append(sim.time) momentum_data.append(momentum) energy_data.append(energy) line_momentum.set_data(time_data, momentum_data) line_energy.set_data(time_data, energy_data) # 调整坐标轴范围 if sim.time ax2.get_xlim()[1]: ax2.set_xlim(0, sim.time) return circle1, circle2, line_momentum, line_energy ani FuncAnimation(fig, update, frames500, interval20, blitTrue) plt.suptitle(完全弹性碰撞模拟 - 动量与能量守恒) plt.show() return ani这个扩展版本可以直观展示碰撞过程中动量和能量的守恒情况验证我们的模拟确实符合物理定律。

相关文章:

用Python模拟完全弹性碰撞:从公式推导到可视化演示(附完整代码)

用Python模拟完全弹性碰撞:从公式推导到可视化演示(附完整代码) 在物理仿真领域,完全弹性碰撞是一个经典的研究课题。它不仅帮助我们理解动量守恒和能量守恒的基本原理,还能通过编程实现直观的可视化效果。本文将带你从…...

[开关电源-拓扑解析] 从伏秒积平衡到设计实战:Buck/Boost/Buck-Boost在CCM模式下的核心公式与应用场景

1. 伏秒积平衡:理解开关电源的黄金法则 第一次接触开关电源设计时,我被各种拓扑结构搞得晕头转向,直到真正理解了伏秒积平衡这个概念,才突然有种豁然开朗的感觉。简单来说,伏秒积平衡就像是给电感"记账"——…...

Windows下Neo4j 4.4社区版安装避坑指南:从环境变量配置到浏览器访问

Windows下Neo4j 4.4社区版安装与实战指南 1. 为什么选择Neo4j作为你的第一个图数据库 在数据爆炸的时代,传统关系型数据库在处理复杂关联数据时显得力不从心。想象一下,当你需要分析社交网络中用户之间的多层关系,或者电商平台中商品与用户…...

DiskGenius实战:误删分区后如何用‘搜索丢失分区‘功能救回数据(附详细步骤)

DiskGenius数据恢复实战:误删分区后的完整救援指南 当你发现硬盘上的某个分区突然消失,或者系统提示"未格式化"时,那种心跳加速的感觉我深有体会。去年帮一位摄影师客户恢复婚礼照片时,亲眼见证了他从绝望到欣喜的全过程…...

基于多控制策略的车辆路径跟踪仿真研究

基于前轮转向转矩分配(AFSDYC)模型预测控制(MPC)路径跟踪(PTC)侧偏角软约束,目前的范例是72km/h,附着系数0.85双移线。 仿真使用的是MATLAB2020b版本和carsim2020。 MPC有两个:第一个为增量式方法编写,采用s-function实现&#xf…...

FLAC3D 钢筋混凝土梁四点弯破坏过程数值模拟

flac3d钢筋混凝土梁四点弯破坏过程数值模拟在土木工程领域,了解钢筋混凝土梁在不同受力状态下的破坏过程至关重要。数值模拟为我们提供了一种深入探究这一过程的有效手段,今天就来聊聊使用 FLAC3D 对钢筋混凝土梁四点弯破坏过程进行数值模拟的那些事儿。…...

51单片机寻迹避障小车的奇妙之旅

51单片机寻迹避障小车(遇障碍物停车)仿真+源程序,两个版本,指示灯或LCD 仿真图设计: (1)寻迹功能的两个红外传感器,用两个单刀开关来模拟(断开为高电平1&…...

基于Matlab实现面和线接触滑块润滑的奇妙之旅

基于matlab的面和线接触的滑块润滑,基于有限差分法求解面接触滑块润滑的油膜厚度、油膜压力,输出三维可视化结果。 程序已调通,可直接运行。最近在研究滑块润滑的问题,今天就来和大家分享一下基于Matlab实现面和线接触滑块润滑分析…...

探索ICEEMDAN - iMPA - BiLSTM在功率/风速预测中的奇妙之旅

ICEEMDAN-iMPA-BiLSTM功率/风速预测 基于改进的自适应经验模态分解改进海洋捕食者算法双向长短期记忆网络时间序列预测~组合预测 Matlab语言 1.分解时避免了传统经验模态分解的一些固有缺陷,效果更佳,并通过改进的海洋捕食者算法对BiLSTM四个…...

基于matlab的雾霾天气+夜间车牌识别系统 【车牌识别】基于计算机视觉,数字图像处理常见实战项目

基于matlab的雾霾天气夜间车牌识别系统 【车牌识别】基于计算机视觉,数字图像处理常见实战项目:雾霾天气及夜间车牌识别语音播报GUI显示车牌信息导出。 含GUI界面。 预处理过程:去雾增强算法,亮度增强算法。 车牌处理过程&#xf…...

Yolo免环境训练工具:支持多版本Yolo标注与训练的实用工具集

yolo免环境训练工具 yolo8标注工具 yolo训练工具 yolo8 yolo4 yolo3 yolo无需搭建环境训练工具 免环境标注、训练的工具 支持版本 yolo3 yolo4 yolo8(电脑显卡必须N卡) 可训练模型 cfg weights bin param pt yolo8l.pt yolo8m.pt yolo8n.pt yolo8s.pt yolo8x.pt 实用功能 自动…...

解锁LyricsX高效配置:让你的macOS歌词体验无缝升级

解锁LyricsX高效配置:让你的macOS歌词体验无缝升级 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的开源歌词工具,能够自动同步显示歌…...

基于Simulink和Carsim的车辆主动悬架防侧翻控制项目报告

车辆主动悬架防侧翻控制 利用Simulink和Carsim进行联合仿真,搭建主动悬架以及防倾杆模型,在不同转角工况下进行仿真试验,设置滑模等控制器计算维持车辆侧倾稳定性所需的力矩,将力矩分配到各个悬架实现控制效果。 控制效果良好&…...

基于同步旋转坐标系的高效无位置传感器永磁同步电机控制策略——采用三相电压重构,告别传统电压采集...

同步旋转坐标系下,无位置传感器永磁同步电机控制,创新点为三相电压为重构,不需要电压采集模块。 需matlab2018a及以上。凌晨三点的实验室里,咖啡机突然罢工。看着示波器上跳动的波形,我突然意识到——电机控制工程师的…...

搞定芯片设计后仿:手把手教你在Linux上为Cadence配置QRC寄生参数提取工具

芯片设计后仿实战:Linux系统下Cadence QRC工具深度配置指南 在芯片设计流程中,后仿真验证环节直接关系到最终流片的成败。寄生参数提取作为连接物理设计与时序验证的关键步骤,其精度和效率直接影响芯片性能分析的可靠性。本文将聚焦Cadence Q…...

麒麟系统v10 SP3上MariaDB的5个隐藏技巧,新手必看!

麒麟系统v10 SP3上MariaDB的5个隐藏技巧,新手必看! 麒麟系统v10 SP3作为国产操作系统的代表,其内置的MariaDB数据库管理系统凭借轻量高效的特点,成为开发者构建本地应用的优选方案。但许多新手用户仅停留在基础操作层面&#xff0…...

AI Agent框架选型:OpenClaw、LangChain、AutoGPT、CrewAI,到底该选哪个?

先说结论Go写命令行AI客户端,核心是HTTP请求JSON处理,代码量不大,但依赖管理、错误处理、上下文维护这些细节才是实际成本。这种方案适合快速验证、个人工具,但生产环境要考虑API成本、速率限制、错误重试、日志监控。如果只是调用…...

告别普通CardView!用MaterialCardView这5个属性,让你的Android应用卡片颜值飙升

解锁MaterialCardView的5个高阶设计属性:让Android卡片交互更优雅 在移动应用界面设计中,卡片(Card)已经成为信息组织和视觉呈现的基础单元。从社交动态到电商商品,从设置项到内容摘要,卡片式布局无处不在。…...

用Go写个命令行AI客户端,到底值不值?

先说结论 Go写命令行AI客户端,核心是HTTP请求JSON处理,代码量不大,但依赖管理、错误处理、上下文维护这些细节才是实际成本。 这种方案适合快速验证、个人工具,但生产环境要考虑API成本、速率限制、错误重试、日志监控。 如果只…...

ESP32与LVGL完美结合:TFT_eSPI驱动配置全攻略

1. 为什么选择ESP32LVGLTFT_eSPI组合 把ESP32、LVGL和TFT_eSPI这三个技术栈组合在一起,可以说是嵌入式GUI开发的黄金搭档。我做过不少物联网设备的人机交互界面,这套方案在性价比和开发效率上真的很难找到对手。 ESP32作为主控芯片,双核240MH…...

RISC-V PMA与PMP协同设计:从硬件属性到软件权限的完整内存保护链

1. 理解RISC-V内存保护的双重防线 第一次接触RISC-V的内存保护机制时,我被PMA和PMP这两个缩写搞晕了——它们看起来都跟内存保护相关,但具体区别是什么?后来在调试一块物联网模组时,我才真正理解它们的协同价值。当时遇到一个诡异…...

前端直连MinIO上传文件总报跨域错误?试试用Nginx反向代理这招(附完整配置)

前端直连MinIO上传文件总报跨域错误?试试用Nginx反向代理这招(附完整配置) 最近在项目中整合MinIO作为文件存储服务时,不少开发者反馈前端直接调用MinIO API上传文件时频繁遭遇CORS(跨域资源共享)错误。这种…...

【深度剖析】OpenCV内存分配失败:从x86到x64架构迁移的完整避坑指南

1. 为什么你的OpenCV总在关键时刻掉链子? 上周帮同事调试一个图像拼接程序,处理8K航拍图时突然崩溃,控制台赫然出现cv::Exception: Failed to allocate 362389056 bytes的报错。这场景是不是很熟悉?就像你准备导出耗时3小时渲染的…...

单细胞测序实战 | 解析树突状细胞亚群转换潜能的计算方法与治疗响应关联

1. 单细胞测序如何揭示树突状细胞的"变身"潜力 第一次看到"Transitional Potential"这个词时,我正盯着电脑屏幕上的单细胞测序数据发呆。那是在分析三阴性乳腺癌免疫治疗数据时,突然意识到原来细胞也会"变身"——就像超级…...

Hackintool终极指南:从零开始轻松配置完美黑苹果系统

Hackintool终极指南:从零开始轻松配置完美黑苹果系统 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool 还在为黑苹果配置的复杂性而烦恼吗?Hackintool作为黑…...

终极指南:Apollo Save Tool - 简单高效的PS4游戏存档管理解决方案

终极指南:Apollo Save Tool - 简单高效的PS4游戏存档管理解决方案 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 你是否曾为丢失游戏进度而烦恼?或是想在不同PS4主机间迁移存档却…...

Token限制下的ChatGPT高效对话:如何优化Prompt长度与内容(含计算工具推荐)

Token限制下的ChatGPT高效对话:如何优化Prompt长度与内容(含计算工具推荐) 当ChatGPT成为日常开发和工作的重要工具时,许多用户都会遇到一个共同的瓶颈——Token限制。这个看似技术性的问题,实际上直接影响着我们与AI对…...

ComfyUI-Manager启动项管理深度解析:如何解决AI绘画扩展依赖冲突与启动故障

ComfyUI-Manager启动项管理深度解析:如何解决AI绘画扩展依赖冲突与启动故障 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager ComfyUI作为当前最流行的AI绘画工作流平台,其强大的扩展生态让用户可…...

LeRobot实战指南:如何用开源框架构建智能机器人控制系统

LeRobot实战指南:如何用开源框架构建智能机器人控制系统 【免费下载链接】lerobot 🤗 LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot 在机器人技术…...

嵌入式C多核调试黑盒破解:JTAG无法捕获的竞态现场复现术——基于Trace32+CoreSight ETM的指令级时间戳回溯(附开源TraceParser工具链)

第一章:嵌入式C多核性能在现代嵌入式系统中,多核处理器已成为提升实时性与吞吐量的关键架构。嵌入式C语言虽无原生线程语法,但通过底层寄存器操作、内存屏障指令(如 ARM 的 DSB、DMB)及硬件抽象层(HAL&…...