MATLAB - 仿真单摆的周期性摆动

系列文章目录

 


前言

本例演示如何使用 Symbolic Math Toolbox™ 模拟单摆的运动。推导摆的运动方程,然后对小角度进行分析求解,对任意角度进行数值求解。

a63818f5d19e454581544d5694154996.png


 

一、步骤 1:推导运动方程

摆是一个遵循微分方程的简单机械系统。摆最初静止在垂直位置。当摆移动一个角度 θ 并释放时,重力将其拉回静止位置。它的动量会使它过冲并到达 -θ 角(如果没有摩擦力),以此类推。由于重力的作用,钟摆运动的恢复力为 -mgsinθ。因此,根据牛顿第二定律,质量乘以加速度必须等于 -mgsinθ。

syms m a g theta(t)
eqn = m*a == -m*g*sin(theta)
eqn(t) = a m=−g m sin(θ(t))

对于长度为 r 的摆锤,摆锤的加速度等于角加速度乘以 r。

eq?a%3Dr%5Cfrac%7Bd%5E2%5Ctheta%7D%7Bdt%5E2%7D.

用子项代替 a。 

syms r
eqn = subs(eqn,a,r*diff(theta,2))

 eq?%5Cbegin%7Baligned%7Deqn%28t%29%26%3D%5C%5Cmr%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%26%5Ctheta%28t%29%3D-gm%5Csin%28%5Ctheta%28t%29%29%5Cend%7Baligned%7D

使用 isolate 隔离公式中的角加速度。

eqn = isolate(eqn,diff(theta,2))

eq?%5Cbegin%7Baligned%7D%5Ctext%7Beqn%20%3D%7D%20%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%5Cleft.%5Ctheta%28t%29%3D-%5Cfrac%7Bg%5Csin%28%5Ctheta%28t%29%29%7Dr%5Cright.%5Cend%7Baligned%7D

将常数 g 和 r 合并为一个参数,也称为固有频率。

eq?%5Comega_0%3D%5Csqrt%7B%5Cdfrac%7Bg%7D%7Br%7D%7D.

syms omega_0
eqn = subs(eqn,g/r,omega_0^2)

eq?%5Cbegin%7Baligned%7D%5Ctext%7Beqn%20%3D%7D%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%5Ctheta%28t%29%3D-%5Comega_0%5E2%5Csin%28%5Ctheta%28t%29%29%5Cend%7Baligned%7D

二、步骤 2:运动方程线性化

运动方程是非线性的,因此难以用解析法求解。假设角度很小,利用 sinθ 的泰勒展开式将方程线性化。 

syms x
approx = taylor(sin(x),x,'Order',2);
approx = subs(approx,x,theta(t))

eq?approx%20%3D%20%5Ctheta%28t%29

运动方程变成了线性方程。

eqnLinear = subs(eqn,sin(theta(t)),approx)

eq?%5Cbegin%7Baligned%7D%5Ctext%7BeqnLinear%7D%26%3D%5C%5C%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20t%5E2%7D%5Ctheta%28t%29%26%3D-%5Comega_0%5E2%5Ctheta%28t%29%5Cend%7Baligned%7D

三、步骤 3:分析求解运动方程

使用 dsolve 求解方程 eqnLinear。将初始条件指定为第二个参数。使用 assume 假设 ω0 为实数,简化解法。

syms theta_0 theta_t0
theta_t = diff(theta);
cond = [theta(0) == theta_0, theta_t(0) == theta_t0];
assume(omega_0,'real')
thetaSol(t) = dsolve(eqnLinear,cond)

eq?%5Cbegin%7Baligned%7D%5Ctext%7Bthetasol%28t%29%7D%26%3D%5Ctheta_0%5Ccos%28%5Comega_0t%29+%5Cfrac%7B%5Ctheta_%7Bt0%7D%5Csin%28%5Comega_0t%29%7D%7B%5Comega_0%7D%5Cend%7Baligned%7D

四、步骤 4:ω0 的物理意义

项 ω 0 t 称为相位。余弦函数和正弦函数每 2π 重复一次。改变 ω 0 t 变化 2π 所需的时间称为时间周期。

