首页/文章/ 详情

求解滑动摆系统的运动形式

3年前浏览3268

image.png

 过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,qq:927550334 

QQ图片20210424105303.png 

      

一个单摆悬挂于可沿水平光滑轨道滑动的滑块上,如图8-1所示。滑块质量为m,单摆的摆杆长度为l,质量不计,摆锤质量为m',摆杆与滑块光滑铰接,整个系统在同一竖直平面内运动,研究整个滑动摆系统的运动情况。 

image.png

图 8-1  滑动摆模型示意图 

如图8-1所示, 沿直线水平轨道建立Ox轴,以x表示滑块在轨道上的位置, 以θ表示摆杆与竖直线的夹角。则系统图 8-1  滑动摆模型示意图的拉格朗日函数为 

image.png

image.png

image.png

      求解式(8-2)可得滑动摆系统运动情况的解析表达式。

8.2  用 ode45 求解常微分方程 

     上述微分方程组比较复杂,用dsolve求解解析解非常耗时,且不一定可行。在实际应用中,对于复杂的微分方程(组) ,很多时候解析解是很难得到的,因此经常以求解数值解来代替解析解。本节介绍一个求解微分方程数值解的函数——ode45。ode45采用四阶和五阶Runge-Kutta单步算法,用变步长求解器求解非刚性常微分方程,其解具有二阶精度。在MATLAB中,ode45是解决微分方程(组)

   上述微分方程组比较复杂,用dsolve求解解析解非常耗时,且不一定可行。在实际应用中,对于复杂的微分方程(组) ,很多时候解析解是很难得到的,因此经常以求解数值解来代替解析解。本节介绍一个求解微分方程数值解的函数——ode45。ode45采用四阶和五阶Runge-Kutta单步算法,用变步长求解器求解非刚性常微分方程,其解具有二阶精度。在MATLAB中,ode45是解决微分方程(组)

句法 

[T, Y] = ode45(odefun,tspan,y0,options) 

说明 

ode45:函数用来求解微分方程(组)数值的解。 

odefun:函数句柄,可以是函数文件名、匿名函数句柄或内联函数名。 

tspan:求解时间区间或时间点。 

y0:初值向量。 

options:求解参数(可选),可以用 odeset 在计算前设定容许误差、输出参数、事件等。  

T:返回列向量的时间点。 

Y:返回对应 T 时刻的求解结果。 


     ode45求解常微分方程(组)的最重要一步就是对方程(组)进行降阶处理,使求解方程(组)全部变为一阶微分方程。对于式(8-2) ,可进行如下降阶处理。 

image.png

image.png

进行降阶处理后,就可用ode45命令直接求解。 为了更直观地了解滑动摆滑块与摆锤之间的相对运动, 可以利用Maltab的可视化功能对滑动摆的运动进行可视化模拟。滑动摆的可视化过程与上一章傅科摆可视化类似,这里不再赘述,只给出程序。 可视化程序完成两个功能:第一是绘制系统运动参数x和θ的时程变化曲线(图8-2) ,第二是生成一个模拟滑动摆运动过程的动画(avi视频文件) ,图8-3是其中一帧图像(动画制作的内容将在第9章介绍) 。 

image.png

图 8-2  滑块位置与摆线角度随时间变化曲线 

image.png

图 8-3  某时刻滑动摆的运动状态图 


%==================================================================% 
%% 文件名:SlidePendulum.m 
%% 功能:利用ode45求解滑动摆轨迹的数值解,将其可视化,同时将摆动过程制作成avi格式 
%% 的视频 
%==================================================================% 
% 
close all;clear all;clc 
g = 9.8;m1 = 3;m2 = 3;l = 1; 
[t, y] = ode45('SlidePendulum_fun',[0:0.05:5.5],... 
    [pi/4,0,-cos(pi/4)/2,0],[],m2/(m1 m2),g,l); 
