3,Matlab仿真弹跳球

原理

使用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:n
    yinter(:,i) = interp1(t_all,y_all(:,i),tinter);% 使用插值法,将每个时间节点都对应上相应的数据
end

for 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,:);
end

figure(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);

仿真结果

在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要使用 MATLAB 仿真摆动,您可以按照以下步骤进行操作: 1. 定义系统参数:首先,您需要定义摆动系统的参数,例如的质量、摆长、初始角度等等。 2. 编写运动方程:根据摆动的运动特性,您可以编写摆动的运动方程。这可以通过应用牛顿第二定律和几何关系来实现。 3. 数值求解运动方程:使用 MATLAB 的数值求解工具(例如ode45函数)来求解运动方程。您需要定义适当的初始条件,并指定求解的时间范围。 4. 绘制结果:根据求解得到的摆动的位置和速度数据,使用 MATLAB 的绘图函数(例如plot函数)来绘制摆动的运动轨迹或其他感兴趣的结果。 以下是一个简单的示例代码,演示如何使用 MATLAB 仿真摆动: ```matlab % 定义系统参数 m = 1; % 的质量 L = 1; % 摆长 theta0 = pi/4; % 初始角度 g = 9.81; % 重力加速度 % 定义摆动的运动方程 motion_eq = @(t, y) [y(2); -(g/L)*sin(y(1))]; % 定义初始条件和时间范围 tspan = [0, 10]; % 时间范围 initial_conditions = [theta0, 0]; % 初始角度和初始角速度 % 数值求解运动方程 [t, result] = ode45(motion_eq, tspan, initial_conditions); % 绘制摆动的角度随时间的变化 figure; plot(t, result(:, 1)); xlabel('时间'); ylabel('角度'); title('摆动的角度随时间的变化'); % 绘制摆动的轨迹 x = L*sin(result(:, 1)); y = -L*cos(result(:, 1)); figure; plot(x, y); axis equal; xlabel('x'); ylabel('y'); title('摆动的轨迹'); ``` 您可以根据自己的需要调整系统参数和初始条件,并根据仿真结果进行进一步的分析和可视化。希望这可以帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lilili~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值