matlab模拟小球平抛


课题作业 模拟小球平抛运动过程:考虑惯性、旋转和地面碰撞

在这篇文章中,我们将通过 MATLAB 仿真来模拟小球的平抛运动。在这个模拟中,我们考虑了小球的惯性、旋转以及与地面的碰撞,展示了小球在能量逐渐损耗、停止弹跳和滚动之前的完整运动过程。通过这个项目,我们不仅可以观察到小球平抛运动的实际轨迹,还可以了解重力、摩擦力以及碰撞如何影响物体的运动状态。


仿真思路

首先,为了准确模拟小球的运动,我们需要考虑以下几点物理因素:

  1. 重力作用:小球受重力影响,使其在垂直方向不断加速。
  2. 能量损耗:小球每次与地面碰撞都会损失部分能量。用恢复系数 e 来控制每次碰撞后的能量保留。
  3. 摩擦力:小球与地面接触时会受到摩擦力的影响,进而导致水平速度和角速度的改变。摩擦系数 mu 控制摩擦力的大小。
  4. 运动终止条件:当小球的垂直速度和水平速度低于一定阈值时,认为小球已不再弹跳和滚动。

我们在仿真过程中创建动画,并将整个动画保存为视频文件,以便观察小球运动的完整过程。

代码解析

以下是代码的结构与关键部分解析:

1. 基础参数设置

首先,我们定义了一些基础参数,例如小球的初始位置 (x0, y0)、初速度 (vx0, vy0)、重力加速度 g、时间步长 dt、恢复系数 e、摩擦系数 mu 等。此外,小球的质量和转动惯量 I 也在这里定义:

x0 = 0;       % 初始水平位置
y0 = 10;      % 初始垂直位置(高度)
vx0 = 5;      % 初始水平速度
vy0 = 0;      % 初始垂直速度
g = -9.81;    % 重力加速度
dt = 0.01;    % 时间步长
e = 0.8;      % 恢复系数
mu = 0.1;     % 摩擦系数
radius = 0.2; % 小球半径
mass = 0.5;   % 小球质量
I = (2/5)*mass*radius^2; % 转动惯量

这些参数决定了小球的初始运动状态以及它在运动中如何受到各种力的影响。

2. 初始化动画

接下来,我们创建了一个全屏窗口,用于绘制小球的运动轨迹。小球的当前位置以红色圆点显示,轨迹以蓝色线条展示。此外,代码设置了坐标轴的范围和标签,方便我们实时观察小球的位置。

figure('Position', get(0, 'ScreenSize'));
hold on;
grid on;
xlabel('水平位置 (m)');
ylabel('垂直位置 (m)');
title('考虑惯性的小球平抛运动模拟(含能量损失)');
3. 仿真循环

仿真主循环中,小球的运动不断更新,主要过程包括以下几部分:

  • 更新速度和位置:在每个时间步 dt 内,垂直方向速度 vy 受重力加速度影响,水平和垂直位置 (x, y) 更新。

  • 碰撞检测和摩擦力处理:当小球与地面接触(y <= radius)时,会发生碰撞。在碰撞过程中,小球垂直速度反向并考虑能量损失。摩擦力作用在水平速度和角速度上,使小球在地面上逐渐减速。

  • 终止条件判断:如果垂直速度低于某个阈值,则认为小球停止弹跳;如果水平速度也足够小,认为小球停止滚动,结束仿真。

while true% 更新速度和位置vy = vy + g * dt;x = x + vx * dt;y = y + vy * dt;% 碰撞检测if y <= radiusy = radius;vy = -e * vy;% 摩擦力引起的速度和角速度变化Fn = mass * abs(g);Ff = mu * Fn;dv = (Ff / mass) * dt;domega = (Ff * radius / I) * dt;if vx > 0vx = vx - dv;omega = omega + domega;elseif vx < 0vx = vx + dv;omega = omega - domega;end% 停止弹跳与滚动判断if abs(vy) < threshold_vy && abs(vx) < threshold_vxbreak;endend
end
4. 动态绘图与视频保存

在每个时间步中,我们实时更新小球的当前位置和轨迹,使用 getframe 捕获当前帧,将其写入视频文件。仿真结束后,关闭视频对象。

