You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python/Numpy新手求高效计算双自变量气流数据及优化绘图方法

优化Numpy气流计算与批量绘图方案

针对你提到的手动逐个计算不同k值对应的流量、扩展性差的问题,我们可以利用Numpy的向量化运算广播机制来简化代码,大幅提升大规模场景下的效率,同时让绘图逻辑更简洁。

核心优化思路

  1. ks从列表转为Numpy数组,利用广播自动完成每个k值与所有dp_inWC元素的组合计算
  2. 用一个二维数组统一存储所有k值对应的流量结果,避免重复写计算语句
  3. 基于数组批量绘图,无需手动逐个调用plot

优化后的完整代码

import numpy as np
import matplotlib.pyplot as plt

#-------------------------------------------------------------------------
# Flow calculations
#-------------------------------------------------------------------------
# Input parameters
ps = 14.4  # static pressure (psi)
d = 47.25  # ID (inch)
dp_inWC = np.linspace(0, 15, 100)  # pressure head (inH2O)

# Airflow calculation constants
Fna = 0.0997  # Unit conversion factor for lbm/s
Faa = 1.0  # Thermal expansion factor
blck = 0.02856  # Probe blockage
gam = 1.401  # Ratio of specific heats
rho = 0.0729  # humid air density (lbm/ft3)

# Gas expansion factor (vectorized calculation)
Ya = 1 - (0.011332*(1-blck)**2 - 0.00342)*dp_inWC/(ps*gam)

# Convert ks to Numpy array for vectorized operations
ks = np.array([0.6748, 0.6615])  # K-factor of probe, add more values here as needed

# Vectorized mass flow calculation: shape becomes (len(ks), len(dp_inWC))
m_dot = Fna * ks[:, np.newaxis] * d**2 * Faa * Ya * np.sqrt(rho*dp_inWC)

#----------------------------------------------------------------------------
# Plots
#----------------------------------------------------------------------------
fig1, ax1 = plt.subplots()

# Set plot properties
ax1.set_title('Delta Pressure vs Mass Flow Rate', color='tab:red', fontweight='bold')
ax1.set_xlabel('dP (inH2O)')
ax1.set_ylabel('Mass Flow (lbm/s)')

# Batch plot all curves: transpose m_dot to match dp_inWC's shape
lines = ax1.plot(dp_inWC, m_dot.T)

# Add legends dynamically based on ks values
ax1.legend(lines, [f'k={k:.4f}' for k in ks])

fig1.tight_layout()
plt.show()

关键细节解释

  • 广播机制的应用ks[:, np.newaxis]把一维的ks变成了列向量(形状(2,1)),这样和一维的Yasqrt(rho*dp_inWC)(形状(100,))运算时,Numpy会自动扩展维度,最终得到(2,100)m_dot数组,每一行对应一个k值的全流量数据。
  • 扩展性:如果后续需要增加更多k值,只需要在ks数组里添加元素即可,计算和绘图代码完全不需要修改。
  • 效率提升:Numpy的向量化运算底层用C实现,比手动循环Python代码快几十到上百倍,尤其当ks元素数量多、dp_inWC规模大时优势更明显。
  • 批量绘图ax1.plot(dp_inWC, m_dot.T)会自动为m_dot.T的每一列(对应一个k值)绘制一条曲线,配合动态生成的图例,代码非常简洁。

额外小技巧

如果需要对曲线样式做统一或个性化设置,可以在plot里添加参数,比如:

ax1.plot(dp_inWC, m_dot.T, linestyle='-', marker='.', markersize=3)

内容的提问来源于stack exchange,提问作者jb1225

火山引擎 最新活动