我复现了香蕉球

今天咱们就来研究一下香蕉球。这种在运动中会转弯的球,大家常叫它香蕉球,那么究竟是什么力让它变了运动方向呢?

首先,这类现象中的小球,它在运动中都是旋转的。旋转的小球在空气中运动,由于空气粘性,球周围空气被带动起来,流动方向和旋转方向相同一侧的空气被加速,而另一侧的空气被减速。这一加一减,导致小球周围形成一个非圆形的边界层区域。在这个区域外,被加速一侧的空气流动路径被挤压,造成该侧空气流速比另一侧大。根据伯努利原理,流速大压强小,根据伯努利原理,一侧流速变大压强变小,另一侧流速变小压强变大,球两侧形成压力差,就受到一个侧向的力,使运动方向发生偏转。

为了让大家更直观地看到球旋转中两侧的压力差,用AICFD做了个仿真。让空气以50m/s的速度吹过来代替小球飞行,当不旋转时,球周围的压力对称,小球不会受到侧向力。但当球转起来后,上面流速明显增大,压力变小,于是,小球就受到了侧向力的作用。

这个现象,虽然在1672年,牛顿就在看网球中发现了这个使球偏转的力,但直到1852年,德国物理学家马格努斯正式描述了这个效应后,人们才将它命名为马格努斯效应。一定程度内,球表面越粗糙,马格努斯效应越明显。

足球不是一个光滑的球面,而是由32块皮缝制成的。从流体力学的角度,一个是能减小飞行阻力(参考前期文章“高尔夫球为什么有这么坑”),另一个是可以增强马格努斯效应,更容易踢出香蕉球。

理论和仿真想必大家都很理解了,下面做什么呢?没错,你懂我的,我想复现香蕉球。说起来很简单,让球转起来飞,就可以了。可能不太明显。

借用了阿飞的风扇,为了防止旋转时,有从下面吹上来的风的干扰,把这个扇叶拆了。

然后给小船找了个水池。假设这个球向前飞,就相当于我给它一个向后的风,一会儿让小球顺时针转,根据刚刚的分析,它会受到向左侧的力,而向左侧移动。反方向吹风,相当于球往另外一侧飞,它就受到向右的侧向力,从而向右侧移动啦!马格努斯效应还是很明显的。

除了足球,网球、乒乓球、排球、棒球等都会用到这个现象,让旋转的球,产生侧向力,打出弧度。

除了球类运动,马格努斯效应在工程上也有应用。上世纪80年代,就出现了装着大圆筒的船,根据风的速度和方向,圆筒可以自动调整旋转方向和速度,横风吹来时,产生向前推力,起到省油的效果。今年6月17日,国内第一艘安装转筒帆的船在江苏正式起航。四根直径3米,高24米的大圆筒,可以给船省油5%-10%。

在军事领域马格努斯效应对于旋转弹丸和导弹的设计、制导控制也有着重要的作用。

本期关于香蕉球和马格努斯效应就讲到这里啦,大家还想了解哪些自然现象,欢迎给我弹幕留言,能研究的,就安排!咱们下期见!拜拜

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个简单的遗传算法的 Python 实现示例: ```python import numpy as np # 遗传算法参数 POP_SIZE = 50 # 种群大小 DNA_SIZE = 10 # DNA 长度 CROSSOVER_RATE = 0.8 # 交叉概率 MUTATION_RATE = 0.01 # 变异概率 N_GENERATIONS = 200 # 迭代次数 def F(x): """目标函数,这里以一个简单的函数 f(x) = x^2 为例""" return x**2 def translateDNA(pop): """将二进制 DNA 转化为具体的数值""" return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE-1) * 5 def get_fitness(pop): """计算种群中每个个体的适应度值""" x = translateDNA(pop) return F(x) def select(pop, fitness): """通过轮盘赌选择操作生成新的种群""" idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True, p=fitness/fitness.sum()) return pop[idx] def crossover_and_mutation(pop): """对种群进行交叉和变异操作""" new_pop = [] for parent in pop: child = parent.copy() if np.random.rand() < CROSSOVER_RATE: # 随机选择另一个个体进行交叉 crossover_idx = np.random.randint(0, POP_SIZE, size=1) cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool) child[cross_points] = pop[crossover_idx, cross_points] # 变异操作 mask = np.random.rand(DNA_SIZE) < MUTATION_RATE child[mask] = 1 - child[mask] new_pop.append(child) return np.array(new_pop) # 初始化种群 pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) # 迭代遗传算法 for _ in range(N_GENERATIONS): fitness = get_fitness(pop) pop = select(pop, fitness) pop = crossover_and_mutation(pop) # 打印最优解 x = translateDNA(pop) best_idx = np.argmax(F(x)) print("最优解 x:", x[best_idx]) print("最优解 f(x):", F(x[best_idx])) ``` 在这个示例中,我们以目标函数 f(x) = x^2 为例,使用二进制编码来表示个体的 DNA。遗传算法的主要步骤包括初始化种群、计算适应度值、选择、交叉和变异。最后,打印出迭代过程中得到的最优解。 你可以根据自己的需求和目标函数进行修改和扩展。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值