---
# System prepended metadata

title: 應用力學：彈跳球

---

# 應用力學：彈跳球

## 簡介
![](https://i.imgur.com/Iel7xNT.png)

當我們在描述一個物體做彈跳運動時（如上圖），可以將整個碰撞期間分為四個時期：

#### 1. 碰撞前期
兩個物體朝著對方移動，但尚未發生碰撞。

![](https://i.imgur.com/4G2LMeO.png)
#### 2. 壓縮期
兩個物體開始接觸，然後互相壓縮、施加壓縮力於對方，兩個物體各自質心之間的距離越來越近，直到無法再繼續壓縮為止。
![](https://i.imgur.com/EkCQLTx.png)

#### 3. 恢復期
兩個物體開始恢復先前的形狀，且質心之間的距離越來越遠，直到不再接觸對方為止
![](https://i.imgur.com/abPPDXx.png)

#### 4. 碰撞後期
兩個物體完全分離，朝著不同方向越移動越遠。
![](https://i.imgur.com/jUVrOME.png)


<br>
<br>

其中碰撞過程中的壓縮能力和恢復能力可由恢復係數（coefficient of restitution）來表示，跟材料有關。而運動方程式則可以繼續延伸，但由於難度限制，這一次的計算會有部份簡化以便模擬。


## 例題
我們假設有一顆由左向右彈跳的球，其跟地板碰撞時跟之前彈性碰撞的運動方程式很像，只是了考慮壓縮和恢復，我們加入一個動量轉換率在方程式裡來模擬前述的碰撞(2)、(3)時期。因此只要給定初始條件和邊界，就可以模擬彈跳運動了

1. 初始條件和參數
```
%初始條件（位置、半徑、顏色、速度、動量轉換率......）
ix=0;
iy=10;

r=1;
color=(1);

Yv=70/2000;
Xv=500/2000;
Yvc=0.7;
Xvc=0.5;

a=9.81/2000;
step=0;
dt=1;
t=linspace(0,2*pi,100);
```
<br>
<br>

2. 首先設定視窗的規格和軸的距離。接著依序使用**set函數**設定球、軸、地板和頂端，這邊可以自調參數以模擬不同的邊界條件。最後設定球的軌跡。
```
%設定視窗、邊界
figure('units','normalized','position',[.2 .2 .5 .5],'menubar','none','numbertitle','off','color','w','name','Bouncing Ball')
axes('position',[.05 .05 .85 .75])
hold on
%球
h1=fill((ix)+r*cos(t),(iy)+r*sin(t),color);
set(h1,'linewidth',2)
%軸
axis([0 10 -1 10+r+1])
axis equal
hx=axis;
%地板
hL=line(1000.*[hx(1),hx(2)],[0 0]);
set(hL,'color','k','linestyle','-','linewidth',3)
%頂端
hL=line(1000.*[hx(1),hx(2)],[10 10]);
axis(hx)
set(hL,'color','c','linestyle','--')
%軌跡
h2=plot(ix,iy,'k+');
hb=[h1,h2];
```
<br>
<br>

3. 最後我們利用while迴圈進行運動方程式計算和動畫製成。記得裡面要加入碰撞的條件、速度改變的關係式和**動量轉換率**，並用**set**函數來進行物件性質的存取。最後一個part則是要讓球彈出視窗外時，仍能模擬畫面（基本上就是每一次更新**xlim**和**ylim**）。最後不要忘記**drawnow()**，縮排請打好。


```
%運動方程式迴圈
while step<100000
    step=step+dt;
    %畫軌跡
	yc=get(h2,'ydata');
    plot(get(h2,'xdata'),yc,'k.')
    %運動方程式（注意動量轉換率和半徑條件）
	Yv=Yv+a*dt;
	if yc-(Yv+a*dt)*dt<=r
	Yv=Yv+a*dt/(Yv+a*dt)*(yc-r);
	Yv=-Yv*Yvc;
    set(h2,'ydata',r)
	set(h1,'ydata',r+(r)*sin(t))
	Xv=Xv*Xvc;
    else
        for k=1:2
			set(hb(k),'ydata',get(hb(k),'ydata')-Yv*dt)
        end
	end
	set(hb(1),'xdata',get(hb(1),'xdata')+Xv*dt)
	set(hb(2),'xdata',get(hb(2),'xdata')+Xv*dt)
	
    %當球跑出視窗外時跟著移動
	l=axis;
	if get(h2,'xdata')>l(2)-r && Xv>0
		xlim([hx(1),hx(2)]+l(2))
	end
	if get(h2,'ydata')>l(4)-r && Yv<0
		ylim([hx(3),hx(4)]+l(4))
	end
	if get(h2,'xdata')<l(1)+r && Xv<0
		xlim([l(1),l(2)]-(hx(2)-hx(1)))
	end			
	if get(h2,'ydata')<l(3)+r && Yv>0
		ylim([l(3),l(4)]-(hx(4)-hx(3)))
    end
		
        % 更新圖形
       drawnow()
end
```
<br>
<br>

4. 最後的圖片會長這樣，完整的動圖請點選下方的網址觀看。
![](https://i.imgur.com/iFfEjL7.png)

<br>

https://www.youtube.com/watch?v=mAM-oH5mfV8&feature=youtu.be
## 練習
請下載附件的程式碼並加以修改來模擬不同速度、動量轉換率的運動情形並詳細比較。