eq?T%3D%5Cdfrac%7B2%5Cpi%7D%7B%5Comega0%7D%3D2%5Cpi%5Csqrt%7B%5Cdfrac%7Br%7D%7Bg%7D%7D.

时间周期 T 与摆长的平方根成正比,与质量无关。对于线性运动方程,时间周期与初始条件无关。

五、步骤 5:绘制摆的运动图

绘制小角度近似的摆运动图。

定义物理参数:

  • 重力加速度 s%7D%5E%7B2%7D
  • 摆长 eq?%5Ctext%7Br%3D1%20m%7D

 

gValue = 9.81;
rValue = 1;
omega_0Value = sqrt(gValue/rValue);
T = 2*pi/omega_0Value;

设置初始条件。

theta_0Value  = 0.1*pi; % Solution only valid for small angles.
theta_t0Value = 0;      % Initially at rest.

 将物理参数和初始条件代入一般解法。

vars   = [omega_0      theta_0      theta_t0];
values = [omega_0Value theta_0Value theta_t0Value];
thetaSolPlot = subs(thetaSol,vars,values);

 绘制谐摆运动图。

fplot(thetaSolPlot(t*T)/pi, [0 5]);
grid on;
title('Harmonic Pendulum Motion');
xlabel('t/T');
ylabel('\theta/\pi');

8eb90a748ded400aa701f5e81c3b2531.png

求出 θ(t) 的解后,想象一下摆的运动。 

x_pos = sin(thetaSolPlot);
y_pos = -cos(thetaSolPlot);
fanimator(@fplot,x_pos,y_pos,'ko','MarkerFaceColor','k','AnimationRange',[0 5*T]);
hold on;
fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'),'AnimationRange',[0 5*T]);
fanimator(@(t) text(-0.3,0.3,"Timer: "+num2str(t,2)+" s"),'AnimationRange',[0 5*T]);

f7032f03593c4a37b21f75d0d7abdedd.png

输入 playAnimation 命令播放钟摆运动的动画。 

6c850fe8dde34909aa426df85a494e71.gif

六、步骤 6:使用恒定能量路径确定非线性摆运动

为了理解摆的非线性运动,请使用总能量方程来直观显示摆的运动轨迹。总能量是守恒的。

eq?E%3D%5Cdfrac12mr%5E2%7B%5Cleft%28%5Cdfrac%7Bd%5Ctheta%7D%7Bdt%7D%5Cright%29%7D%5E2+mgr%281-%5Ccos%5Ctheta%29 

使用三角函数特性 2%29 和关系式 r%7D 重写比例能量。

eq?%5Cdfrac%20E%7Bmr%5E2%7D%3D%5Cdfrac12%5Cleft%5B%5Cleft%28%5Cdfrac%7Bd%5Ctheta%7D%7Bdt%7D%5Cright%29%5E2+%5Cleft%282%5Comega_0%5Csin%5Cdfrac%5Ctheta2%5Cright%29%5E2%5Cright%5D 

由于能量守恒,摆的运动可以用相空间中的恒定能量路径来描述。相空间是一个抽象空间,坐标为 θ 和 dθ/dt。使用 fcontour 将这些路径可视化。

syms theta theta_t omega_0
E(theta, theta_t, omega_0) = (1/2)*(theta_t^2+(2*omega_0*sin(theta/2))^2);
Eplot(theta, theta_t) = subs(E,omega_0,omega_0Value);figure;
fc = fcontour(Eplot(pi*theta, 2*omega_0Value*theta_t), 2*[-1 1 -1 1], ...'LineWidth', 2, 'LevelList', 0:5:50, 'MeshDensity', 1+2^8);
grid on;
title('Constant Energy Contours in Phase Space ( \theta vs. \theta_t )');
xlabel('\theta/\pi');
ylabel('\theta_t/2\omega_0');

1ca04c2158374f96a101b5ad1e0aed66.png

恒定能量等值线围绕 θ 轴和 dθ/dt 轴对称,沿 θ 轴呈周期性分布。图中显示了两个行为截然不同的区域。

等值线图的较低能量相互靠近。摆锤在两个最大角度和速度之间来回摆动。摆锤的动能不足以克服重力能,使摆锤绕一圈。

afd1ca0e5c744a12bc95dbc61e07a2fe.gif

