乒乓球之弧圈理論


技術背景

首先我們來看一下一個比賽畫面,這是人民藝術家、弧圈大師許昕的一場比賽:

在這個視角下,我們可以很明顯的看到乒乓球在空中划出來一道優美的弧線,這就是許昕拉出來的正手弧圈球。在其他的球類運動中,比如足球運動,也存在類似的現象,叫香蕉球或者弧旋球。關於這一現象的原理,我們一般解釋為馬格努斯效應。就是在球體的運動過程中,如果球體不僅僅是帶有前進的速度,如果再加上一個球體自身的旋轉,就會在流體中產生一個與角動量和速度平面相互垂直的作用力。具體公式可以參考如下由NASA提供的Kutta-Joukowski理論:

雖然Kutta-Joukowski理論一般是用來計算圓柱體的上升力的,但是相應的參數在計算球體的馬格努斯力時也有非常好的效果。由於作者對流體力學領域知之甚少,如有錯誤歡迎流體力學領域大佬指正。

模擬馬格努斯力

根據Kutta-Joukowski理論,我們可以寫一個Python程序用來迭代乒乓球運動的過程,給乒乓球一個向前運動的初始速度,再給其一個適當的旋轉角速度。這里我們先不考慮空氣阻尼等問題,並且為了明顯的看到弧圈效果,這里我們是采用了一個俯視圖的二維視角。關於乒乓球的一些參數,比如半徑是用的20mm,對應於當下的40+大球。重量的話不同的廠家和有縫球無縫球、訓練球和比賽球等都有些許重量差異,一般在2.53g~2.70g之間,在模擬的時候我們使用了最輕的重量來模擬。由於馬格努斯力會隨着乒乓球運動軌跡的改變而改變,因此這里采用了一個迭代計算的過程,具體代碼如下所示:

import numpy as np
from tqdm import trange
import matplotlib.pyplot as plt

r = 0.02
rho = 1.29
mass_min = 2.53e-03
mass_max = 2.70e-03

# Equation for force of lift
def F(vel, omega):
    return 4*(4*np.pi**2*r**3*omega*vel*rho)/3

vel0 = np.array([-3.,10.])
omega0 = 10
s0 = np.array([0.,0.])
f0 = 0.
steps = 100
dt = 0.01

s = [s0.copy()]
for step in trange(steps):
    s0 += vel0*dt+0.5*f0*dt**2/mass_min
    s.append(s0.copy())
    vel0 += np.array([np.sqrt(vel0[1]**2*(f0*dt/mass_min)**2/(vel0[0]**2+vel0[1]**2)),
                      -np.sqrt(vel0[0]**2*(f0*dt/mass_min)**2/(vel0[0]**2+vel0[1]**2))])
    f0 = F(np.linalg.norm(vel0), np.abs(omega0))

s = np.array(s)
plt.figure()
plt.plot(s[:,0], s[:,1], 'o', color='orange')
plt.savefig('pingpong.png')

運行完成后我們可以看到這樣的一個效果:

需要提醒和注意的是,在這個模擬過程中我們給定的初速度是向左前方的,並不是向正前方。可以看到,在馬格努斯力的作用下,乒乓球的弧圈效果是非常明顯的。

初始速度的大小對弧圈有什么影響?

為了方便測試,我們將上一個章節中用到的代碼進行了模塊化:

import numpy as np
from tqdm import trange
import matplotlib.pyplot as plt

r = 0.02
rho = 1.29
mass_min = 2.53e-03
mass_max = 2.70e-03
vel0 = np.array([-3., 10.])
omega0 = 10
s0 = np.array([0.,0.])
f0 = 0.
steps = 100
dt = 0.01

def F(vel, omega, r, rho):
    return 4*(4*np.pi**2*r**3*omega*vel*rho)/3

def Trace(steps, s0, vel0, f0, dt, mass, omega0, r, rho):
    s = [s0.copy()]
    tmps = s0.copy()
    for step in trange(steps):
        tmps += vel0*dt+0.5*f0*dt**2/mass
        s.append(tmps.copy())
        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))])
        f0 = F(np.linalg.norm(vel0), np.abs(omega0), r, rho)
    return np.array(s)

s = Trace(steps, s0, vel0, f0, dt, mass_min, omega0, r, rho)
vel1 = np.array([-4.5, 15.])
s1 = Trace(steps, s0, vel1, f0, dt, mass_min, omega0, r, rho)
vel2 = np.array([-1.5, 5.])
s2 = Trace(steps, s0, vel2, f0, dt, mass_min, omega0, r, rho)
plt.figure()
plt.plot(s[:,0], s[:,1], 'o', color='orange')
plt.plot(s1[:,0], s1[:,1], 'o', color='blue')
plt.plot(s2[:,0], s2[:,1], 'o', color='black')
plt.savefig('pingpong.png')

在這段代碼中我們測試了兩個新的變量:將速度放大1.5倍(用藍色表示)和將速度縮小到原來的0.5倍(用黑色表示),在不改變其角速度的情況下,得到的結果如下:

從這個結果來看,弧圈的弧度大小主要還是取決於角速度,跟乒乓球向前運動的速度本身沒有太大的聯系,但是如果只看局部的話,速度越快偏移越不明顯。

角速度對弧圈有多大影響?

這次我們不改變速度和其他的變量,只調整角速度,來看看會有什么樣的變化:

import numpy as np
from tqdm import trange
import matplotlib.pyplot as plt

