技術背景
乒乓球作為國球,不僅僅是在奧運等眾多賽場上為中國收納了多枚獎牌,更是在民間廣為大家所好。在上一篇博客中主要講述了馬格努斯力在乒乓球的運動過程中的應用,並且從俯視圖的角度看到了乒乓球的各種旋轉下的弧圈軌跡。本文主要講述的是空氣阻力對乒乓球的運動過程的影響。
空氣阻力的模擬
我們所了解到的空氣阻力的表達式為:
其中C是一個常數,對於不同的物質參數有可能不同,這個需要在實驗中進行測定,而這里我們就簡單取一個假設值即可。\(\rho\)表示空氣密度,S表示迎風面積,對於一個乒乓球而言,迎風面積其實就是乒乓球的投影面積,v表示速度,空氣阻力與速度的平方成正比。至於阻力的方向,那肯定是跟乒乓球的運動方向相反的,來拒去留。相關的模擬測試代碼如下:
import numpy as np
from tqdm import trange
import matplotlib.pyplot as plt
vel = np.array([4.,4.])
vel0 = vel.copy()
steps = 100
r = 0.02
rho = 1.29
mass_min = 2.53e-03
mass_max = 2.70e-03
dt = 0.01
g = 9.8
C = 0.1
s0 = np.array([0.,0.])
s00 = np.array([0.,0.])
s1 = [s0.copy()]
for step in trange(steps):
s0 += vel*dt
s1.append(s0.copy())
# print (vel)
vel += np.array([0.,-g])*dt
s1 = np.array(s1)
s2 = [s00.copy()]
for step in trange(steps):
s00 += vel0*dt
s2.append(s00.copy())
vel_norm = np.linalg.norm(vel0)
DampF = C*rho*np.pi*r**2*vel_norm**2
DampA = DampF/mass_min
# print (vel)
vel0 -= np.array([DampA*vel0[0]/vel_norm, DampA*vel0[1]/vel_norm])*dt
vel0 += np.array([0.,-g])*dt
s2 = np.array(s2)
plt.figure()
plt.plot(s1[:,0], s1[:,1], 'o', color='orange')
plt.plot(s2[:,0], s2[:,1], 'o', color='black')
plt.savefig('damping.png')
代碼的運行結果如下圖所示,其中橙色軌跡表示未添加阻力的曲線,黑色軌跡表示考慮了空氣阻力:
可以看到,在加了空氣阻力之后,乒乓球的速度逐漸降低,就不再是一個漂亮的拋物線形式了。需要注意的是,這里我們的軌跡是從y-z平面來觀察的側視圖。
加轉弧圈帶來的影響
我們在上一個章節中主要考慮的是空氣阻力對乒乓球運動軌跡的影響,其中並未考慮到乒乓球本身的旋轉。這里我們考慮一個弧圈球的場景:加轉弧圈或者叫高吊弧圈球的軌跡,在這個乒乓球活動的軌跡中需要加入上旋的旋轉,上旋會給乒乓球帶來一個向下壓的馬格努斯力,使得乒乓球運動軌跡的弧線更小。具體的馬格努斯力的形式參考如下Nasa提供的Kutta-Joukowski理論:
相關的模擬代碼如下所示,這里為了方便調用,我們把生成軌跡的模塊包裝成了一個簡單的函數:
import numpy as np
from tqdm import trange
import matplotlib.pyplot as plt
vel = np.array([4.,4.])
vel0 = vel.copy()
steps = 100
r = 0.02
rho = 1.29
mass_min = 2.53e-03
mass_max = 2.70e-03
dt = 0.01
g = 9.8
C = 0.1
f0 = 0.
f1 = 0.
omega0 = 4
s0 = np.array([0.,0.])
s00 = np.array([0.,0.])
def F(vel, omega, r, rho):
return 4*(4*np.pi**2*r**3*omega*vel*rho)/3
def Trace(steps, s0, vel0, f0, f1, dt, mass, omega0, r, rho, damping=False, KJ=False):
s = [s0.copy()]
tmps = s0.copy()
for step in trange(steps):
tmps += vel0*dt+0.5*f0*dt**2/mass
s.append(tmps.copy())
vel_norm = np.linalg.norm(vel0)
if KJ:
vel0 += np.array([np.sqrt(vel0[1]**2*(f0*dt/mass)**2/(vel0[0]**2+vel0[1]**2)),
-np.sqrt(vel0[0]**2*(f0*dt/mass)**2/(vel0[0]**2+vel0[1]**2))])
if damping:
vel0 -= np.array([f1*vel0[0]/vel_norm, f1*vel0[1]/vel_norm])*dt/mass
vel0 += np.array([0.,-g])*dt
f0 = F(np.linalg.norm(vel0), np.abs(omega0), r, rho)
f1 = C*rho*np.pi*r**2*vel_norm**2
return np.array(s)
s1 = Trace(steps, s0, vel0.copy(), f0, f1, dt, mass_min, omega0, r, rho, damping=False, KJ=False)
s2 = Trace(steps, s0, vel0.copy(), f0, f1, dt, mass_min, omega0, r, rho, damping=True, KJ=False)
s3 = Trace(steps, s0, vel0.copy(), f0, f1, dt, mass_min, omega0, r, rho, damping=True, KJ=True)
plt.figure()
plt.plot(s1[:,0], s1[:,1], 'o', color='orange')
plt.plot(s2[:,0], s2[:,1], 'o', color='black')
plt.plot(s3[:,0], s3[:,1], 'o', color='red')
plt.savefig('damping.png')
運行結果如下,其中黃色的軌跡表示不考慮空氣阻力和馬格努斯力的效果,而黑色的軌跡表示考慮空氣阻力不考慮馬格努斯力作用的結果,相關內容在上一個章節中已經進行了介紹,最后還有一條紅色的軌跡表示同時考慮了空氣阻力和馬格努斯力的結果,也就是正常拉出來的高吊弧圈球的效果:
從這個結果中我們可以了解到,高吊弧圈球不僅旋轉強烈,在軌跡上也會更加的低平,在賽場上具有很強的威脅性。
削球弧線
在上一個章節中我們模擬的是高吊弧圈球的結果,也就是上旋轉的球,而在賽場上還有另外一種非弧圈的打法:削攻結合。其中的削球技術,能夠給球帶來一個強烈的下旋轉,也就是改變了馬格努力的方向,相關的模擬代碼如下:
import numpy as np
from tqdm import trange
import matplotlib.pyplot as plt
vel = np.array([4.,4.])
vel0 = vel.copy()
steps = 100
r = 0.02
rho = 1.29
mass_min = 2.53e-03
mass_max = 2.70e-03
dt = 0.01
g = 9.8
C = 0.1
f0 = 0.
f1 = 0.
omega0 = 4
s0 = np.array([0.,0.])
s00 = np.array([0.,0.])
def F(vel, omega, r, rho):
return 4*(4*np.pi**2*r**3*omega*vel*rho)/3
def Trace(steps, s0, vel0, f0, f1, dt, mass, omega0, r, rho, damping=False, KJ=False, down_spin=False):
s = [s0.copy()]
tmps = s0.copy()
for step in trange(steps):
tmps += vel0*dt+0.5*f0*dt**2/mass
s.append(tmps.copy())
vel_norm = np.linalg.norm(vel0)
if KJ and not down_spin:
vel0 += np.array([np.sqrt(vel0[1]**2*(f0*dt/mass)**2/(vel0[0]**2+vel0[1]**2)),
-np.sqrt(vel0[0]**2*(f0*dt/mass)**2/(vel0[0]**2+vel0[1]**2))])
if KJ and down_spin:
vel0 += np.array([-np.sqrt(vel0[1]**2*(f0*dt/mass)**2/(vel0[0]**2+vel0[1]**2)),
np.sqrt(vel0[0]**2*(f0*dt/mass)**2/(vel0[0]**2+vel0[1]**2))])
if damping:
vel0 -= np.array([f1*vel0[0]/vel_norm, f1*vel0[1]/vel_norm])*dt/mass
vel0 += np.array([0.,-g])*dt
f0 = F(np.linalg.norm(vel0), omega0, r, rho)
f1 = C*rho*np.pi*r**2*vel_norm**2
return np.array(s)
s1 = Trace(steps, s0, vel0.copy(), f0, f1, dt, mass_min, omega0, r, rho, damping=True, KJ=False)
s2 = Trace(steps, s0, vel0.copy(), f0, f1, dt, mass_min, omega0, r, rho, damping=True, KJ=True)
s3 = Trace(steps, s0, vel0.copy(), f0, f1, dt, mass_min, omega0, r, rho, damping=True, KJ=True, down_spin=True)
plt.figure()
plt.plot(s1[:,0], s1[:,1], 'o', color='orange')
plt.plot(s2[:,0], s2[:,1], 'o', color='black')
plt.plot(s3[:,0], s3[:,1], 'o', color='red')
plt.savefig('damping.png')
在這次的模擬中,我們對比了不加弧圈(橙色軌跡)、高吊弧圈(黑色軌跡)和削球弧線(紅色軌跡),如下圖所示:
從結果中我們發現,由於強烈的下旋轉為乒乓球帶來了上升的馬格努斯力,因此乒乓球的弧線軌跡被拉長了,相對而言會更加容易控制弧線。比如朱世赫,還有中國隊的馬特,以及前國家隊的侯英超,都是削球名將。
總結概要
在前一篇博客中我們介紹了加側旋的乒乓球弧圈技術的模擬,本文我們關注的是高吊弧圈和削球弧線這兩種軌跡原理,並且引入了空氣阻力對乒乓球運動軌跡的影響。通過對空氣阻力和馬格努斯力的模擬,我們可以看到不同的弧線曲線。對於乒乓球愛好者而言,可以通過這種模擬的結果,來制定比賽中有可能用到的策略,比如低長弧圈球、高短弧圈球等等。先從科學的角度出發制定戰略,再通過日常訓練和鞏固提高技術水平,最后再使用到正式的賽場上去。
版權聲明
本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/damping.html
作者ID:DechinPhy
更多原著文章請參考:https://www.cnblogs.com/dechinphy/
打賞專用鏈接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html