% 更新动画
set(ball, 'XData', x, 'YData', y);
set(trajectory, 'XData', X, 'YData', Y);
frame = getframe(gcf);
writeVideo(video, frame);
5. 结束仿真

当小球的垂直和水平速度都低于设定的阈值时,仿真终止。最终轨迹绘制完成,并保存视频供后续观看。

% 关闭视频对象
close(video);
plot(X, Y, 'LineWidth', 2);

运行效果

运行代码后,我们可以观察到一个完整的模拟小球平抛运动的动画,展示了小球如何在重力、惯性和摩擦力的共同作用下逐渐减速直至停止。

总结

通过这个仿真项目,我们更好地理解了力学中的碰撞、摩擦等物理因素对物体运动的影响。同时,MATLAB 的图形和动画功能让我们能够更加直观地观察运动过程,为物理学习和仿真分析提供了便利。

完整代码

% 需求:模拟小球平抛运动过程,考虑惯性、旋转和与地面的碰撞,直到能量足够少弹不起来为止,用动画形式展示
% TODO:调整动画窗口和坐标轴以完整显示动画,并将动画保存为视频% 基础参数设置
x0 = 0;          % 初始水平位置
y0 = 10;         % 初始垂直位置(高度)
vx0 = 5;         % 初始水平速度
vy0 = 0;         % 初始垂直速度
g = -9.81;       % 重力加速度,单位:m/s^2
dt = 0.01;       % 时间步长,单位:秒
e = 0.8;         % 恢复系数(每次碰撞后的能量保留比例)
mu = 0.1;        % 地面与小球之间的摩擦系数
radius = 0.2;    % 小球半径,单位:米
mass = 0.5;      % 小球质量,单位:kg
I = (2/5)*mass*radius^2; % 小球的转动惯量threshold_vy = 0.1; % 判定小球停止弹跳的垂直速度阈值
threshold_vx = 0.01; % 判定小球停止滚动的水平速度阈值% 初始化变量
x = x0;
y = y0;
vx = vx0;
vy = vy0;
omega = 0;       % 初始角速度
t = 0;% 用于存储轨迹数据
X = [];
Y = [];% 设置动画
figure('Position', get(0, 'ScreenSize')); % 将窗口设置为全屏
hold on;
grid on;
xlabel('水平位置 (m)');
ylabel('垂直位置 (m)');
title('考虑惯性的小球平抛运动模拟(含能量损失)');ball = plot(x, y, 'ro', 'MarkerSize', 15, 'MarkerFaceColor', 'r'); % 小球
trajectory = plot(NaN, NaN, 'b'); % 轨迹% 初始化坐标轴范围
axis([x0-1 x0+10 0 y0+5]);% 调整画面显示
set(gca, 'FontSize', 14); % 增大坐标轴字体% 创建视频对象
video_filename = 'ball_motion.mp4'; % 视频文件名
video = VideoWriter(video_filename, 'MPEG-4');
video.FrameRate = 1/dt; % 设置帧率,与模拟时间步长匹配
open(video);% 仿真循环
while true% 更新速度vy = vy + g * dt;% 更新位置x = x + vx * dt;y = y + vy * dt;% 存储数据X(end+1) = x;Y(end+1) = y;% 碰撞检测if y <= radius  % 考虑小球的半径y = radius;           % 确保小球不穿过地面vy = -e * vy;         % 垂直速度反向并考虑能量损失% 计算由于摩擦导致的水平速度变化和角速度变化Fn = mass * abs(g);   % 法向力Ff = mu * Fn;         % 摩擦力dv = (Ff / mass) * dt;     % 水平速度的变化量domega = (Ff * radius / I) * dt; % 角速度的变化量% 更新水平速度和角速度if vx > 0vx = vx - dv;omega = omega + domega;if vx < 0vx = 0;endelseif vx < 0vx = vx + dv;omega = omega - domega;if vx > 0vx = 0;endend% 判断是否停止弹跳if abs(vy) < threshold_vyvy = 0;% 检查是否需要继续滚动if abs(vx) < threshold_vxbreak; % 水平速度过小,结束仿真endendend% 当小球在地面上滚动时,考虑摩擦力减速if y == radius && vy == 0Fn = mass * abs(g);   % 法向力Ff = mu * Fn;         % 摩擦力dv = (Ff / mass) * dt;     % 水平速度的变化量domega = (Ff * radius / I) * dt; % 角速度的变化量% 更新水平速度和角速度if vx > 0vx = vx - dv;omega = omega + domega;if vx < 0vx = 0;endelseif vx < 0vx = vx + dv;omega = omega - domega;if vx > 0vx = 0;endend% 判断是否停止滚动if abs(vx) < threshold_vxbreak; % 水平速度过小,结束仿真endend% 更新动画set(ball, 'XData', x, 'YData', y);set(trajectory, 'XData', X, 'YData', Y);% 动态调整坐标轴范围axis([min(X)-1 max(X)+1 0 y0+5]);drawnow;% 捕获当前帧并写入视频frame = getframe(gcf);writeVideo(video, frame);% 更新时间t = t + dt;
end% 关闭视频对象
close(video);% 最后绘制完整轨迹
plot(X, Y, 'LineWidth', 2);

