ARTICLE DETAIL

资讯详情

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

基于BEMT的螺旋桨性能计算:Matlab实现与前进比扫描分析

基于BEMT的螺旋桨性能计算:Matlab实现与前进比扫描分析 螺旋桨性能计算网上能搜到的资料大多停在“给出推力公式、画个效率曲线”的层面。真到了要分析一个具体螺旋桨几何在不同前进比下的性能时就会发现公式和实际结果之间还隔着一大堆细节桨叶扭转角怎么分布、每个半径处翼型工作在什么攻角、诱导速度怎么迭代收敛。我自己最早被这个题目折腾是研究生做小型无人机螺旋桨匹配的时候一开始想偷懒用经验公式结果换了桨距角之后曲线完全对不上后来老老实实把叶片单元动量理论Blade Element Momentum TheoryBEMT写成Matlab程序才算把这类问题彻底说清楚。这篇文章就把这套分析流程完整拆开讲一遍内容包括BEMT为什么能用来做“给定几何、恒定转速、不同前进比”的性能研究螺旋桨几何输入怎么整理Matlab代码的核心迭代逻辑怎么写以及我实际计算中踩过的收敛坑。适合正在做螺旋桨课程设计、无人机动力选型或者想自己搭一套快速性能评估工具的读者也适合只是想把BEMT原理真正用起来的人。1. 叶片单元动量理论的前世今生为什么螺旋桨分析总绕不开它1.1 动量理论给出了“圆盘点”的宏观答案要理解BEMT得先分两步看。第一步是动量理论它的图像非常简洁把螺旋桨当成一个能对气流做功的致动圆盘气流通过圆盘时速度不能突变压力发生跳变圆盘前后形成滑流。设远前方来流速度是V圆盘处的轴向诱导速度是vi那么通过圆盘的质量流量是ρAVvi推力就等于质量流量乘以速度增量。整理一下可以得到在理想情况下圆盘后的尾迹速度会继续增大直到远后方变成V2vi。换句话说动量理论告诉我们宏观上“桨盘到底能产生多大的推力”它只需要很少的输入速度、密度、盘面面积。这听起来很方便但它有一个致命问题它不关心桨叶长什么样。同样的直径一个宽叶低速螺旋桨和一根细长的竞速螺旋桨在动量理论里推力完全一样。这当然不符合实际。所以动量理论只能作为性能上限或者初步估算没法回答“给定几何形状的螺旋桨在不同前进比下到底怎么表现”这个问题。1.2 叶片单元理论补上桨叶几何信息第二步是叶片单元理论。把桨叶沿半径方向切成很多薄片每个薄片看成独立的二维翼型。每片受到的气动力用二维翼型升力系数CL和阻力系数CD来计算升阻力方向要结合当地速度三角形确定。把所有叶素在半径方向上的推力和扭矩积分起来就得到整个螺旋桨的性能。BEMT就是把上面两步用一个自洽方程联立起来。我常用的说法是动量理论告诉叶素“你所在的环量应该给气流多大的动量增量”叶片单元理论告诉动量环“我实际能提供多大的力”。两者对推力、扭矩的表达式相等从而求出每个半径处的轴向诱导因子a和周向诱导因子a。有了a和a就能得到该半径处的真实入流角进而得到攻角再回头查翼型数据。这一套循环迭代到收敛每个半径处的气动状态就都被确定下来了。1.3 前进比和恒定转速到底在刻画什么这个问题的核心变量是前进比J定义是J V/(nD)其中V是来流速度n是转速用每秒转数D是螺旋桨直径。J的物理含义可以理解成“气流每转一圈向前推进了多少个直径”它描述的是螺旋桨的工作状态。题干里强调“恒定转速”说明不是用n作为扫描变量而是固定n改变V来获得不同的J。这在工程上对应一个很常见的情况电动无人机的电机转速基本恒定飞行速度变化时螺旋桨就工作在不同前进比。低J意味着大攻角、重负载高J意味着小攻角、轻负载。整套性能曲线CT、CP、η对J的依赖就是设计者用来判断螺旋桨和飞行工况是否匹配的核心依据。2. 从几何参数到离散网格把真实桨叶变成能算的数值输入2.1 需要准备的几何数据写代码之前先要把螺旋桨几何整理成表格。最重要的是三个沿半径方向的分布半径r、弦长c、几何扭转角β。这里几何扭转角指的是当地桨叶剖面弦线相对旋转平面的夹角一般桨根附近扭转角大桨尖扭转角小。很多螺旋桨还带有后掠、翼型变化但BEMT第一步通常只考虑弦长、扭转和翼型升阻特性。除了这三种分布还要给出叶片数B、螺旋桨直径D、工作转速n、来流速度V以及每个半径位置的翼型类型。工程实际中一般不会给每一小段单独设翼型常见做法是把桨叶分成几段根部用厚翼型、中部用中等厚度翼型、叶尖用薄翼型程序里按半径位置插值。我给一个示范数据表格方便对照代码理解例如一个直径0.5m、叶片数2的小型螺旋桨r/Rc(m)β(deg)翼型0.200.02838.2Clark Y0.300.03428.5Clark Y0.400.03822.0Clark Y0.500.04017.5Clark Y0.600.03914.0Clark Y0.700.03511.2Clark Y0.800.0298.8Clark Y0.900.0216.6Clark Y1.000.0104.5Clark Y这里用相对半径r/R表示位置更通用因为系数计算最终都要做无量纲化。整理时要注意扭转角到底是相对于旋转平面还是相对于零升力线很多桨叶图纸上的定义不一致如果搞反攻角会整体偏好几度后面的迭代全都会乱掉。常见的是“几何桨距角”也就是弦线和旋转平面的夹角。2.2 工况组织方式先定J还是先定V确定好几何之后需要决定怎么组织工况。这里建议直接用无量纲前进比J做主循环变量因为最终输出的是CT、CP、η随J的曲线。给定恒定转速n和直径D有V J×n×D。比如n50 rps、D0.5m时J0.1对应V2.5m/sJ0.6对应V15m/s。这一步有个容易忽视的地方空气密度ρ不能漏而且要注意单位统一。Matlab里如果转速给的是rpm要除以60转成rps长度用米速度用米/秒力的单位才是牛顿。我初学时曾经拿着一份rpm转数直接带进公式推力结果差了3600倍后来把量纲写清楚才算捡回一条命。2.3 半径离散化策略接下来把桨叶从叶根到叶尖分成N个叶素。最简单的做法是等分r/R数组比如从0.2到1.0分成30份。但工程上常用的是非均匀网格靠近叶根和叶尖处加密。叶根处速度低、扭转大、流动复杂叶尖处有叶尖涡和损失网格加密后能更好捕捉这些梯度。实现上可以先用等分网格得到初步结果后在r/R0.3和r/R0.9区间加密一倍观察推力变化是否超过1%如果超过就继续加密直到结果基本不变。离散化时还有一个细节叶根处一般有桨毂遮挡实际气动面并非从r0开始。多数小型螺旋桨可以取r_hub/R0.2作为起始点低于这个半径的叶素既没有可靠翼型数据对总推力贡献也很小硬算反而容易因为扭转角大、诱导速度高导致数值发散。叶尖处则建议保留到r/R1.0不要提前截断否则会低估叶尖载荷要不要修叶尖损失可以在后处理阶段另行处理。3. 单个叶素的迭代求解与Matlab程序实现3.1 速度三角形和攻角的确定在每个半径r处气流相对于叶素的速度由轴向分量和周向分量组成。轴向分量是V(1a)其中a是轴向诱导因子周向分量是Ωr(1-a)其中Ω2πna是周向诱导因子。两者的夹角就是入流角φφ atan(Vx / Vy) atan(V(1a) / (Ωr(1-a)))叶素的几何攻角等于当地几何桨距角β减去入流角φα β - φ这里要注意符号约定。如果以旋转平面为基准来流从旋转平面下方斜着冲上来那么攻角就是β减去气流角。很多教材在画速度三角形时习惯把φ定义为入流角写着写着符号就乱了我建议在代码里用角度制统一内部计算用弧度但输出时转成度数方便检查。3.2 翼型升阻力系数的读取得到攻角α后要去查对应翼型的CL和CD。实际翼型数据是离散的攻角表比如从-180°到180°每0.5°或1°给一组数。程序里用interp1线性插值即可。插值时有两点经验第一攻角超过表格范围时不要直接extrap因为线性外推会把失速后的CL推得离谱宁可截断成表格端点的值或者先做小范围外推。第二阻力系数在失速后增长很快如果表格没有完整覆盖到90°至少要把失速后的数据补到合理范围否则叶根大攻角处阻力会被严重低估。3.3 轴向和周向诱导因子的迭代公式核心循环可以写成下面这样的代码。我先给一个基于动量与叶素力平衡的最简版本实际使用时可在此基础上加修正项。% 最简BEMT单点迭代 % 输入已由外部给出B, rho, D, n, V, r, c, beta, alphaData, clData, cdData Omega 2*pi*n; Vx0 V; Vy0 Omega*r; sigma B*c/(2*pi*r); % 当地实度 a 0; ap 0; % 初始诱导因子 for iter 1:200 Vx V*(1a); Vy Omega*r*(1-ap); phi atan(Vx/Vy); % 入流角 alpha beta - phi; % 攻角beta 为几何扭转角 cl interp1(alphaData, clData, alpha, linear, extrap); cd interp1(alphaData, cdData, alpha, linear, extrap); Cn cl*cos(phi) cd*sin(phi); Ct cl*sin(phi) - cd*cos(phi); aNew sigma*Cn / (4*sin(phi)*sin(phi) sigma*Cn); apNew sigma*Ct / (4*sin(phi)*cos(phi) sigma*Ct); if abs(aNew-a) 1e-6 abs(apNew-ap) 1e-6 a aNew; ap apNew; break; end a aNew; ap apNew; end这段代码是BEMT最经典的形式。解释一下各个量的含义σ称为当地实度代表该半径处叶片占据来流的比例实度越高叶片对流场的干扰越大Cn和Ct分别是沿轴向和周向的力系数。中间每一步看起来都在求新诱导因子但都不是一步到位的答案因为攻角、入流角、诱导因子互相耦合需要反复代换直到收敛。如果没有收敛判定只是盲目循环200次常常会在某个J点来回振荡。3.4 推力扭矩积分和无量纲系数每个叶素的推力和扭矩可以这样算dT 0.5 × ρ × B × c × Vrel² × (CL×cosφ - CD×sinφ) × drdQ 0.5 × ρ × B × c × Vrel² × (CL×sinφ CD×cosφ) × r × dr这里Vrel是当地相对速度等于sqrt(Vx² Vy²)。把所有叶素的dT和dQ沿半径积分就得到整片桨的T和Q进一步得到功率P2πnQ。无量纲化系数是CT T / (ρ n² D⁴)CQ Q / (ρ n² D⁵)CP P / (ρ n³ D⁵) 2π CQη J × CT / CP积分用trapz或者for循环累加都行。我个人习惯用trapz因为Matlab对向量积分处理更干净代码也更短。积分时注意dr应该是每个叶素的宽度非均匀网格下要用每个叶素的实际宽度不能简单把总长除N否则会带来系统性误差。4. 前进比扫描中的收敛难点高负荷、小J和翼型失速4.1 光滑迭代可能在高负荷下不收敛上面的简单迭代在低负荷状态下很稳但是一到高负荷状态也就是J比较小、攻角很大的时候很容易出现迭代振荡甚至发散。原因在于动量方程里诱导因子同时出现在分子分母上当地实度σ又很大方程组接近奇异。我试过几个改进办法最有效的是欠松弛迭代。把新解和旧解按比例混合a_new a_old relax × (a_candidate - a_old)松弛因子relax取0.3到0.5有时候需要小到0.1。松弛因子越小越稳但收敛越慢。另一个办法是对每个叶素单独用fzero或fsolve求解非线性方程不再用固定点迭代。这个办法的实现非常简单fun (x) systemEq(x, V, Omega, r, beta, c, alphaData, clData, cdData); x0 [0.1; 0.02]; x fsolve(fun, x0, options);用fsolve的好处是它内置了雅可比近似处理强耦合的非线性方程比简单固定点迭代稳定得多坏处是需要额外定义方程函数代码量会多一点。对于快速性能扫描这种需求我更推荐先试欠松弛因为简单直接一个循环就能改完。4.2 小J和静推力附近的坑前进比J趋近于0时来流速度几乎为零螺旋桨接近静推力状态。此时速度三角形里轴向速度主要由诱导速度撑起来入流角从常值变成接近π/2的极端状态攻角计算对诱导因子的微小变化极其敏感。我在J0.05附近经常遇到的现象是同一副桨几何网格加密前后结果能差出20%。处理办法有三个。第一把J的步长在低J区域取得密一点比如J从0.05到0.2每0.01一个点因为螺旋桨在起飞爬升阶段通常就是高负荷区这个区间恰恰是最需要精确算的。第二给每个叶素的初始诱导因子设置一个非零初值比如a0.1、a0.02不要让所有量都从零开始避免迭代陷入平凡解或者一开始就出现除零。第三在代码里对phi的sin值加一个极小量epsilon1e-8防止出现0/0。4.3 翼型失速后的数据缺腿另一个隐蔽问题是翼型数据只覆盖到失速前。很多翼型实验数据或XFOIL数据只给出到正负十几度但是从桨根到桨尖在低J时攻角可能达到30°甚至40°。如果我们简单外推CL它会直线上升算出来的推力高得离谱。比较稳妥的做法是先根据翼型特性手动补一段攻角到60°甚至90°的数据。大攻角下CL的变化规律并不复杂本质上是一个钝头体绕流升力会逐渐下降阻力显著上升对应到公式里就是Cn和Ct的角色互换。即使补得不准也比线性外推好得多因为趋势是对的。我在多个算例里试过把失速后数据补得粗糙一点最终总推力的误差通常在5%以内因为叶根对总推力的贡献占比本来就不高而叶尖在大攻角下还没那么容易失速。4.4 叶尖损失还有一个不能回避的问题是普朗特叶尖损失。BEMT假设每个径向环是独立的真实桨叶的叶尖处由于存在叶尖涡载荷会逐渐衰减到零而不是像动量理论预测的那样保持一个有限值。忽略叶尖损失会让计算出的推力和扭矩系统性偏高尤其在小叶片数、大直径螺旋桨上更明显。实现普朗特修正并不复杂用一个修正因子F乘到动量方程的推力项上F (2/π) × acos(exp(- (B/2) × (1-r/R) / sin(φ)))修正后a和a的迭代公式要同步调整具体写法是在等号右侧的动量项里除以F。加了修正之后结果会在叶尖附近明显变成圆滑下降整个曲线也更接近CFD和试验。如果你只想快速评估总体趋势可以先不加修正但做精确匹配时一定要加上。5. 结果判读推力扭矩效率曲线的物理解释5.1 曲线长什么样才算合理算完一系列J之后通常你会得到三张图CT-J、CP-J、η-J。它们有很强的规律性我拿一个直径0.5m、两叶、设计J0.5的螺旋桨举例计算结果大致趋势如下表注意具体数值和桨叶设计有关这里只看形状。JCTCPη0.050.1240.1050.0590.150.0980.0820.1790.250.0790.0620.3190.350.0600.0470.4470.450.0430.0330.5860.550.0260.0200.7150.650.0100.0130.5000.75-0.0040.010-0.300CT基本随J增加单调下降因为来流速度越大迎角越小推力越小。CP也是下降但下降速度往往比CT慢效率η则先升后降存在一个峰值。如果CT在某个J点变成负值说明螺旋桨在该状态下不再产生推力而是变成风车状态来流反过来拖动桨叶旋转。这种状态在实际飞行中对应的是滑翔或下坠时螺旋桨被气流吹转。如果算出的效率曲线没有峰值而是单调上升后直接跌穿那多半是叶尖损失没加或者失速后数据有问题先回头检查网格和翼型数据不要指望结果能直接用。5.2 怎么验证自己的计算没错验证的办法有几个从简单到复杂排列。第一手工算一个半径点的单步确认攻角、入流角的数值和代码输出一致第二把叶片数B设成很小的极限值或者把实度降得很低看结果是否趋向理想动量理论的解析趋势第三对比公开论文或开源软件的计算结果比如XROTOR、QPROP的输出曲线BEMT对同一几何的预测通常能对应上至少在中等J段误差不大。另外一个很好用的内在检查是把每个半径处求出的轴向诱导因子a画出来。物理上a应该在0到1之间靠近叶尖处因为有叶尖损失会下降靠近叶根处可能上升。如果某处a变得非常大或者出现负值基本可以断定该位置的数据处理出了问题。举一个我犯过的错误扭转角符号定义反了导致攻角在整个叶展范围内偏大算出来的推力比正常值高了一倍而曲线形状却还大致正常这种错误靠看最终曲线根本发现不了必须按半径查看攻角和诱导因子分布。5.3 恒定转速下的选型逻辑现在回到“恒定转速”这个限制条件。如果转速固定螺旋桨直径固定那么真正能调整的就是通过改变飞行速度获得的J。无人机设计中最关心的通常是效率峰值对应的J因为那对应续航最优的巡航点。如果算出来ηpeak在J0.5而巡航速度是12m/s换算一下转速n应该是V/(J×D)12/(0.5×0.5)48rps也就是2880rpm。这个转速如果电机无法达到或效率很低就需要重新选螺旋桨而不是硬飞。反过来给定电机的恒定转速也可以用这条曲线判断该转速下能覆盖的速度范围。比如n固定在50rpsCT在J0.6以上变成负值那么最大平飞速度大致就在J0.6对应速度附近。想要更高速度要么换更高转速的电机要么换更小直径的螺旋桨以提高同等速度下的J要么增加桨距角让CT曲线右移。这几种方案对应的几何改动方向用BEMT都能快速试算出来。我自己的经验是BEMT这类方法最擅长做这种“趋势判断”和“方案筛选”。它虽然算不出精确的流动分离和三维效应但在设计阶段当你要在十几个桨叶几何里快速挑出两三个候选再用CFD或者实验深入验证时BEMT就是效率最高的工具。你不需要为了每个方案都跑一次风洞也不需要等网格收敛等上几个小时Matlab跑一个恒定转速下的完整前进比扫描也就几秒钟。如果后续想扩展可以从几个方向入手加入Prandtl叶尖损失修正和动态失速模型把盘面处的来流畸变考虑进去把空气密度随高度的变化加进扫描列表看成不同海拔下的性能包线。这些扩展都建立在这套基础循环之上先把当前这一版跑通把曲线读明白后面的路就好走很多。
返回列表