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

用Python的Matplotlib和SciPy,5分钟搞定一个会动的双摆模拟动画

用Python打造会跳舞的双摆5分钟实现物理动画可视化看着屏幕上两个相互追逐的小球划出优美的混沌轨迹仿佛在跳一支神秘的华尔兹——这就是双摆的魅力。作为经典混沌系统之一双摆的运动轨迹既优雅又难以预测是物理模拟的绝佳案例。本文将带你用Python的Matplotlib和SciPy在短短5分钟内创建一个生动的双摆动画无需深入理解复杂物理公式就能亲眼见证混沌之美。1. 准备工作环境搭建与工具简介在开始编码之前我们需要确保开发环境准备就绪。推荐使用Anaconda作为Python环境管理器它能轻松处理科学计算所需的依赖关系。必备工具包安装pip install numpy matplotlib scipy这三个核心库将承担不同角色NumPy处理数值计算和数组操作Matplotlib负责数据可视化和动画制作SciPy提供odeint函数用于微分方程数值求解提示如果希望获得更流畅的动画效果可以额外安装ffmpeg用于保存动画为视频文件。双摆系统由两个单摆连接而成其运动状态由四个变量决定上摆角度θ₁和角速度ω₁下摆角度θ₂和角速度ω₂虽然精确的动力学方程涉及拉格朗日力学但我们的目标是通过数值方法直接求解避开复杂的理论推导。2. 构建双摆微分方程模型双摆系统的运动方程可以用以下二阶微分方程组描述(m₁m₂)L₁θ₁ m₂L₂cos(θ₁-θ₂)θ₂ m₂L₂sin(θ₁-θ₂)θ₂² (m₁m₂)g sinθ₁ 0 m₂L₂θ₂ m₂L₁cos(θ₁-θ₂)θ₁ - m₂L₁sin(θ₁-θ₂)θ₁² m₂g sinθ₂ 0这些方程看起来复杂但我们可以将其转化为Python代码def double_pendulum_eq(state, t, L1, L2, m1, m2): theta1, z1, theta2, z2 state c, s np.cos(theta1-theta2), np.sin(theta1-theta2) theta1_dot z1 theta2_dot z2 # 矩阵方程求解加速度项 A np.array([[(m1m2)*L1, m2*L2*c], [m2*L1*c, m2*L2]]) B np.array([-m2*L2*s*z2**2 - (m1m2)*g*np.sin(theta1), m2*L1*s*z1**2 - m2*g*np.sin(theta2)]) z1_dot, z2_dot np.linalg.solve(A, B) return [theta1_dot, z1_dot, theta2_dot, z2_dot]参数说明表参数物理意义典型值L1上摆长度1.0 mL2下摆长度1.0 mm1上球质量1.0 kgm2下球质量1.0 kgg重力加速度9.8 m/s²3. 数值求解与轨迹计算有了微分方程接下来使用SciPy的odeint函数进行数值积分from scipy.integrate import odeint # 初始条件[θ1, ω1, θ2, ω2] initial_state [np.pi/2, 0, np.pi/2, 0] # 时间点0到10秒步长0.02秒 t np.arange(0, 10, 0.02) # 求解微分方程 params (1.0, 1.0, 1.0, 1.0) # L1, L2, m1, m2 solution odeint(double_pendulum_eq, initial_state, t, argsparams) # 提取结果 theta1, theta2 solution[:,0], solution[:,2]轨迹计算# 转换为笛卡尔坐标 x1 L1 * np.sin(theta1) y1 -L1 * np.cos(theta1) x2 x1 L2 * np.sin(theta2) y2 y1 - L2 * np.cos(theta2)注意初始角度设置对系统行为影响很大。尝试将θ₁设为π(180°)θ₂设为0观察混沌现象。4. 创建动态可视化效果现在进入最激动人心的部分——让双摆动起来Matplotlib的animation模块让这变得简单from matplotlib.animation import FuncAnimation fig, ax plt.subplots(figsize(8,8)) ax.set_xlim(-2.5, 2.5) ax.set_ylim(-2.5, 2.5) ax.grid() line, ax.plot([], [], o-, lw2) trace, ax.plot([], [], ,-, lw1, alpha0.5) def init(): line.set_data([], []) trace.set_data([], []) return line, trace def animate(i): # 更新摆线 line.set_data([0, x1[i], x2[i]], [0, y1[i], y2[i]]) # 更新轨迹显示最近100帧 trail_length 100 start max(0, i-trail_length) trace.set_data(x2[start:i], y2[start:i]) return line, trace ani FuncAnimation(fig, animate, frameslen(t), init_funcinit, blitTrue, interval20) plt.show()动画优化技巧调整interval参数控制播放速度使用blitTrue提高渲染效率添加轨迹线展示历史路径保存动画ani.save(double_pendulum.mp4, writerffmpeg)5. 探索混沌参数调整实验双摆系统对初始条件极为敏感这正是混沌系统的特征。尝试以下实验初始角度实验initial_conditions [ [np.pi/2, 0, np.pi/2, 0], # 两摆垂直向下 [np.pi, 0, np.pi, 0], # 两摆水平 [np.pi, 0, np.pi0.01, 0] # 微小差异 ]物理参数影响质量比(m1/m2)变化尝试m12, m21长度比(L1/L2)变化尝试L11.5, L21.0重力加速度g模拟不同星球环境混沌特征观察长期行为不可预测性初始微小差异导致轨迹巨大分歧看似随机但实则确定性的运动模式6. 进阶扩展交互式双摆模拟为了让实验更加直观我们可以创建交互式控件from matplotlib.widgets import Slider fig, ax plt.subplots(figsize(10,8)) plt.subplots_adjust(bottom0.3) # 添加滑块控件 ax_m1 plt.axes([0.2, 0.2, 0.6, 0.03]) ax_m2 plt.axes([0.2, 0.15, 0.6, 0.03]) slider_m1 Slider(ax_m1, 上球质量, 0.1, 5.0, valinit1.0) slider_m2 Slider(ax_m2, 下球质量, 0.1, 5.0, valinit1.0) def update(val): m1 slider_m1.val m2 slider_m2.val params (1.0, 1.0, m1, m2) solution odeint(double_pendulum_eq, initial_state, t, argsparams) theta1, theta2 solution[:,0], solution[:,2] x1 L1 * np.sin(theta1) y1 -L1 * np.cos(theta1) x2 x1 L2 * np.sin(theta2) y2 y1 - L2 * np.cos(theta2) line.set_data([0, x1[frame], x2[frame]], [0, y1[frame], y2[frame]]) fig.canvas.draw_idle() slider_m1.on_changed(update) slider_m2.on_changed(update)在实际教学中我发现学生最惊讶的时刻是当他们看到几乎相同的初始条件如何导致完全不同的运动轨迹。有一次一个学生将初始角度从3.14调整为3.15结果系统行为从规律摆动变成了完全混沌的状态——这种直观的演示比任何理论解释都更有说服力。

