admin 管理员组文章数量: 887053
3,Matlab仿真弹跳球
弹跳球
- 原理
- matlab代码
- 运动方程
- onebounce函数
- 做动画函数
- mycontact函数
- main部分
- 仿真结果
原理
使用ode45的event函数,对运动方程积分,遇到特定实践(碰撞)则进行改变初值条件,重新开始积分
matlab代码
运动方程
小球在空中的运动方程为
function dqdt = rhs(t,y,ball)
% y = [y ydot]
ydot = y(2);
yddot = -ball.g;dqdt = [ydot yddot]';
onebounce函数
可以将小球的弹跳分为多次过程,用循环实现,每次弹跳的代码基本相同
function [tt,yy] = my_bounce(t0,ystart,ball)dt = 10; % 随便给,需要大一点
%%%% 计算一次碰撞前的t和y向量
options = odeset('AbsTol',1e-8,'RelTol',1e-8,'Events',@mycontact);
[t y] = ode45(@rhs,[t0 t0+dt],ystart,options,ball); %检测Event发生则积分终止% ynew(1,1) = y(end,1);
y(end,2) = -ball.e*y(end,2);%终止后,小球回弹,设置反弹的速度tt = t;
yy = y;
做动画函数
为了直观显示,通常将仿真结果做成动画,代码如下:
function myanimation(t_all,y_all,ball)
tstart = t_all(1);
tend = t_all(end);
tinter = linspace(tstart,tend,ball.movieFps*(tend-tstart));% 建立每一帧的时间节点[m,n] = size(y_all);for i = 1:nyinter(:,i) = interp1(t_all,y_all(:,i),tinter);% 使用插值法,将每个时间节点都对应上相应的数据
endfor i = 1:length(tinter)plot(0,yinter(i,1),'ro','MarkerEdgeColor','r','MarkerFaceColor','r','MarkerSize',20); hold on;line([-0.1 0.1],[ball.ground_animate ball.ground_animate],'LineWidth',2);axis([-0.1 0.1 min(yinter(:,1)-1) max(yinter(:,1)+1)]);pause(ball.moviePause);hold off;
end
mycontact函数
function [gstop,isterminal,direction] = mycontact(t,y,ball)gstop = y(1) - ball.ground;
direction = -1;%往下走的过程中,检测为碰撞
isterminal = 1;
main部分
clc
clear
close all
%%%% 建立对象球的参数 %%%%
ball.g = 9.8;
ball.e = 0.9;%反弹系数
ball.ground = 0;
ball.ground_animate = -0.2;%做动画用的地面ball.movieFps = 15;
ball.moviePause = 0.05;%%%% 初始条件 %%%%
y0 = 2; y0dot = 10;
ystart = [y0 y0dot];t0 = 0; tend = 10;
tstart = t0;
%%%% 仿真计算 %%%%
t_all = tstart; y_all = ystart;
while(t0<tend)[t y] = my_bounce(t0,ystart,ball); %仿真一次计算t_all = [t_all;t(2:end)];% 把时间向量记录进来,从2开始的原因是t(1)就是上次循环的t(end)y_all = [y_all;y(2:end,:)];t0 = t(end);ystart = y(end,:);
endfigure(1)
subplot(2,1,1);
plot(t_all,y_all(:,1),'r','LineWidth',2);
ylabel('纵方向位置','FontSize',12);
xlabel('时间','FontSize',12);
subplot(2,1,2);
plot(t_all,y_all(:,2),'b','LineWidth',2);
ylabel('纵方向速度','FontSize',12);
xlabel('时间','FontSize',12);figure(2)
myanimation(t_all,y_all,ball);
仿真结果
本文标签: 3 Matlab仿真弹跳球
版权声明:本文标题:3,Matlab仿真弹跳球 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1696936693h259606.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论