%% 画曲线 
figure('color',[1 1 1],'unit','normalized','position',[0.1 0.1 0.45 
0.5]); 
[ax, h1, h2] = plotyy(t,y(:,3),t,180*y(:,1)/pi); 
xlabel('时间{\itt}','fontname','Times new roman','fontsize',20); 
ylabel(ax(1),'滑块位置{\itx}','fontname','Times new roman','fontsize', 
20)
ylabel(ax(2),'摆线角度{\it\theta}','fontname','Times new roman', 'fontsize', 
20) 
set(ax(1),'fontname','Times new roman','fontsize',20,'xlim',[0 5.5]) 
set(ax(2),'fontname','Times new roman','fontsize',20,'xlim',[0 5.5], 
'ylim',[-60 60]) 
set(h1,'linestyle','-','marker','*','linewidth',2) 
set(h2,'linestyle','-','marker','.') 
%% 可视化 
fig = figure('color',[1 1 1],'unit','normalized','position',[0.5 0.5 
0.45 0.45]); 
axis([-0.6 0.6 -1 0.2]);axis equal;axis off;hold on
y1 = -l*cos(y(:,1)); 
x1 = y(:,3) l.*sin(y(:,1)); 
line1 = line([-0.6,0.6],[0,0],'linewidth',4,'color',[0 0 0]);  
%滑轨初始化 
line2 = line([0,0],[0,-1],'linewidth',1,'linestyle','-.','color',[0 0 
0]); %竖轴初始化 
pole = line([y(1,3),x1(1)],[0,y1(1)],'color',[1 1 0],'linestyle', 
'-',...
'linewidth',3,'erasemode','xor'); %滑杆初始化 
block1 = line([y(1,3)-0.08,y(1,3) 0.08],[0,0],'color',[0 0 1],... 
    'linestyle','-','linewidth',20,'erasemode','xor');%滑块初始化 
block2 = line(x1(1),y1(1),'color',[1 0 0],'marker','.', 'markersize',... 
60,'erasemode','xor');%摆锤初始化 
mov = avifile('Video.avi','fps',20);  
% 创建视频文件 Video.avi,设帧率为 20fps 
for i = 1:size(t,1) 
    set(pole,'xdata',[y(i,3),x1(i)],'ydata',[0,y1(i)]); 
    set(block1,'xdata',[y(i,3)-0.08,y(i,3) 0.08],'ydata',[0,0]); 
    set(block2,'xdata',x1(i),'ydata',y1(i)); 
    drawnow; %更新滑动摆位置 
    pause(0.05) 
    F = getframe(fig); 
mov = addframe(mov,F); % 添加图像至视频文件 
end     
mov = close(mov); % 关闭视频文件
%==================================================================% 
%% 文件名 SlidePendulum_fun.m 
%% 本函数为上述程序中,计算灰度重心的子函数 
%% 参数 image:切割后的用于计算的图像 
%% 参数 threshold:灰度阈值  
%==================================================================% 
function k = SlidePendulum_fun(t,y,flag,M,g,l) 
k = [y(2); 
    (-M*sin(y(1))*cos(y(1))*y(2)^2-... 
    g/l*sin(y(1)))/(1-M*cos(y(1))^2); 
    y(4);
     (M*g*sin(y(1))*cos(y(1)) M*l*... 
    sin(y(1))*y(2)^2)/(1-M*cos(y(1))^2)];


图片

        过冷水发表于 仿真秀 平台原创文章,未经授权禁止私自转载,如需转载请需要和作者沟通表明授权声明,未授权文章皆视为侵权行为,必将追责。如果您希望加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载均可加群:927550334。

精品回顾

 matlab绘制农夫过河动态图

分子动力学的原子空间运动轨迹演示编程

过冷水带你用matlab制作演示动画

python批量移动文件&重命名代码分享

过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享

image.png


理论科普仿真体系求解技术MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-06-29
最近编辑:3年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 359粉丝 183文章 107课程 11
点赞
收藏
作者推荐

免费 5.0
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