小球弹跳及MATLAB实现

 问题:弹跳球初始高度为 10 m 10m 10m,初始速度向上为 15 m / s 15m/s 15m/s,随后在重力作用下自由落体运动。每次撞击地面会弹起,弹起的速度是落地速度的0.8倍。求:
1、弹跳球何时停止
2、 弹跳球第100次撞击地面时的时间和行驶路程。
3、用plot绘制弹跳球位置随时间的变化图。
4 、使用plot绘制弹跳球速度随时间的变化图。
结果如下图所示:
在这里插入图片描述

 首先是小球运动的动力学公式:
v = v 0 + a t v=v_0+at v=v0+at
x = v 0 t + 1 2 a t 2 x=v_0t+{1\over2}at^2 x=v0t+21at2
∇ x = 1 2 a t 2 \nabla x={1\over2}at^2 x=21at2
l = ∑ ∇ x l=\sum{\nabla x} l=x
 其实真正的公式部分就只有这些,剩下的就主要是编程的问题,而编程中主要是画图的问题。我们首先要明确一个问题,虽然时间是连续的,求的应该也是一个连续的过程,但其实就是我们编程求的是一个一个点,是离散的,不是一个连续的过程。就比如求得当 ∇ t = 1 \nabla t=1 t=1 t = 0 , 1 , 2 , 3 … … t=0,1,2,3…… t=0,1,2,3时,求得 x ( t ) , l ( t ) , v ( t ) x(t),l(t),v(t) x(t),l(t),v(t)。但是当t的间隔越来越小时, ∇ t = 0.1 \nabla t =0.1 t=0.1 t = 0 , 0.1 , 0.2 … … t=0,0.1,0.2…… t=0,0.1,0.2则就可近似看成连续的函数。
 设速度竖直向下为正方向,则 v 0 = − 15 m / s v_0=-15m/s v0=15m/s,设初始高度 h 0 = 10 m h_0=10m h0=10m,设反弹系数 k = 0.8 k=0.8 k=0.8,设重力加速度 g = 9.8 m / s 2 g=9.8m/s^2 g=9.8m/s2,设初始行驶路程 l 0 = 0 m l_0=0m l0=0m,设撞击地面的次数为 c o u n t count count

clc,clear;
h0=10;%初始高度为10m
v0=-15;%以竖直向下为正方向,初速度为-15m/s
l0=0;%行驶路程
g=9.8;%加速度
k=0.8;%反弹系数
count=0;%撞击地面的次数

 我们需要用矩阵记录每时刻小球的速度,高度,行驶的路程,经过的时间。

h(1)=h0;%记录每刻小球高度
v(1)=v0;%记录每刻小球速度
l(1)=l0;%记录每刻小球路程
t=0;%记录每刻小球路程
i=0;%记数

 下面就是小球运动的核心代码。但是其中有一个问题,就是由于我们求得的是下一时刻的小球状态,如果在这一段时间内小球发生碰撞应该怎么办?
在这里插入图片描述

 我的解决方法就是判断下一段时间小球是否要碰地,若要碰地,则改变 ∇ t \nabla t t,使小球在 t n = t n − 1 + ∇ t t_n=t_{n-1}+\nabla t tn=tn1+t时刻正好碰地。
在这里插入图片描述

while 1
    i=i+1;
    t=0.05;%设置时间间隔为0.05s
  if count==100 %如果撞地次数为100次,退出
    break
  end  
%在撞地前
if h(i)-(v(i)*t+g*t^2/2)<=0 %当前高度小于下降距离时,速度方向改变且变为原来的k倍
    h(i+1)=0;%下一刻高度为0
    t=(-v(i)+(v(i)^2+ (2*g*h(i)) )^0.5)/g;%小球由当前高度到地面所经过的时间
    v(i+1)=-k*(v(i)+g*t);%当小球撞地时,速度发生改变
    l(i+1)=l(i)+abs(v(i)*t+g*t^2/2);%所经历的路程
    count=count+1;%撞地次数加1
    continue
end
%在正常情况下,小球的运行过程
v(i+1)=v(i)+g*t;
h(i+1)=h(i)-(v(i)*t+g*t^2/2);
l(i+1)=l(i)+abs(v(i)*t+g*t^2/2);
end

 核心代码讲完之后,最后一个部分就是画图了。为了使小球的运动更有动态感,我在图中保留了五个小球,并设置了不同的大小。下图是没有经过处理的图:
在这里插入图片描述
 完整的代码如下:

clc
clear
pic_num = 1;
for epsilon = 0.01:-0.001:0.005
    t = 1;
    syms x;
    ur = -1;
    ul = 1;
    s = (ur + ul)/2;
    w = ur + 1/2*(ul - ur)*(1-tanh((ul-ur)*(x-s*t)/(4*epsilon)));
    figure(1);
    ezplot(w);
    axis([-0.05,0.05 -1.5 1.5])
    drawnow;
    F=getframe(gcf);
    I=frame2im(F);
    [I,map]=rgb2ind(I,256);
    if pic_num == 1
        imwrite(I,map,'test.gif','gif', 'Loopcount',inf,'DelayTime',0.2);
    else
        imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.2);
    end
    pic_num = pic_num + 1;
end


if i>5   %在图中留下五个小球
    delete(h1(i-1))%删除前第一个小球,并将小球大小设为25
    h1(i-1) = line('Color','b','Marker','.','MarkerSize',25);%画小球的不同大小
    set(h1(i-1),'xdata',0,'ydata',h(i-1));

    delete(h1(i-2))%删除前第二个小球,并将小球大小设为20
    h1(i-2) = line('Color','b','Marker','.','MarkerSize',20);
    set(h1(i-2),'xdata',0,'ydata',h(i-2));
    
    delete(h1(i-3))%删除前第三个小球,并将小球大小设为15
    h1(i-3) = line('Color','b','Marker','.','MarkerSize',15);
    set(h1(i-3),'xdata',0,'ydata',h(i-3));
    
    delete(h1(i-4))%删除前第四个小球,并将小球大小设为10
    h1(i-4) = line('Color','b','Marker','.','MarkerSize',10);
    set(h1(i-4),'xdata',0,'ydata',h(i-4));
    delete(h1(i-5))
end
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会学习的小朋友

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

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

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

打赏作者

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

抵扣说明:

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

余额充值