gpt4 book ai didi

python - 极坐标图马格努斯效应未显示正确的数据

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:42 30 4
gpt4 key购买 nike

我想在极坐标图上绘制旋转圆柱体周围流动的速度方程。 (这些方程来自 Andersen 的《空气动力学基础》。)您可以在 for 循环语句中看到这两个方程。

我无法大声喊叫设法将计算出的数据表示到极坐标图上。我已经尝试了我的每一个想法,但一无所获。我确实检查了数据,这个似乎一切正确,因为它的行为应该如此。

这是我上次尝试的代码:

import numpy as np
import matplotlib.pyplot as plt


RadiusColumn = 1.0
VelocityInfinity = 10.0
RPM_Columns = 0.0#
ColumnOmega = (2*np.pi*RPM_Columns)/(60)#rad/s
VortexStrength = 2*np.pi*RadiusColumn**2 * ColumnOmega#rad m^2/s

NumberRadii = 6
NumberThetas = 19

theta = np.linspace(0,2*np.pi,NumberThetas)
radius = np.linspace(RadiusColumn, 10 * RadiusColumn, NumberRadii)


f = plt.figure()
ax = f.add_subplot(111, polar=True)

for r in xrange(len(radius)):
for t in xrange(len(theta)):


VelocityRadius = (1.0 - (RadiusColumn**2/radius[r]**2)) * VelocityInfinity * np.cos(theta[t])
VelocityTheta = - (1.0 + (RadiusColumn**2/radius[r]**2))* VelocityInfinity * np.sin(theta[t]) - (VortexStrength/(2*np.pi*radius[r]))
TotalVelocity = np.linalg.norm((VelocityRadius, VelocityTheta))


ax.quiver(theta[t], radius[r], theta[t] + VelocityTheta/TotalVelocity, radius[r] + VelocityRadius/TotalVelocity)


plt.show()

正如您所看到的,我现在将 RPM 设置为 0。这意味着流量应该从左到右,并且在水平轴上对称。 (流动应该在两侧以相同的方式绕着圆柱体流动。)然而,结果看起来更像是这样的:

Polar plot result - not correct!

这完全是胡说八道。似乎有一个漩涡,即使没有设置!更奇怪的是,当我只显示从 0 到 pi/2 的数据时,流程发生了变化!

Polar plot result first quadrant - total mayhem

正如您从代码中看到的,我尝试使用单位向量,但显然这不是正确的方法。我将不胜感激任何有用的意见。

谢谢!

最佳答案

基本问题是极轴 Axes 对象的 .quiver 方法仍然需要笛卡尔坐标中的向量分量,因此您需要转换 theta 和径向分量给 x 和 y 自己:

for r in range(len(radius)):
for t in range(len(theta)):

VelocityRadius = (1.0 - (RadiusColumn**2/radius[r]**2)) * VelocityInfinity * np.cos(theta[t])
VelocityTheta = - (1.0 + (RadiusColumn**2/radius[r]**2))* VelocityInfinity * np.sin(theta[t]) - (VortexStrength/(2*np.pi*radius[r]))
TotalVelocity = np.linalg.norm((VelocityRadius, VelocityTheta))

ax.quiver(theta[t], radius[r],
VelocityRadius/TotalVelocity*np.cos(theta[t])
- VelocityTheta/TotalVelocity*np.sin(theta[t]),
VelocityRadius/TotalVelocity*np.sin(theta[t])
+ VelocityTheta/TotalVelocity*np.cos(theta[t]))

plt.show()

fixed figure

但是,您可以通过使用矢量化来极大地改进您的代码:您不需要循环遍历每个点来获取您需要的内容。所以相当于你的代码,但更清晰:

def pol2cart(th,v_th,v_r):
"""convert polar velocity components to Cartesian, return v_x,v_y"""

return v_r*np.cos(th) - v_th*np.sin(th), v_r*np.sin(th) + v_th*np.cos(th)


theta = np.linspace(0, 2*np.pi, NumberThetas, endpoint=False)
radius = np.linspace(RadiusColumn, 10 * RadiusColumn, NumberRadii)[:,None]

f = plt.figure()
ax = f.add_subplot(111, polar=True)

VelocityRadius = (1.0 - (RadiusColumn**2/radius**2)) * VelocityInfinity * np.cos(theta)
VelocityTheta = - (1.0 + (RadiusColumn**2/radius**2))* VelocityInfinity * np.sin(theta) - (VortexStrength/(2*np.pi*radius))
TotalVelocity = np.linalg.norm([VelocityRadius, VelocityTheta],axis=0)

VelocityX,VelocityY = pol2cart(theta, VelocityTheta, VelocityRadius)

ax.quiver(theta, radius, VelocityX/TotalVelocity, VelocityY/TotalVelocity)

plt.show()

fixed, vectorized final figure

一些值得注意的变化:

  • 我将 endpoint=False 添加到 theta:由于您的函数在 2*pi 中是周期性的,因此您不需要绘制端点两次。请注意,这意味着当前您有更多可见箭头;如果您想要原始行为,我建议您将 NumberThetas 减少 1。
  • 我将 [:,None] 添加到 radius 中:这将使其成为二维数组,因此速度定义中的后续操作将为您提供二维数组:不同的列对应不同的角度,不同的行对应不同的半径。 quiver 与数组值输入兼容,因此只需调用 quiver 即可完成您的工作。
  • 由于速度现在是 2d 数组,因此我们本质上需要在 3d 数组上调用 np.linalg.norm,但如果我们指定要处理的轴,这将按预期工作。
  • 我定义了 pol2cart 辅助函数来完成从极坐标分量到笛卡尔分量的转换;这不是必要的,但这样对我来说似乎更清楚。

最后一句话:我建议选择较短的变量名,并且不使用驼峰命名法。这可能也会使您的编码速度更快。

关于python - 极坐标图马格努斯效应未显示正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43630029/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com