等值线图中的高能量不会自行闭合。摆锤始终沿着一个角度方向运动。钟摆的动能足以克服重力能,使钟摆能够绕一圈。 

78b67ff177b24fb4a1a4ecf0e2c34c86.gif

七、步骤 7:求解非线性运动方程

非线性运动方程是二阶微分方程。使用 ode45 求解器对这些方程进行数值求解。由于 ode45 只接受一阶系统,因此请将系统简化为一阶系统。然后生成函数句柄,作为 ode45 的输入。

将二阶 ODE 重写为一阶 ODE 系统。

syms theta(t) theta_t(t) omega_0
eqs = [diff(theta)   == theta_t;diff(theta_t) == -omega_0^2*sin(theta)]

 eq?%5Cleft.%5Ctext%7Beqs%7D%28t%29%3D%5C%5C%5Cleft%28%5Cbegin%7Baligned%7D%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20t%7D%26%5Ctheta%28t%29%3D%5Ctheta_t%28t%29%5C%5C%5C%5C%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20t%7D%26%5Ctheta_t%28t%29%3D-%5Comega_0%5E2%5Csin%28%5Ctheta%28t%29%29%5Cend%7Baligned%7D%5Cright.%5Cright%29

eqs  = subs(eqs,omega_0,omega_0Value);
vars = [theta, theta_t];

 求出系统的质量矩阵 M 和方程 F 的右边。

[M,F] = massMatrixForm(eqs,vars)

 eq?%5Cbegin%7Barray%7D%7Brcl%7D%5Ctext%7BM%7D%26%3D%26%5C%5C%26%26%5Cbegin%7Bbmatrix%7D1%260%5C%5C0%261%5Cend%7Bbmatrix%7D%5Cend%7Barray%7D

eq?%5Cbegin%7Baligned%7D%7BF%7D%26%3D%5C%5C%26%5Cbegin%7Bbmatrix%7D%5Ctheta_t%28t%29%5C%5C-%5Cdfrac%7B981%5Csin%28%5Ctheta%28t%29%29%7D%7B100%7D%5Cend%7Bbmatrix%7D%5Cend%7Baligned%7D

M 和 F 指的就是这种形式。

eq?M%28t%2Cx%28t%29%29%5Cdfrac%7Bdx%7D%7Bdt%7D%3DF%28t%2Cx%28t%29%29. 

为简化进一步计算,可将系统改写为 dt%3Df%28t%2Cx%28t%29%29. 的形式。

f = M\F

 eq?%5Cbegin%7Baligned%7D%5Ctext%7Bf%7D%26%3D%5C%5C%26%5Cbegin%7Bbmatrix%7D%5Ctheta_t%28t%29%5C%5C-%5Cdfrac%7B981%5Csin%28%5Ctheta%28t%29%29%7D%7B100%7D%5Cend%7Bbmatrix%7D%5Cend%7Baligned%7D

使用 odeFunction 将 f 转换为 MATLAB 函数句柄。生成的函数句柄是 MATLAB ODE 求解器 ode45 的输入。 

f = odeFunction(f, vars)
f = function_handle with value:@(t,in2)[in2(2,:);sin(in2(1,:)).*(-9.81e+2./1.0e+2)]

八、步骤 8:求解封闭能量等值线的运动方程

使用 ode45 求解封闭能量等值线的 ODE。

从能量等值线图来看,封闭等值线满足条件 2%5Comega_0%5Cleq1. 将 θ 和 dθ/dt 的初始条件存储在变量 x0 中。

x0 = [0; 1.99*omega_0Value];

指定一个从 0 秒到 10 秒的时间间隔,用于求解。这个时间间隔允许摆锤经历两个完整的周期。

tInit  = 0;
tFinal = 10;

求解 ODE。

sols = ode45(f,[tInit tFinal],x0)
sols = struct with fields:solver: 'ode45'extdata: [1x1 struct]x: [0 3.2241e-05 1.9344e-04 9.9946e-04 0.0050 0.0252 0.1259 0.3449 0.6020 0.8591 1.1161 1.3597 1.5996 1.8995 2.2274 2.4651 2.7028 2.9567 3.2138 3.4709 3.7150 3.9511 4.2483 4.5759 4.8239 5.0719 5.3182 5.5764 5.8346 6.0803 ... ] (1x45 double)y: [2x45 double]stats: [1x1 struct]idata: [1x1 struct]

