问题:弹跳球初始高度为
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=tn−1+∇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