ball_motion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8300.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (二)

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 &#xff08;二&#xff09; 一、前言 目前鸿蒙应用的实现逻辑&#xff0c;基本都是参考和移植Android端来实现。针对BLE低功耗蓝牙来说&#xff0c;在鸿蒙化的实现过程中。我们发现了&#xff0c;鸿蒙独有的优秀点&#xff0c…

基于STM32的数字温度计教学

引言 数字温度计是许多电子项目中的常见应用&#xff0c;它可以实时监测周围环境的温度并显示。利用STM32微控制器实现数字温度计&#xff0c;可以帮助我们了解如何使用传感器进行模拟信号转换及数据传输。本教程将指导您使用STM32和DS18B20数字温度传感器实现一个简单的数字温…

go mod 依赖管理

什么是go mod go mod 是从 Go 1.11 版本开始引入的。Go Modules 是 Go 语言官方提供的一个版本管理工具&#xff0c;旨在解决依赖管理和版本控制的问题。从 Go 1.11 开始&#xff0c;Go Modules 被作为实验性功能引入&#xff0c;到了 Go 1.13 版本&#xff0c;Go Modules 成为…

洛谷解题日记||基础篇2

题目链接 0 剪刀&#xff0c;1 石头&#xff0c;2 布&#xff0c;3 蜥蜴人&#xff0c;4 斯波克我们可以根据题意&#xff0c;构建一个二维矩阵 result[5][5] 来表示每一种出拳的胜负情况。 #include <iostream> #include <vector> using namespace std;int m…

年会必备的抽奖小程序!

感觉一年一度的年会快来了&#xff0c;准备个小的抽奖小程序蛮陶冶情操的&#xff01; 正好今天有空整了一个&#xff0c;简单&#xff0c;简洁&#xff01;&#xff0c;大家也可以玩起来&#xff01; 技术栈&#xff1a; Flask 试玩的链接在这里,有意思的话也可以部署到自己的…

sqoop Oracle 导入到hive 日期时间消失

sqoop脚本&#xff1a; sqoop import -D mapred.job.queue.namehighway \ -D mapreduce.map.memory.mb4096 \ -D mapreduce.map.java.opts-Xmx3072m \ --connect "jdbc:oracle:thin://localhost:61521/LZY2" \ --username LZSHARE \ --password 123456 \ --query &q…

20241108通过iperf3确认中科创达的高通CM6125的WIFI的网速【失败】

20241108通过iperf3确认中科创达的高通CM6125的WIFI的网速【失败】 2024/11/8 15:43 由于以太网不能用&#xff0c;那就测试一下WIFI&#xff0c;iperf3链接/测试异常。 一般认为可能的原因有&#xff1a; 1、CM6125开发板的WIFI不带天线&#xff0c;影响性能。 2、CM6125的And…

Vue项目中点击按钮后浏览器屏幕变黑,再次点击恢复的解决方法

情况说明 点击按钮后出现以下情况&#xff0c;浏览器屏幕变暗&#xff0c;再次点击则恢复正常。 解决方法&#xff1a; 找到你的全局样式文件&#xff0c;我的是gloable.css&#xff0c;添加以下代码&#xff1a; .v-modal {display: none; }重启服务器即可解决。

05栈和队列/代码随想录