sols.y(1,:) 表示角位移 θ,sols.y(2,:) 表示角速度 dθ/dt。

绘制闭合路径解。

figure;yyaxis left;
plot(sols.x, sols.y(1,:), '-o');
ylabel('\theta (rad)');yyaxis right;
plot(sols.x, sols.y(2,:), '-o');
ylabel('\theta_t (rad/s)');grid on;
title('Closed Path in Phase Space');
xlabel('t (s)');

80eb2447004a483aa049ee40b70c5470.png

可视化钟摆的运动。 

x_pos = @(t) sin(deval(sols,t,1));
y_pos = @(t) -cos(deval(sols,t,1));
figure;
fanimator(@(t) plot(x_pos(t),y_pos(t),'ko','MarkerFaceColor','k'));
hold on;
fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'));
fanimator(@(t) text(-0.3,1.5,"Timer: "+num2str(t,2)+" s"));

8a541ad36396414ea0d689cffcdbaaf0.png

输入 playAnimation 命令播放钟摆运动的动画。 

e77f57e87f15422cba0dc4c074f3bf33.gif

九、步骤 9:开放式能量等值线的求解

使用 ode45 求解开放式能量等值线的 ODE。从能量等值线图来看,开放式等值线满足条件 2%5Comega_0%3E1.

x0 = [0; 2.01*omega_0Value];
sols = ode45(f, [tInit, tFinal], x0);

绘制开放式能量等值线的解。

figure;yyaxis left;
plot(sols.x, sols.y(1,:), '-o');
ylabel('\theta (rad)');yyaxis right;
plot(sols.x, sols.y(2,:), '-o');
ylabel('\theta_t (rad/s)');grid on;
title('Open Path in Phase Space');
xlabel('t (s)');

a44827106aa74d0895ff9f7a600515cf.png

可视化钟摆的运动。 

x_pos = @(t) sin(deval(sols,t,1));
y_pos = @(t) -cos(deval(sols,t,1));
figure;
fanimator(@(t) plot(x_pos(t),y_pos(t),'ko','MarkerFaceColor','k'));
hold on;
fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'));
fanimator(@(t) text(-0.3,1.5,"Timer: "+num2str(t,2)+" s"));

371c99980bdb4063b3a0eb97ed8bdcc6.png

输入 playAnimation 命令播放钟摆运动的动画。 

1802195a04a1460c9f83e9708914ec06.gif

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿赵UE学习笔记——14、LOD

阿赵UE学习笔记目录   大家好,我是阿赵。   继续学习虚幻引擎的用法。这次看看虚幻引擎的Level Of Detail(LOD)的用法。 一、测试场景准备 用植物系统,在地形上面刷了好多草: 这个时候看一下网格,会发现网格比较多和密集。 …

Leetcode第382场周赛

Leetcode第382场周赛 本人水平有限,只做前三道。 一、按键变更的次数 给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s “ab” 表示按键变更一次,而 s “bBBb”…

tableau绘制雷达图

目标图形: 1. 数据准备 (1)原始数据 你要进行用雷达图比较的对象的各指标的数据。 (2) 处理后数据 在原数据的基础上添加对各指标进行区间的划分数据,也就是层级的划分。 2. 操作步骤 (1)数据转化 转化前&#xf…

Logstash 7.7.1版本安装系统梳理

前言 上一篇文章介绍了 《ElasticSearch7.7.1集群搭建 & Kibana安装》,今天说一下 Logstash的安卓和配置; Logstash是一个开源的数据收集引擎,具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来,并将数据标准化…

idea docker 镜像生成太慢太大问题

文章目录 前言一、更小的jdk基础镜像二、服务瘦包(thin jar)2.1 maven2.2 修改dockerfile2.3 container run options 三、 基础jdk镜像入手?总结 前言 idea docker 内网应用实践遗留问题 idea docker插件 build 服务镜像太慢服务镜像太大 …

补充推导步骤,重写 Matrix Computations 5.1.2 节

本来的内容有点小小的跳跃,补一下跳跃的部分,下次推导时省点时间,备忘 1. 补充后的内容 2. 代码 LaTeX code: \documentclass{article} \title{Matrix Computations 5.1.2 time saving revision} \date{} \begin{document} \mak…