相关文章:

用Python的Matplotlib和SciPy,5分钟搞定一个会动的双摆模拟动画

用Python打造会跳舞的双摆:5分钟实现物理动画可视化 看着屏幕上两个相互追逐的小球划出优美的混沌轨迹,仿佛在跳一支神秘的华尔兹——这就是双摆的魅力。作为经典混沌系统之一,双摆的运动轨迹既优雅又难以预测,是物理模拟的绝佳案…...

手把手教你排查ROS Noetic下的TF_REPEATED_DATA警告:从roswtf工具到源码定位

深度解析ROS Noetic中TF_REPEATED_DATA警告的排查与修复 当你在Ubuntu 20.04上运行ROS Noetic时,突然发现终端不断刷出"TF_REPEATED_DATA ignoring data with redundant timestamp for frame"的警告信息,同时Rviz中的机器人模型出现异常抖动—…...

3分钟解锁网盘下载自由:这款开源工具如何让你告别限速烦恼

3分钟解锁网盘下载自由:这款开源工具如何让你告别限速烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...

别再只用欧氏距离了!用Python手写曼哈顿距离,搞定KNN和K-Means中的特征选择

实战指南:用曼哈顿距离优化KNN与K-Means的特征选择 当我们在处理一个房价预测项目时,发现数据中存在大量异常值和不同量纲的特征。使用传统的欧氏距离计算相似度时,模型表现总是不尽如人意。这时,曼哈顿距离(Manhattan…...

从MATLAB仿真到Simulink实战:如何用PCM+2PSK搭建一个简易的语音通信系统模型

从MATLAB仿真到Simulink实战:构建PCM2PSK语音通信系统全链路模型 在数字通信系统的学习过程中,许多工程师都会遇到一个共同困境:虽然能够理解单个模块的原理,却难以将这些模块串联成一个完整的通信链路。本文将带您跨越理论与实践…...

从官方Demo工程到实际项目:手把手教你如何安全地‘魔改’FreeRTOS配置(避坑configUSE_TICK_HOOK)

从官方Demo工程到实际项目:手把手教你如何安全地‘魔改’FreeRTOS配置(避坑configUSE_TICK_HOOK) 当你第一次拿到FreeRTOS官方Demo工程时,那种感觉就像获得了一个功能齐全的"瑞士军刀"——它展示了各种RTOS特性的使用方…...

WeChatMsg终极指南:3步轻松导出微信聊天记录并生成年度报告

WeChatMsg终极指南:3步轻松导出微信聊天记录并生成年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/…...

DeepLabV3+特征融合实战:为什么浅层特征对边缘分割这么重要?

DeepLabV3特征融合实战:浅层特征如何成为边缘分割的胜负手 当你在人像分割任务中发现发丝边缘总是模糊不清,或在道路分割项目中遇到路沿识别精度不足时,问题的根源往往不在于模型的整体架构,而在于那些容易被忽视的浅层特征。Dee…...

别再手动拼接字符串了!Spring AI PromptTemplate实战:5分钟搞定电商客服对话模板

电商客服对话模板革命:Spring AI PromptTemplate高效实践指南 电商客服系统每天需要处理海量的用户咨询,从订单查询到商品退换货,再到物流追踪和支付问题。传统基于字符串拼接的对话模板开发方式,不仅效率低下,而且难以…...

3步掌握LRCGet:智能歌词批量下载与管理终极指南

3步掌握LRCGet:智能歌词批量下载与管理终极指南 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget LRCGet是一款专为音乐爱好者打造的智能LRC同…...

RS485组网避坑指南:从1200米距离到32个节点,你的布线、匹配和程序延时都做对了吗?

RS485组网实战:破解长距离多节点通信的7大技术难题 在工业自动化现场调试RS485网络时,工程师们常常会遇到这样的场景:明明按照手册接好了终端电阻,线缆也符合规范,但通信就是时断时续。某个角落的传感器偶尔会"失…...

如何实现网盘直链解析工具的高速下载:5个实用技巧

如何实现网盘直链解析工具的高速下载:5个实用技巧 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

Kettle连接数据库的两种方式详解:Generic Database vs JNDI,我该选哪个?

Kettle数据库连接方案深度对比:Generic Database与JNDI的架构抉择 当我们在企业级ETL流程中部署Kettle(现称Pentaho Data Integration)时,数据库连接方式的选择往往决定了整个数据管道的可维护性和安全性。Generic Database和JNDI…...

身份认证与授权架构设计

系列导读:本篇将深入讲解身份认证与授权的架构设计与实现方案。 文章目录目录一、认证授权概述1.1 核心概念1.2 认证方式对比二、认证方案2.1 JWT 认证2.2 OAuth2 认证流程三、授权模型3.1 RBAC 模型3.2 权限设计3.3 权限校验四、单点登录4.1 SSO 架构4.2 CAS 实现总…...

OpenWRT防火墙规则深度解析:手把手带你读懂Wifidog认证背后的iptables魔法

OpenWRT防火墙规则深度解析:手把手带你读懂Wifidog认证背后的iptables魔法 当你调试OpenWRT上的Wifidog认证系统时,是否遇到过这些情况:设备连接WiFi后浏览器死活不弹认证页面,或者明明显示认证成功却依然无法上网?这些…...

YOLOv8进阶:全局多头自注意力MHSA融合实战,性能超越主流注意力机制

1. 为什么需要全局多头自注意力机制 在目标检测任务中,小目标检测和复杂背景下的识别一直是难点问题。传统的卷积神经网络(CNN)由于感受野有限,难以捕捉长距离依赖关系。我曾在实际项目中遇到过这样的情况:在无人机航拍图像中,那些…...

数据安全与加密方案

系列导读:本篇将深入讲解数据安全与加密的核心方案与最佳实践。 文章目录目录一、数据安全概述1.1 数据安全三要素1.2 数据分类二、加密算法2.1 对称加密2.2 非对称加密2.3 哈希算法三、数据脱敏3.1 脱敏规则3.2 脱敏实现3.3 注解脱敏四、密钥管理4.1 密钥管理方案4…...

别再死记硬背了!手把手带你用UVM实战AHB2APB Bridge验证(附完整代码与面试高频题解析)

从零构建AHB2APB桥验证环境:UVM实战指南与面试突破 验证工程师的成长路径上,总有几个关键项目会成为职业能力的试金石,AHB2APB桥验证正是这样一个兼具基础性与深度的经典案例。许多初学者在观看教学视频后会产生"已经掌握"的错觉&…...

三步搞定阿里云三要素校验:从零封装一个安全高效的Java工具类

1. 为什么需要封装三要素校验工具类 在金融支付、电商实名认证等业务场景中,三要素校验(姓名身份证号手机号)是最基础的安全防线。但每次直接调用阿里云原生接口会遇到几个典型问题: 第一是参数处理繁琐。比如手机号加密要自己实…...

AMD硬件调试终极指南:使用SMUDebugTool实现性能调优

AMD硬件调试终极指南:使用SMUDebugTool实现性能调优 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…...

深度学习框架使用 YOLOv8 进行训练无人机视角的可见光-红外火点和烟雾检测数据集红外可见光配对 双模态输入(多模态)无人机红外可见光火灾烟雾数据集的训练评估及推理

使用 YOLOv8 进行训练无人机视角的可见光-红外配对火点和烟雾检测数据集 双模态输入(多模态)无人机红外可见光火灾烟雾数据集的训练评估及推理 以下文字及代码可供参考。仅供参考。 文章目录**1. 环境搭建****2. 数据准备****2.1 数据格式转换&#xff0…...

生物医学数据分析终极指南:UK Biobank RAP平台完全攻略

生物医学数据分析终极指南:UK Biobank RAP平台完全攻略 【免费下载链接】UKB_RAP Access share reviewed code & Jupyter Notebooks for use on the UK Biobank (UKBB) Research Application Platform. Includes resources from DNAnexus webinars, online trai…...

AI写专著实用指南:AI专著生成工具助力,打造20万字精品专著!

对于学术研究者来说,写作一本学术专著并不是一瞬间的灵感,而是一场漫长的“战斗”。从一开始的选题到构建合理的框架,再到逐字逐句的内容填充和引用文献的核对,每个环节都面临重重挑战。研究者不仅要在忙碌的教学和科研工作中挤出…...

Python实战:基于主流卷积神经网络架构的智能垃圾分类系统性能对比与选型指南

1. 智能垃圾分类系统的技术背景与挑战 垃圾分类作为城市管理的重要环节,传统依赖人工分拣的方式效率低下且成本高昂。我在实际项目中测试过,一个熟练工人每小时最多只能处理200-300件垃圾,而基于深度学习的自动化系统可以轻松达到每秒数十张图…...

AI专著生成全攻略:利用AI写专著,3天完成20万字高品质专著!

对于许多学术研究者来说,撰写专著最大的挑战,往往是“有限的时间”与“无限的期待”之间的不平衡 编写一本专著通常需要消耗3到5年,甚至更长的时间,而研究者们还要兼顾教学、科研项目以及学术沟通等多方面的职责,能够…...

从平衡车到竞速车:串级PID如何一步步升级?聊聊我加‘角加速度环’的翻车经历

从平衡车到竞速车:串级PID如何一步步升级?聊聊我加‘角加速度环’的翻车经历 平衡车从实验室走向赛道的过程中,控制算法的复杂度往往呈指数级增长。作为一名嵌入式开发者,我曾天真地认为只要不断增加PID控制环的数量,就…...

打造你的专属Web端粒子艺术工坊:手势交互、音频响应与30种几何形态切换

打造你的专属Web端粒子艺术工坊:手势交互、音频响应与30种几何形态切换 在数字艺术与创意编程的交汇处,一个全新的可能性正在被打开——通过现代Web技术,任何人都能在浏览器中构建属于自己的沉浸式粒子艺术空间。这不再仅仅是专业开发者的专利…...

别再只盯着CPU%了!htop里VIRT、RES、SHR内存三兄弟,到底哪个数字才该让你紧张?

别再只盯着CPU%了!htop里VIRT、RES、SHR内存三兄弟,到底哪个数字才该让你紧张? 当服务器突然发出内存告警,大多数工程师的第一反应是打开htop,然后盯着MEM%那一栏开始"抓凶手"。但很快你会发现,有…...

LabVIEW中PID控制的进阶策略:从增益调度到前馈补偿

1. 从基础到进阶:PID控制在LabVIEW中的演变 第一次接触PID控制是在大学实验室里,当时用LabVIEW做一个简单的恒温箱控制。那会儿觉得PID就是个"调三个参数"的数学游戏,直到在实际项目中遇到温度剧烈波动、响应滞后等问题&#xff0c…...

python游戏开发和设计学习总结

在本次 Python 课程中,我们主要学习了弹球游戏和飞机大战两款小游戏的开发与设计,借助 pygame 库完成代码编写、功能设计与调试,从基础小游戏入手,逐步了解 2D 游戏的开发流程,收获了很多编程与游戏设计的知识。 一、…...