# 應用力學:彈跳球 ## 簡介 ![](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 ## 練習 請下載附件的程式碼並加以修改來模擬不同速度、動量轉換率的運動情形並詳細比較。