六、栈和队列 6.1数据结构的应用 用栈实现队列 力扣232 很简单&#xff0c;添加的时候正常加在弹入栈&#xff0c;删除的时候把元素放到弹出栈&#xff0c;直接调用java集合实现的Stack class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackout;public M…

51c大模型~合集18

我自己的原文哦~ https://blog.51cto.com/whaosoft/11621494 #SpatialBot 空间大模型&#xff1a;上交、斯坦福、智源、北大、牛津、东大联合推出&#xff01; 大模型走向空间智能、具身智能之路&#xff01; 智源&#xff0c;斯坦福&#xff0c;北大&#xff0c;牛津&…

国外白帽故事 | 攻破大学数据库系统,暴露数千学生记录

引言 在这篇文章中&#xff0c;我将分享我是如何攻破一个大型大学解决方案门户服务器的&#xff0c;这个服务器服务于许多大学客户&#xff0c;并且涉及数千名学生的数据。 目标 这是一个由印度许多大学和学院使用的门户网站&#xff0c;用于管理学生记录、成绩单、出勤记录…

苍穹外卖05-Redis相关知识点

目录 什么是Redis&#xff1f; redis中的一些常用指令 value的5种常用数据类型 各种数据类型的特点 Redis中数据操作的常用命令 字符串类型常用命令&#xff1a; 哈希类型常用命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis 环境…

【MySQL】数据的增删查改

文章目录 1. 插入数据(Create)1.1 全列插入1.2 指定列插入1.3 多行数据插入1.4 插入否则更新1.5 替换 2. 读取数据(Retrieve)2.1 select列2.2 where条件2.3 结果排序2.4 筛选分页结果 3. 修改数据(Update)4. 删除数据(delete)4.1 删除数据4.2 截断表 5. 插入查询的结果6. 分组与…

【案例分享】借助 iSpring,创造客户真正欣赏的专业在线培训体验

Safety Bee Training是一家领先的认证在线学习提供商&#xff0c;专门提供职业健康、安全和环境项目。它也是中东和亚洲唯一一家提供经 NASP 等国际认证机构认可的课程的培训提供商。它已经培训了超过 28,000 名学习者&#xff0c;并且正在不断扩大其课程范围&#xff0c;以提供…

【连续多届检索,ACM出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 会议官网&#xff1a;www.icbar.net 2024 4th International Conference on Big Data, Artificial I…

界面设计软件:10款设计师必备工具

UI界面设计软件是设计师们不可或缺的工具&#xff0c;它们提供了一系列功能和直观的操作界面&#xff0c;助力设计师迅速打造精美且用户友好的界面。面对众多UI设计软件&#xff0c;有的提供预设模板和图标库&#xff0c;有的更侧重于原型和交互设计。如何选择最适合自己的UI设…

TCP(上):成熟可靠的传输层协议

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP&#xff08;传输控制协议&#xff09;是位于传输层的通信协议&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。主要负责在不可靠的网络环境中提供可靠的端到端字节流传输服务。TCP是…

如何在Windows中检查是否安装了GPU

文章目录 1. 系统设备管理器1.1 打开设备管理器1.2 查找显示适配器 2. 命令行工具2.1 打开命令提示符2.2 执行WMIC命令 3. DirectX诊断工具3.1 运行DirectX诊断工具3.2 查看显示信息 在Windows操作系统中&#xff0c;了解您的电脑是否配备了图形处理单元&#xff08;GPU&#x…

网络技术----wireshark抓包出现1500以上的大包原因分析

网络技术----wireshark抓包出现1500以上的大包原因分析 背景描述原因分析TSO&#xff08;TCP segment offload&#xff0c;TSO&#xff09;linux中关闭/开启TSO功能&#xff1a;其他类似TSO的机制 wireshark抓包来源 背景描述 我们在使用抓包工具的过程中&#xff0c;经常发现…

3.3 软件需求:面对对象分析模型

面对对象分析模型 1、对象2、面对对象的软件开发模型3、用例图建模基础3.1 用例图基本符号参与者用例系统执行关联 3.2 用例建模过程3.3 用例图初步3.4 用例图进阶关联Association泛化Inheritance包含Include扩展Extend示例 1、对象 在现实世界中有意义的&#xff0c;与所要解…