# Python流体动力学共形映射库埃特式流

{% tabs %}
{% tab title="关键词" %}
Python | 流体动力学 | 共形映射 | 库埃特式流 | 纳维-斯托克斯方程 | Matplotlib | seaborn | Numpy
{% endtab %}

{% tab title="梗概" %}
### 流体动力学简述

在物理学和工程学中，流体动力学是流体力学的一个分支学科，它描述了流体——液体和气体的流动。 它有几个子学科，包括空气动力学（研究空气和其他运动中的气体）和流体动力学（研究运动中的液体）。 流体动力学具有广泛的应用，包括计算飞机上的力和力矩、确定通过管道的石油质量流量、预测天气模式、了解星际空间中的星云和模拟裂变武器爆炸。

流体动力学提供了一个系统结构——它是这些实践学科的基础——它包含从流量测量得出的经验和半经验定律，并用于解决实际问题。 流体动力学问题的解决方案通常涉及计算流体的各种特性，例如流速、压力、密度和温度，作为空间和时间的函数。

### 共形映射简述

在数学中，共形映射是一种局部保留角度但不一定保留长度的函数。

共形映射，也称为保角映射、保角变换或双全纯映射，是一种保留局部角度的变换 $w=f^{\prime}(z)$。 解析函数在其具有非零导数的任何点上都是共形的。 相反，具有连续偏导数的复变量的任何保形映射都是解析的。 保形映射在复杂分析以及物理和工程的许多领域中极为重要。

上面的第一张图说明了规则网格的几种保形变换。 在上面的第二幅图中，常数的轮廓与变换后的对应轮廓一起显示。

保形映射对于解决工程和物理学中的问题非常宝贵，这些问题可以用复杂变量的函数来表示，但呈现出不方便的几何形状。通过选择适当的映射，分析人员可以将不方便的几何图形转换为更方便的几何图形。例如，人们可能希望计算电场 $E(z)$，它是由位于相隔一定角度的两个导电平面的角附近的点电荷产生的（其中 $z$ 是复坐标2空间中的一点）。这个问题本身很难以封闭的形式解决。然而，通过使用一个非常简单的保角映射，不方便的角度被映射到精确的 $\pi$ 弧度之一，这意味着两个平面的角被转换为一条直线。在这个新领域中，问题（计算位于导电壁附近的点电荷所施加的电场）很容易解决。

### 库埃特式流简述

在流体动力学中，库埃特流是粘性流体在两个表面之间的空间中的流动，其中一个表面相对于另一个表面切向移动。 表面的相对运动对流体施加剪切应力并引起流动。 根据术语的定义，在流动方向上也可能存在施加的压力梯度。

库埃特配置模拟了某些实际问题，例如地球的地幔和大气，并在轻载径向轴承中流动。它还用于粘度测定并证明可逆性的近似值。

### Python库埃特式流分析方式

代码片段：

```python
summand = sym.exp(-n*beta)*sym.coth(beta)*sym.sinh(n*(eta-alpha))
summand = summand - sym.exp(-n*alpha)*sym.coth(alpha)*sym.sinh(n*(eta-beta))
summand = (sym.cos(n*xi)/(sym.sinh(n*(beta-alpha))))*summand
Psi_ = sym.Sum((-1)**n*summand, (n, 1, m))

gamma_ = (M_*sym.coth(alpha_.subs(M, M_))).subs(F, F_)
gamma_ = float(gamma_.subs(R2, R2_).subs(R1, R1_).subs(b, abs(shift)))

eta_ = (M**2 - 2*M*(y+gamma) + x**2 + (y+gamma)**2)
eta_ = (M**2 + 2*M*(y+gamma) + x**2 + (y+gamma)**2)/eta_
eta_ = sym.ln(eta_)/2

xi_ = -sym.atan2(2*M*x, (M**2 - x**2 - (y+gamma)**2))

alphaNum = alpha_.subs(M, M_).subs(F, F_).subs(R2, R2_).subs(R1, R1_)
alphaNum = float(alphaNum.subs(b, abs(shift)))

betaNum = beta_.subs(M, M_).subs(F, F_).subs(R2, R2_).subs(R1, R1_)
betaNum = float(betaNum.subs(b, abs(shift)))

cNum = M_.subs(F, F_).subs(R2, R2_).subs(R1, R1_)
cNum = float(cNum.subs(b, abs(shift)))

velW = u.subs(A, A_).subs(B, B_).subs(Psi, Psi_)
velW = velW.subs(alpha, alpha_).subs(beta, beta_)
velW = velW.subs(M, M_).subs(F, F_)
velW = velW.subs(R2, R2_).subs(R1, R1_).subs(b, abs(shift))
velW = velW.subs(gamma, gamma_).subs(u_R, u_R_).subs(mu, mu_)
velW = velW.subs(l, l_).subs(dp, 10**5*dp_)

uwNum = sym.lambdify((xi, eta), velW.subs(m, 100))

# Geometry creation and plotting
Xi = np.linspace(-np.pi, np.pi, 200)
Eta = np.linspace(alphaNum, betaNum, 200)
Xi, Eta = np.meshgrid(Xi, Eta)
fig, ax = plt.subplots(figsize=(9, 9))
plt.pcolor(Xi, Eta, uwNum(Xi, Eta), cmap='rainbow')

# Velocity in z-plane eccentric annulus in $x$ and $y$

velZ = u.subs(A, A_).subs(B, B_).subs(Psi, Psi_)
velZ = velZ.subs(eta, eta_).subs(xi, xi_)
velZ = velZ.subs(alpha, alpha_).subs(beta, beta_)
velZ = velZ.subs(M, M_).subs(F, F_)
velZ = velZ.subs(R2, R2_).subs(R1, R1_).subs(b, abs(shift))
velZ = velZ.subs(gamma, gamma_).subs(u_R, u_R_).subs(mu, mu_)
velZ = velZ.subs(l, l_).subs(dp, 10**5*dp_)
```

### 源代码
{% endtab %}
{% endtabs %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
