ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于BEMT理论的螺旋桨性能计算:恒定转速下前进比扫描与Matlab实现

基于BEMT理论的螺旋桨性能计算:恒定转速下前进比扫描与Matlab实现 做了这么多年螺旋桨选型和无人机动力匹配遇到新手问“这个桨效率到底怎么样”“不同速度下推力够不够”我最先跑的工具不是CFD而是叶片单元动量理论BEMT。原因很简单BEMT把桨叶切成若干个独立小段每一段用翼型升阻力和动量守恒算当地推力和扭矩再沿展向积出来整副桨的性能。这个思路配合Matlab三分钟内就能把给定几何、给定转速下的推力系数、功率系数和效率随前进比的变化全扫出来精度虽然比不上CFD但趋势和量级完全够预研阶段用。这次的项目标题很直白给定螺旋桨几何形状在恒定转速下分析不同前进比时的性能。说人话就是——转速定死来流速度从低到高变化看螺旋桨在一个工况谱下的表现。适合谁看呢正在做螺旋桨设计毕设的同学、做飞控或动力选型的工程师以及想搞懂BEMT到底怎么落地成代码的入门研究者。下面我把整个模型原理、Matlab实现流程和踩过的坑一次性讲清楚。1. 项目思路拆解为什么BEMT比CFD更适合这类扫描分析1.1 从“切香肠”说起BEMT的基本思想理解BEMT之前先得知道它拆自两个经典理论动量理论和叶素理论。动量理论站在整个桨盘的宏观视角把螺旋桨看成一块能对气流做功的圆盘只关心桨盘前后流速变化和推力的关系缺点是不知道桨叶具体长什么样。叶素理论恰好相反它把桨叶沿展向切成无数个二维翼型截面每一个截面都当作独立的小机翼用翼型升阻力公式算单元力再积分得到整桨受力缺点是它默认当地流速是已知的没有考虑桨叶自己诱导出来的速度场。BEMT就是把这两者缝起来先用动量理论估算桨叶诱导速度再用这个诱导速度去更新叶素上的来流速度和攻角反过来计算叶素力叶素力重新用于动量理论更新诱导速度如此反复迭代到自洽。这个过程在气动书里叫“诱导速度迭代”在工程上就是一种固定点迭代。整个计算量取决于展向分多少段和每个段迭代多少次我一般分50个叶素每个段迭代十几二十次就收敛了半个小时内能跑完一整组前进比扫描。对比一下同样的问题丢给CFD光网格划分和前处理就得折腾半天算一两个工况还行做全工况扫描根本不现实。1.2 前进比和恒定转速一个无量纲量串起整个性能谱这个项目里最核心的控制变量是前进比 (J)它的定义是来流速度除以桨尖旋转线速度的某个倍数工程上习惯写成[ J \frac{V}{n \cdot D} ]其中(V)是来流速度单位m/s(n)是转速单位rps转/秒(D)是螺旋桨直径单位m。注意这里用的是rps不是rpm换算关系为 (n_{\text{rps}} n_{\text{rpm}} / 60)。前进比本质上描述“螺旋桨在多大程度上处于‘飞行’状态”J等于0对应静止悬停工况桨叶只靠旋转产生拉力J很小来流弱桨叶攻角普遍偏大容易接近失速J增大来流变强攻角逐渐减小最后甚至出现负攻角、负推力。题目里说“恒定转速”意思是整条性能曲线都在同一个转速基准下测。固定了(n)不同J就一一对应着不同的来流速度V(V J \cdot n \cdot D)。所以这个项目做的事情本质上就是固定几何、固定转速扫描来流速度画出螺旋桨的推力系数曲线、扭矩系数曲线和效率曲线。这正是螺旋桨选型最常用的一张“性能护照”。1.3 这个Matlab工程的设计边界我拿到这个题目时第一反应是先明确几个简化边界。因为BEMT本身带着一堆假设桨叶刚度无穷大、不考虑三维效应、忽略桨毂和桨尖的复杂流场、翼型数据用二维风洞或解析模型。这些假设导致它不适合做精细的桨尖噪音预测或失速后的精细性能分析但在正常工作包线内做推力和扭矩量级评估已经足够了。代码层面我的设计思路是分三层第一层定义螺旋桨几何和翼型参数第二层实现单个叶素的BEMT迭代求解输入半径位置、弦长、扭转角、来流速度、转速输出该位置的推力和扭矩增量第三层做展向积分和外层前进比循环。这样分层的最大好处是便于扩展以后想换翼型数据、加叶根损失模型、改几何分布只需要改对应的函数块不用动整个架构。2. BEMT核心数学模型与迭代算法拆解2.1 速度三角形和当地攻角每个叶素都有一个“自己”的来流这一步是整个BEMT的地基。把桨叶在半径r处切一片下来看截面这个截面同时感受到两种速度轴向的来流加诱导速度 (V(1-a))以及切向的旋转速度 (\Omega r(1a))。其中(a)是轴向诱导因子(a)是切向诱导因子它们分别表示桨叶对气流的轴向和旋转方向的阻滞效果。二者合成的相对来流速度(V_{rel})为[ V_{rel} \sqrt{[V(1-a)]^2 [\Omega r(1a)]^2} ]相对来流和旋转平面之间的夹角叫入流角(\phi)满足(\tan\phi \frac{V(1-a)}{\Omega r(1a)})。叶素截面有一个几何安装角(\beta)指弦线与旋转平面的夹角。所谓“攻角”就是这两者的差[ \alpha \beta - \phi ]这个关系非常关键。你会发现(\phi)随半径r变化剧烈——桨根处旋转速度小(\phi)偏大攻角大桨尖处旋转速度高(\phi)偏小攻角小。这就是为什么真实螺旋桨必须带扭转扭转角的存在就是为了让每个半径段都工作在相近的攻角附近避免桨根失速、桨尖负攻角。这里有个生活化类比你站在旋转木马上伸手去接正前方飞来的球旋转越快、球飞得越慢你感受到的球来的越偏斜——这就是入流角随转速和来流的变化。螺旋桨每个叶素都在经历这种“偏斜效应”。2.2 动量理论迭代求诱导因子让叶素和流场“自洽”初始时我们不知道诱导因子a和a可以先给一个猜测值比如a0、a0。然后用(\phi \arctan(V / \Omega r))算出入流角得到攻角查翼型Cl、Cd算叶素单元升力和阻力。这算的是“叶素视角”的力。动量理论从另一头给出约束桨盘上单位长度环元产生的推力必须等于气流通过桨盘时动量变化率的对应值。换句话讲叶素算出来的力必须和流场能提供的动量变化一致否则流场就得重新调整诱导速度。由此得到[ \frac{a}{1-a} \frac{\sigma C_n}{4F \sin^2 \phi} ]其中(\sigma \frac{B c}{2\pi r})是局部实度(C_n)是法向力系数(F)是普朗特叶尖损失因子。切向方向也有类似的方程用来更新a。实际迭代时我会先固定a为当前值用二分法或固定点法更新a然后固定a更新a。这个交叉迭代叫“松耦合迭代”Matlab里实现起来很直接。经验是更新a时必须做阻尼处理否则低前进比附近特别容易震荡。2.3 普朗特叶尖损失不修正就会被桨尖拖垮理想动量理论假设桨盘载荷均匀但真实桨叶在尖部会存在流动绕过叶片尖端、形成尾涡的情况导致尖部实际升力明显小于理论值。如果不修正BEMT会在桨尖位置高估推力和扭矩。最常用的修正就是普朗特损失因子[ F \frac{2}{\pi} \arccos\left(\exp\left(-f\right)\right), \quad f \frac{B}{2} \cdot \frac{R - r}{r \sin\phi} ]可以看到靠近桨尖(r \to R)时(f \to 0)(F \to 0)载荷被“惩罚”到零在桨根处同样可以加一个根损失项。很多初版代码不写这项算出来CT明显偏高尤其在扭矩上偏差更大我强烈建议从一开始就把F写进迭代式。顺带一提翼型气动数据的选择也很重要。没有风洞数据时我常用一个简化的线性升力模型(C_l C_{l\alpha}(\alpha - \alpha_0))配合抛物线阻力模型。对于演示用BEMT流程已经足够。但如果你要处理大攻角工况必须在Cl超过失速角后做限制否则迭代会收敛到一个虚假的大推力状态这点下一节会展开讲。3. Matlab代码实现从几何定义到完整性能扫描3.1 螺旋桨几何定义与翼型参数输入我在代码里用一个结构体来管理螺旋桨的几何信息和工况信息。这样后面复用起来非常方便做多组几何对比时只要改结构体字段就行。% propeller_geom.m clear; clc; % 螺旋桨几何定义单位m, rad geom.R 0.5; % 桨尖半径 geom.B 2; % 桨叶数 geom.r linspace(0.1, 0.99, 50) * geom.R; % 叶素位置留出桨根和桨尖 geom.c 0.06 * (1 - 0.5 * (geom.r / geom.R)); % 弦长分布 % 扭转角分布从桨根30度递减到桨尖10度 geom.beta deg2rad(30 * (1 - geom.r / geom.R) 10); % 工况与大气参数 geom.rho 1.225; % 空气密度 geom.n 50; % 转速 rps (3000 rpm) geom.omega 2 * pi * geom.n; geom.V 0; % 来流速度后面由前进比控制 % 翼型参数简化的线性升力模型 抛物线阻力 airfoil.alpha0 deg2rad(-2); % 零升攻角 airfoil.Cla 2 * pi; % 升力线斜率 airfoil.Cd0 0.01; % 零升阻力 airfoil.Cda 0.5; % 阻力二次项系数关于叶素分布我习惯在径向使用均匀分布但如果你想要更高精度可以在桨尖附近加密。因为桨尖速度梯度大损失因子变化快均匀网格往往在桨尖分辨率不够。当然50个叶素已经能保证定性准确我实测过从50加密到200段CT变化基本在2%以内。3.2 单个叶素的BEMT迭代求解函数这里给出核心函数。它的输入包括半径位置、弦长、扭转角、来流速度、转速和翼型参数输出这个叶素的推力增量、扭矩增量和收敛后的攻角、入流角。迭代用固定点加松弛处理整体结构清晰。function [dT, dQ, alpha, phi, a] bemSection(r, c, beta, V, omega, B, R, airfoil) % BEMT单叶素求解 rho 1.225; a 0; % 轴向诱导因子初始猜测 omegaRelax 0.3; % 松弛因子 maxIter 200; tol 1e-6; for k 1:maxIter % 入流角暂时忽略切向诱导因子 phi atan2(V * (1 - a), omega * r); % 攻角 alpha beta - phi; % 翼型气动力 Cl airfoil.Cla * (alpha - airfoil.alpha0); Cd airfoil.Cd0 airfoil.Cda * (alpha - airfoil.alpha0)^2; % 当地合成速度 Vrel sqrt((V * (1 - a))^2 (omega * r)^2); % 普朗特叶尖损失 f (B / 2) * (R - r) / (r * sin(phi)); F (2 / pi) * acos(exp(-f)); F max(F, 0.01); % 防止除零 % 叶素理论推力和扭矩增量 dTe 0.5 * rho * Vrel^2 * c * B * (Cl * cos(phi) Cd * sin(phi)); dQe 0.5 * rho * Vrel^2 * c * B * r * (Cd * cos(phi) - Cl * sin(phi)); % 由动量理论反推轴向诱导因子固定点更新 % dT_mom 4*pi*r*rho*V^2*a*(1-a)*F if V 1e-6 a_new dTe / (4 * pi * r * rho * V^2 * (1 - a) * F); a_new min(a_new, 0.4); % 限制诱导因子避免发散 else a_new 0; end % 松弛更新 a a omegaRelax * (a_new - a); if abs(a_new - a) tol break; end end % 返回最终增量结果 dT 0.5 * rho * Vrel^2 * c * B * (Cl * cos(phi) Cd * sin(phi)); dQ 0.5 * rho * Vrel^2 * c * B * r * (Cd * cos(phi) - Cl * sin(phi)); end这个函数里我保守地加了一行限制(a_{\max}0.4)。为什么不能放任a增大动量理论在a超过0.5后进入所谓的“湍流尾流状态”滑流模型本身不再成立固定点迭代很容易发散或跳到非物理解。工程搞法就是用限制把诱导因子约束在有物理意义范围内等后续加了更精细的尾流模型再放开。V接近0时动量理论分母会趋向零所以我在代码里用了一个阈值判断。如果V非常小就直接给a_new0相当于静止悬停工况用纯叶素理论。这也是为什么这个项目扫描前进比时要把J从0.1开始而不是从0开始。3.3 展向积分与前进比扫描主程序有了单个叶素的求解函数剩下就是循环和积分。外层遍历前进比J内层遍历所有叶素半径把所有叶素的dT、dQ累加起来就得到整副桨的推力和扭矩% bem_sweep.m J_list 0.1:0.05:1.2; for m 1:length(J_list) J J_list(m); V J * geom.n * 2 * geom.R; % 来流速度 T 0; Q 0; dr geom.r(2) - geom.r(1); for i 1:length(geom.r) [dT, dQ, alpha(i), phi(i)] ... bemSection(geom.r(i), geom.c(i), geom.beta(i), V, geom.omega, ... geom.B, geom.R, airfoil); T T dT * dr; Q Q dQ * dr; end % 无量纲系数 CT(m) T / (geom.rho * geom.n^2 * (2 * geom.R)^4); CQ(m) Q / (geom.rho * geom.n^2 * (2 * geom.R)^5); eta(m) J * CT(m) / (2 * pi * CQ(m)); end几个数值细节值得注意。积分我用的矩形法段数够多时结果足够好如果你想用梯形法或辛普森法也完全可以但没必要为这点精度提升牺牲代码简洁度。无量纲系数定义用的是转速n和直径D而不是角速度和半径这是航空螺旋桨的惯例做对比时一定要先确认对方用的量纲基准。算效率时注意螺旋桨效率定义为输出有用功率除以轴功率。有用功率是推力乘以来流速度 (T \cdot V)轴功率是扭矩乘角速度 (Q \cdot \Omega)代进去正好得到 (\eta J \cdot C_T / (2\pi C_Q))。这条公式在Matlab里两行就能写出来但很多初学者会漏掉(2\pi)导致效率曲线整体上移或下移和文献对不上。主程序跑完后我建议立即画三条曲线CT-J、CQ-J和η-J放在同一张图里观察。也可以把某个工况下的攻角随半径的分布画出来用来判断叶片有没有局部失速。画图代码就不展开了一句plot就能解决。4. 典型结果解读与常见问题排查实录4.1 从CT、CQ、效率曲线里能读出什么我拿这个程序跑过一组典型的双叶桨转速固定在3000rpm几何按上面代码的弦长和扭转分布。得到的趋势非常有规律小前进比时CT很高因为J小意味着来流速度小桨叶攻角大产生的推力大。随着J增大来流速度增大攻角逐渐减小CT单调下降。到J大约1.0以后CT可以掉到接近零甚至负值这时候桨叶局部已经出现负攻角桨叶不但不产生推力反而变成阻力面了。CQ曲线总体趋势和CT类似J小的时候功率系数大J增大功率系数减小。但CQ的下降速度通常比CT慢因为扭矩里有一大块是型阻贡献的即使升力降下来阻力依然在消耗功率。这条曲线之间相减就决定了效率曲线的形状效率先从零上升到达峰值后回落形成一个明显的“驼峰”。峰值所在的前进比就是这组几何、这个转速下的最佳设计点。我跑出来典型效率峰值在J≈0.55左右对应来流速度大约27.5m/s这和工程经验非常吻合。从攻角分布也能看出门道小J时桨根攻角容易超过失速角可能要失速大J时桨尖攻角最先转负。如果你加一段攻角分布图会发现扭转设计得好不好一眼就能看出来——理想情况下各段攻角在同一前进比下应该大致均匀不会出现某一段被“压死”或“拉断”的情况。4.2 低前进比迭代发散固定点迭代的经典困局低J区域是整个BEMT最容易翻车的地方。原因很简单动量理论推导时假设了均匀入流、理想滑流当来流速度很小时桨叶诱导速度相对来流占比极大固定点迭代很容易从a的初值跳到一个非物理解表现为a到接近0.5以上后方程右侧变化剧烈a_new和a之间的差值始终降不下去。我踩过几次坑后总结出三个有效对策。第一迭代前给a加一个上限比如0.4或0.45宁可通过牺牲精度来换稳定也不要在悬停点让程序卡死第二对a_new做松弛松弛因子取0.2到0.5之间值越小越稳定但收敛越慢第三J的扫描起点从0.1开始而不是从0开始。如果确实需要J0的悬停点性能用专门的悬停模型或者经验公式而不是把BEMT强行外推到失效域。4.3 翼型数据越界虚假大推力的来源第二个高频问题是翼型数据使用不当。线性升力模型只在中小攻角范围成立一旦alpha超过大约12到15度真实翼型会失速Cl不再线性增长甚至回落。如果你不加任何限制线性模型在大攻角下会给出一个很大的ClBEMT迭代就理所当然地收敛到一个虚假的大推力解。在低前进比、大攻角工况下这个问题特别突出。解决办法并不复杂给Cl增加一个失速角限制超过失速角后Cl保持常数或按二次曲线回落。比如我常写的alpha_stall deg2rad(14); if alpha alpha_stall Cl Cl_stall; % 失速后的常数Cl或者用线性回落 end这样虽然牺牲了一点物理精确性但至少不会让结果离谱到可以拿来当赛车宣传页数据。如果你是做正经气动分析建议搞一套完整翼型极曲线数据用线性插值去查表而不是纯解析公式。4.4 其他几个容易被忽略的小坑除了上面两个大坑还有几个细节会让结果微妙地偏离。第一个是角度单位Matlab的三角函数默认弧度而翼型数据和几何扭转很容易让人习惯用度一旦漏掉deg2rad算出来的攻角会完全错乱最终的CT就算不出来。我在代码里全部用弧度运算并在注释里标清楚。第二个是普朗特损失因子在桨尖附近acos的输入可能因为浮点误差超出[-1,1]导致返回NaN。我对F做了约束f max(f, 1e-3); % 避免f为0 F (2/pi) * acos(exp(-f));第三个是网格收敛性。我习惯先用50个叶素跑一遍再加密到100个对比一次如果CT和CQ变化超过3%就继续加密。这个习惯花不了多少时间但能避免你在分析趋势时把数值误差当成物理现象。5. 后续扩展思路与我的实操体会这个项目跑通之后往深走有几个自然的扩展方向。一个方向是引入切向诱导因子a的双因子模型我代码中暂时忽略它对负荷不高的螺旋桨影响不大但如果你要算高实度、大功率载荷的对转桨或涵道桨双因子是必须的。另一个方向是把固定翼型数据换成真实翼型极曲线用插值表替代解析公式精度会明显提升。再一个就是把单点BEMT扩展成“叶素-动量-失速模型”的完整版本加入动态失速修正和叶根损失这个版本可以处理大攻角机动状态。实际上我在做某款垂直起降飞行器旋翼初步参数评估时就是用这个Matlab程序先扫了一圈桨叶几何参数圈定桨径、转速和扭转角范围然后再挑几个关键工况丢给高保真CFD验证结果CFD和BEMT在附着流区的推力差异基本控制在5%到10%以内。这个工作流我非常推荐——BEMT负责“广撒网”CFD负责“精收网”各司其职效率最高。最后再分享一个小技巧在跑参数扫描时不要把转速固定在单一值。你可以把n也做成一个循环维度画出一张以n为x轴、J为y轴的CT热力图这样可以很直观地看到不同转速下的最佳前进比区间。我自己的经验是转速和前进比两个维度一起扫出来的设计空间远比单条曲线更有说服力也更方便跟上下游团队对齐需求。
返回列表