CSRF靶场练习

简述:CSRF漏洞实际很少;条件限制很多;局限性很大;实验仅供参考,熟悉csrf概念和攻击原理即可 Pikachu靶场 CSRF GET 登录用户vince的账户可以看到用户的相关信息; 点击修改个人信息,发现数据包…

[office] excel2010双向条形图制作 #经验分享#微信

excel2010双向条形图制作 本教程为大家介绍一下excel2010中excel2010双向条形图制作方法。 1.选中工作区域 2.点击插入-->图表,选择条形图 3.为美观可将中间竖线可去掉 4.方法是选中竖线,右击-->删除 5.接下来将图例靠上,选中图例,右击-->设置图例格式-->图例选项…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点:不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

【Tomcat与网络8】从源码看Tomcat的层次结构

在前面我们介绍了如何通过源码来启动Tomcat,本文我们就来看一下Tomcat是如何一步步启动的,以及在启动过程中,不同的组件是如何加载的。 一般,我们可以通过 Tomcat 的 /bin 目录下的脚本 startup.sh 来启动 Tomcat,如果…

如何用MapTalks IDE来发布网站?

简介 MapTalks IDE 全称 MapTalks集成设计环境(Integrated Design Environment),是由MapTalks技术团队开发的新一代web地图设计软件。 通过MapTalks IDE,您可以自由的创建二维和三维地图,在其中载入或创建地理数据&a…

计算机语言的发展历史

计算机编程语言的发展,是随着计算机本身硬件发展而发展的。硬件速度越快、体积越小、成本越低,应用到人类社会的场景就会越多,那么所需要的算法就会越复杂,也就要求计算机编程语言越高级。最初重达几十吨但一秒只能运算5000次的EN…

【JavaSE篇】——内部类

目录 🎓内部类 🎈内部类的分类 🚩实例内部类 一.如何实例内部类对象 二.实例内部类中为什么不能有静态成员变量 (用final解决) 三.在实例内部类对象时,如何访问外部类当中相同的成员变量?…

linux中常用的命令

一:tree命令 (码字不易,关注一下吧,w~~w) 以树状形式查看指定目录内容。 tree --树状显示当前目录下的文件信息。 tree 目录 --树状显示指定目录下的文件信息。 注意: tree只能查看目录内容,不能…

基于MongoDB实现聊天记录的存储

一、mongodb简介 1.1 mongodb简介 MongoDB是一个基于分布式文件存储的数据库,使用C语言编写。它旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富、最像关系数据库的。 Mong…

C#用正则表达式判断字符串是否纯数字vs用Char.IsDigit 方法遍历字符数组是否纯数字

目录 一、使用的方法 1.正则表达式 2.Char.IsDigit 方法 二、源码 1.源代码 2.生成效果 一、使用的方法 1.正则表达式 在程序运行过程中,经常需要用户输入数字信息,如输入员工年龄、工资等。使用正则表达式Regex类的IsMatch方法,可以有…

【ASP.NET Core 基础知识】--Web API--创建和配置Web API(一)

一、简介 Web API(Web Application Programming Interface)的重要性在于其在现代软件开发中扮演着关键的角色。以下是一些关于Web API重要性的方面: 跨平台交互: Web API允许不同平台、不同技术栈的应用程序进行通信。无论是Web…

如何本地搭建Emby影音管理服务并结合内网穿透实现远程访问本地影音库

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

负载均衡下的webshell连接

一、环境配置 1.在Ubuntu上配置docker环境 我们选择用Xshell来将环境资源上传到Ubuntu虚拟机上(比较简单) 我们选择在root模式下进行环境配置,先将资源文件复制到root下(如果你一开始就传输到root下就不用理会这个) …

微分几何——梅向明第四版学习笔记(一) 向量函数和曲线论

目录 引出向量函数曲线论简单曲线定义曲线的向量参数表示 曲线的切线【重要】曲线的法面【重要】曲线的自然参数表示 空间曲线曲线的密切平面空间曲线的基本三棱形【重要】单位切向量主法向量副法向量Frenet标架螺旋线的案例 曲线的曲率和曲率半径曲率的几何意义 曲线的挠率挠率…