r = 0.02
rho = 1.29
mass_min = 2.53e-03
mass_max = 2.70e-03
vel0 = np.array([-3., 10.])
omega0 = 10
s0 = np.array([0.,0.])
f0 = 0.
steps = 100
dt = 0.01

def F(vel, omega, r, rho):
    return 4*(4*np.pi**2*r**3*omega*vel*rho)/3

def Trace(steps, s0, vel0, f0, dt, mass, omega0, r, rho):
    s = [s0.copy()]
    tmps = s0.copy()
    for step in trange(steps):
        tmps += vel0*dt+0.5*f0*dt**2/mass
        s.append(tmps.copy())
        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))])
        f0 = F(np.linalg.norm(vel0), np.abs(omega0), r, rho)
    return np.array(s)

s = Trace(steps, s0, vel0.copy(), f0, dt, mass_min, omega0, r, rho)
omega1 = 12.
s1 = Trace(steps, s0, vel0.copy(), f0, dt, mass_min, omega1, r, rho)
omega2 = 8.
s2 = Trace(steps, s0, vel0.copy(), f0, dt, mass_min, omega2, r, rho)
plt.figure()
plt.plot(s[:,0], s[:,1], 'o', color='orange')
plt.plot(s1[:,0], s1[:,1], 'o', color='blue')
plt.plot(s2[:,0], s2[:,1], 'o', color='black')
plt.savefig('pingpong.png')

這里我們將角速度也分別放大(藍色軌跡)和縮小(黑色軌跡)來查看其中的差異,得到的結果如下:

這個圖中所得到的結論也是比較符合我們的預期結果的,也就是說,角速度越大,球就越拐。

小球改大球的影響

我們網上一直有很多人在說大球改小球是對中國隊的極大打擊,這里面的影響其實可以分為兩個部分來考慮:一是大球本身的旋球能力是否變弱了,二是制造大球的旋轉是否比制造小球的旋轉困難。其實第二問的回答幾乎是肯定的,因為半徑和重量發生了變化,在大球上要制造出跟小球相同的角速度和初始速度必然是更加困難的。而對於打法和姿勢相對固定的運動員來說,絕對是一個巨大的打擊。接下來我們通過程序來看看結果:

import numpy as np
from tqdm import trange
import matplotlib.pyplot as plt

r = 0.02
rho = 1.29
mass_min = 2.53e-03
mass_max = 2.70e-03
vel0 = np.array([-3., 10.])
omega0 = 10
s0 = np.array([0.,0.])
f0 = 0.
steps = 100
dt = 0.01

def F(vel, omega, r, rho):
    return 4*(4*np.pi**2*r**3*omega*vel*rho)/3

def Trace(steps, s0, vel0, f0, dt, mass, omega0, r, rho):
    s = [s0.copy()]
    tmps = s0.copy()
    for step in trange(steps):
        tmps += vel0*dt+0.5*f0*dt**2/mass
        s.append(tmps.copy())
        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))])
        f0 = F(np.linalg.norm(vel0), np.abs(omega0), r, rho)
    return np.array(s)

s = Trace(steps, s0, vel0.copy(), f0, dt, mass_min, omega0, r, rho)
r = 0.019
mass = 2.5e-03
s1 = Trace(steps, s0, vel0.copy(), f0, dt, mass, omega0, r, rho)
r = 0.019
mass = 2.5e-03
omega0 = 12
s2 = Trace(steps, s0, vel0.copy(), f0, dt, mass_min, omega0, r, rho)
plt.figure()
plt.plot(s[:,0], s[:,1], 'o', color='orange')
plt.plot(s1[:,0], s1[:,1], 'o', color='blue')
plt.plot(s2[:,0], s2[:,1], 'o', color='black')
plt.savefig('pingpong.png')

在這次的測試中,我們采用了這樣的兩種對比方案:一是直接調整乒乓球的參數,而不改變速度與角速度的參數(藍色軌跡),另一方面是調整乒乓球到小球,同時增大角速度(黑色軌跡),對比結果如下:

這個結果給我們傳遞的信息是,如果只是改了大球,但是能通過訓練保持跟原本小球同等的初始速度和角速度的話,其實大球的軌跡曲率會更高,或者說軌跡更加的詭異。而就算是現在從大球換回小球,也需要在大球的角速度基礎上增加20%的角速度,才有可能在小球上達到比大球下更拐的旋轉。當然這些對比可能相對比較片面,僅僅可以作為一個效果參考。

總結概要

本文通過對馬格努斯力的模擬,來理解乒乓球的弧圈原理。並且在這個理論基礎之上對比了幾種場景下的乒乓球軌跡,比如乒乓球的運動速度,或者日常所說的撞擊對乒乓球軌跡的影響。還有乒乓球的角速度,也就是日常我們所說的摩擦對乒乓球軌跡的影響。還有一個在乒乓球界堪稱變革的小球改大球對乒乓球這項運動可能帶來的影響。由於這方面讀過的理論文章較少,本文僅僅作為一個娛樂參考即可。

版權聲明

本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/pingpong.html

作者ID:DechinPhy

更多原著文章請參考:https://www.cnblogs.com/dechinphy/

打賞專用鏈接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

騰訊雲專欄同步:https://cloud.tencent.com/developer/column/91958

參考鏈接

  1. www1.grc.nasa.gov/beginners-guide-to-aeronautics/ideal-lift-of-a-spinning-ball/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM