空气阻力对乒乓球运动轨迹的影响

技术背景

乒乓球作为国球,不仅仅是在奥运等众多赛场上为中国收纳了多枚奖牌,更是在民间广为大家所好。在上一篇博客中主要讲述了马格努斯力在乒乓球的运动过程中的应用,并且从俯视图的角度看到了乒乓球的各种旋转下的弧圈轨迹。本文主要讲述的是空气阻力对乒乓球的运动过程的影响。

空气阻力的模拟

我们所了解到的空气阻力的表达式为:

\[F=C\rho Sv^2 \]

其中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

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

posted @ 2022-02-15 19:07  DECHIN  阅读(1152)  评论(1编辑  收藏  举报