外转子开关磁阻电机ER-SRM这类特种电机的设计确实不是拿公式套一套就能出结果的。我最近一个项目里就是要同时考虑转矩提升、转矩脉动抑制和效率优化这三个目标本身互相顶着干单靠经验试参早就行不通了于是走了NSGA-II多目标优化的路配合Matlab把整个寻优过程和结果可视化走通。本文就围绕这套实际做下来的流程展开从ER-SRM优化建模、目标函数搭建、NSGA-II算法原理与Matlab代码实现到最终的Pareto前沿绘制和方案筛选按我的实际操作顺序拆开讲。适合正在做电机结构参数优化的研究生、刚入门的电机设计工程师以及想把NSGA-II真正用在自己问题上的Matlab使用者。1. 项目概述与整体优化思路1.1 ER-SRM为什么需要跨参数联合优化外转子开关磁阻电机External Rotor Switched Reluctance MotorER-SRM与常见的永磁同步电机不一样它没有转子永磁体和绕组完全靠定子绕组电感随转子位置变化产生转矩。它的外侧部分是转子定子被包在里面这种结构天然适合做轮毂电机、风机直驱、电动工具等场景因为转矩可以直接输出到外部负载省掉减速机构。但SRM的麻烦也在这里转矩是靠定、转子凸极之间磁阻变化换来的磁路饱和严重换向位置对转矩影响非常大。在实际设计里改一个极弧系数可能会让平均转矩上去了但转矩脉动也跟着飙起来噪声和振动往往没法看。如果同时再把效率加进来那问题就更复杂了——高效率工作点可能对应高饱和区反过来又会恶化脉动。所以ER-SRM的设计本质上是个多目标优化问题要同时考虑平均转矩、转矩脉动、效率或者损耗这些指标无法统一成一个量纲也无法通过简单加权得到可靠结果。理想的做法是让算法自己去搜索一整个备选解集也就是Pareto前沿再根据工程需求从里面挑最终方案。1.2 为什么是NSGA-II而不是单目标算法早期很多电机优化工作走的是单目标路线比如把转矩脉动和平均转矩放到一个总目标里取权重然后调用遗传算法或粒子群去找一个最优值。这个方法不是不能用但如果你对电机本身的物理特性理解还不够深权重系数大概率得来回调而且不同工作点下最优权重根本不一样。NSGA-II带精英策略的非支配排序遗传算法是处理多目标优化问题最经典、也最稳定的算法之一。它的核心贡献有两个一是利用快速非支配排序把所有个体分层二是用拥挤度距离保证解的多样性。相比单纯加权NSGA-II能直接输出一整个Pareto前沿解集让设计者自己看趋势、做权衡不再依赖人为权重。这里也可以简单说一下为什么不用NSGA-III或者MOEA/D。NSGA-III适合高维目标问题4个目标以上如果只有两三个目标NSGA-II的计算量更小、代码更直观调参也更容易。MOEA/D在分解策略上不错但实际使用中对于电机这种目标函数计算耗时较长的模型NSGA-II的评价机制更直接跑一轮下来的效率也够用。总之目标函数少、单次评估贵、想快速得到可用解NSGA-II是最稳妥的选择。2. 优化问题建模把电机设计变成数学问题2.1 设计变量与目标函数选取做优化第一步不是急着写代码而是把电机设计参数和指标用数学语言描述清楚。对ER-SRM来说定子极弧系数、转子极弧系数、气隙长度、定/转子轭厚、绕组匝数这些参数都会直接影响电感曲线和转矩输出。我这次选的变量是6个定子极弧系数βs、转子极弧系数βr、气隙g、定子极靴宽度、转子极靴宽度、定子磁极根部宽度。范围取值参考电磁设计手册以及电机尺寸约束比如极弧系数取0.3~0.55气隙取0.25~0.6mm这几个参数区间设得太大容易出不合理结构设得太小搜索空间又不够。目标函数我用了三个这也是SRM优化里最常见的组合平均转矩最大化直接反映电机的带载能力实用中当然越大越好。转矩脉动系数最小化Kr (Tmax - Tmin) / Tavg这个值越低电机运行越平稳振动噪声越容易控制。效率最大化利用有限元或解析模型算铜耗、铁耗再结合输出功率求效率。为了统一成最小化问题实际代码里会把平均转矩的目标形式写成1/Tavg这样算法搜索时数值越小代表转矩越大。效率同理取1/η。2.2 约束条件该怎么定约束条件如果只是简单设个上下限优化出来的结果往往很离谱比如定子齿根宽度比极靴还宽或者气隙小到加工不出来。这类问题我在第一次跑的时候全踩过。几何约束上要注意极弧系数组合必须满足开关磁阻电机的点火约束一般要求定子极弧与转子极弧之差小于步距角不然启动和换向会出问题。定子极靴宽度与极根宽度之间要有合理比例避免磁路局部过饱和。转子轭厚不能低于定子轭厚的一半防止机械强度不足。电气与磁路约束上电流密度上限一般取5~8A/mm²槽满率控制在0.45以内。磁密方面用有限元计算后检查定子轭部磁密不超过1.7T左右因为SRM的磁路本来就高度饱和再高的话铁耗会急剧恶化。这些约束不需要全部直接写进NSGA-II的约束条件里部分几何约束可以直接在设计变量上下限里体现磁密和电流密度这类需要通过一次目标函数评估后做惩罚处理。实际中用惩罚函数比较省事违反约束就给一个很大的目标值让算法自然淘汰。2.3 目标函数数值计算解析模型与有限元之间的权衡NSGA-II要跑几百次甚至上千次目标函数评估。如果每一次都调用Maxwell或者JMAG做静磁场有限元仿真单次3分钟左右跑200代、种群80个那就是480小时完全不现实。所以这里有一个关键选择用什么方式计算电机性能。第一种是等效磁路解析模型。用磁路法把定转子极、轭部、气隙等效成磁导结合绕组电流和转子位置角算出电感曲线再通过对电感求导得到瞬时转矩。这个方法单次评估不到0.1秒可以很好地嵌入NSGA-II。缺点是模型精度有限尤其是局部磁饱和严重时误差偏大但用来做优化趋势搜索足够。第二种是有限元模型响应面代理。先用少量有限元仿真样本点建立代理模型比如Kriging或多项式响应面再用代理模型作为NSGA-II的目标函数。这个精度比纯解析高很多代价是需要额外做实验设计。第三种是直接把有限元的过程用脚本批量调用。只在种群规模小、目标很少的情况下才推荐。我这次实际采用了解析模型加后期有限元校核的组合前期NSGA-II全部用解析模型快速寻优得到Pareto前沿后挑3到5个解做有限元精算验证误差并选最终方案。这样既快又不至于让结果偏离物理实际太多。3. NSGA-II原理与核心代码解读3.1 非支配排序和拥挤度NSGA-II能干的本质就是在一代一代进化中同时保留接近最优的个体和分布均匀的个体。非支配排序的概念需要先理清楚。假设有两个解A和B如果A在所有目标上都优于B那么A支配B如果A在一个目标上优于B但在另一个目标上劣于B那A和B互为非支配关系。排序的目的是把所有个体按支配层次分层第一层是整个解集中不被任何其他解支配的个体第二层是去掉第一层后剩余解集中的非支配个体依此类推。在进化过程中优先保留层级靠前的个体。但只按层级选人会有一个问题如果第一层个体已经有100个而种群上限是80那谁走谁留NSGA-II的解决办法是拥挤度距离。对同一层的个体计算它们在目标空间中的密度——拥挤度大的说明周围解少优先保留。这样一来Pareto前沿的分布会比较均匀不至于解全部挤在一个角落。3.2 完整的Matlab实现逻辑一个标准NSGA-II算法的Matlab主循环应该是这样的% 参数设置 popsize 80; % 种群规模 maxgen 200; % 最大迭代次数 nvar 6; % 设计变量个数 nobj 3; % 目标函数个数 pc 0.9; % 交叉概率 pm 1/nvar; % 变异概率 etac 20; % SBX分布指数 etam 20; % 多项式变异分布指数 % 初始化种群 pop zeros(popsize, nvar); for i 1:popsize pop(i,:) lb (ub - lb) .* rand(1, nvar); end F evaluate_objective(pop); % 计算目标函数值 for gen 1:maxgen % 锦标赛选择 parent_idx tournament_selection(pop, F); parent_pop pop(parent_idx, :); parent_F F(parent_idx, :); % 模拟二进制交叉 (SBX) 与多项式变异 offspring_pop sbx_crossover(parent_pop, pc, etac, lb, ub); offspring_pop polynomial_mutation(offspring_pop, pm, etam, lb, ub); % 评估子代 offspring_F evaluate_objective(offspring_pop); % 合并父子种群 combined_pop [pop; offspring_pop]; combined_F [F; offspring_F]; % 非支配排序 拥挤度计算选择下一代 [pop, F] environmental_selection(combined_pop, combined_F, popsize); end非支配排序部分是一个非常值得仔细写的函数。经典的做法是每个解记录它被什么解支配、它支配哪些解复杂度O(N²)对常规种群规模完全够用。拥挤度排序则是对每一层个体按各目标升序排列计算相邻个体在每个目标方向上的距离之和。3.3 算法参数怎么选NSGA-II看似只多了非支配排序和拥挤度但参数敏感性比普通遗传算法更明显。交叉概率pc一般取0.8到0.9变异概率pm取1/nvar这是遗传算法里的常规经验值。SBX的分布指数etac我一般取15到20取值越大生成的子代越接近父代搜索精细取值越小越容易跳出局部区域。多项式变异的etam同样取20左右。种群规模80到100是比较均衡的选择。在这个规模下200代迭代大约16000到20000次目标函数评估用解析模型大约几分钟就完了。如果每次评估再快一点可以适当把种群加到120但增加后对Pareto前沿密度提升并不明显反而是迭代更多代更有效。有个细节要提醒如果发现前沿分布不均匀先别急着调算法看一下是不是目标函数数值量纲差异太大。比如转矩是几十牛米脉动是零点几效率是0.85挤在三维空间里某一维的变化几乎被淹没了。我习惯在计算拥挤度之前先做目标归一化这样分布会更均匀。4. 优化主循环与Matlab绘图实现4.1 主程序架构与评价函数封装代码组织方式会影响后续调试心情。我推荐把电机性能计算单独封装成一个函数evaluate_objective输入是设计变量向量输出是三个目标值。这样不管内部是用解析计算还是调用外部仿真脚本NSGA-II主程序完全不用动。一个典型的评价函数内部流程大概是根据6个设计变量计算电感曲线、转矩曲线再统计平均转矩、转矩脉动结合工作点计算铜耗铁耗和效率。这部分代码量不小但对做过有限元分析的人来说并不难。主程序里还有一个重要的部分是约束处理。比如发现定子极弧与转子极弧的差值小于步距角直接给两个目标函数赋一个极大值比如1e10让非支配排序时它天然处于最后一层就不会被选中。4.2 画图代码一Pareto前沿与收敛曲线NSGA-II跑完第一件事就是画Pareto前沿。三维目标用scatter3是最直观的方式颜色可以用支配层级来映射。figure(Color, w); scatter3(f(:,1), f(:,2), f(:,3), 18, rank, filled); xlabel(1/T_{avg} (1/N·m)); ylabel(转矩脉动系数 K_r); zlabel(1/η); colormap(parula); colorbar; title(ER-SRM 三目标Pareto前沿NSGA-II优化结果);如果想把Pareto前沿单独拿出来看可以对所有最终个体再做一次非支配排序只保留第一层个体再重新画一次。这样图像干净很多不会被淘汰的个体干扰。收敛曲线也是必画的东西。NSGA-II没有单一的最好适应度所以一般画HV值或者IGD指标随迭代次数的变化。HV值超体积指标是评估Pareto前沿整体质量的常用指标实现起来也不算复杂以参考点各目标的最差值为边界计算前沿与参考点之间的超体积。HV曲线越走越平说明算法基本收敛。4.3 画图代码二设计变量进化与方案对比图画设计变量的进化轨迹能看出哪些参数最终稳定在哪个区间、哪些参数一直在波动。比如定子极弧系数收敛到一个窄范围说明这个参数对目标很敏感值得重点控制如果气隙厚度一直在区间里乱跳可能说明气隙对目标不敏感或者约束太松。figure(Color, w); for i 1:nvar subplot(2, 3, i); plot(history(:, i), LineWidth, 1.2); xlabel(迭代次数); ylabel([变量, num2str(i)]); grid on; end方案对比图我一般把初始方案、优化方案的转矩-转角曲线画在同一张图上一眼能看出来脉动到底改善了多少。figure; plot(theta, T_initial, LineWidth, 1.2); hold on; plot(theta, T_optimized, LineWidth, 1.2); xlabel(转子位置角 θ (°)); ylabel(瞬时转矩 (N·m)); legend(初始方案, NSGA-II优化方案); grid on;最后出图时推荐用exportgraphics导出PDF或者高清TIFF别直接截图论文投稿时分辨率不够很吃亏。5. 结果解读与最优解选取5.1 Pareto前沿怎么看Pareto前沿不是一个点而是一条面或一个区域。对于三目标问题最后画出来的前沿在三维空间只有一个曲面在这个曲面上一个目标变好至少另一个目标变坏。比如我的优化结果里平均转矩大的方案转矩脉动系数普遍偏高效率高的方案平均转矩往往偏低。这个趋势由ER-SRM本身的电磁特性决定的——转矩越大磁路饱和越严重附加损耗越大效率自然下降。看到前沿形状以后基本就能判断哪些指标组合是物理上可以达到的哪些不行。如果发现前沿稀疏或者某个目标方向的点特别少说明算法在这个方向上搜索不充分可以适当增加该方向的变异概率或者在目标函数上进行不均匀拉伸。5.2 从Pareto解集中选最终方案从Pareto前沿里挑方案和算法关系不大更多是工程判断。以下几种选择策略供参考面向启动转矩的场合优先选平均转矩高的解哪怕脉动大一点。面向静音和舒适性的场合比如电动助力、家电驱动选脉动系数低的解。兼顾效率和成本时可以用距离理想点的欧式距离法或TOPSIS方法综合排名。我当时选了三个备选解分别对应高转矩、低脉动、高效率三种倾向随后对这三个解做了二维有限元瞬态场仿真。最后发现效率最优的那个解在轻载工况下的铁耗表现最好但额定负载下磁密略超预期局部铁芯过热风险高也因为这个原因舍弃了它最终选择了低脉动方案并做了样机验证。有限元校核后优化方案相比初始方案平均转矩提升了约12%转矩脉动系数从0.48降到了0.29额定工况效率提升了2个百分点左右效果算是非常明显了。6. 避坑指南与常见问题6.1 算法不收敛怎么办最常遇到的情况是跑了100代Pareto前沿形状还在剧烈变化说明算法没有收敛。查三个方向先看种群是否太小。种群太小选择压力不足多样性丢失。可以试试把种群从60增加到120对比前沿分布密度。再看交叉变异参数。如果交叉概率太低子代跟父代基本一样搜索效率低下如果变异概率太高算法会退化成随机搜索难以收敛。最后看目标函数是否有数值突变。解析磁路模型在某些参数组合下可能出现电感计算发散导致个别目标值达到几千甚至上万。这种异常值会污染整个非支配排序让前沿变形。解决方法是给目标函数加一个合理范围判断超出范围直接赋一个极大值。6.2 目标函数计算太慢怎么破用有限元逐次调用的问题上面已经说过。如果非要在Matlab里跑有限元一个折中方案是先用最大电流和几个关键转子位置角做少量有限元计算拟合出转矩关于转子位置角的多项式函数然后用这个拟合结果替代完整仿真。这样单次评估从好几分钟压缩到不到一秒。更推荐的是前期解析模型寻优后期有限元精算校核。这个方法我后面一直在用效果很好。6.3 画图展示上的坑第一个坑是三维Pareto图的视角问题。Matlab默认视角经常把点完全遮住我会用view函数调整视角并用rotate3d先看一圈再定图view(135, 30);第二个坑是色标范围。如果不手动限定colorbar范围Matlab会自动拉伸色标导致前沿上的层级颜色看不出来。7. 我的经验与后续扩展这个项目做下来我自己最大的感受是NSGA-II解决的是“选哪个”的问题而真正决定优化上限的是“怎么算”这个问题。解析模型也好、有限元代理模型也好目标函数的准确度直接决定优化结果能信几分。建议大家在搭好NSGA-II框架后一定预留出模型替换的接口后面有条件就换更精细的模型做二次寻优。另外三目标的Pareto前沿对工程选型足够用但如果你想继续往下做还可以把噪声、振动、成本这些因素逐步加进来。目标数超过4个后NSGA-II的效果会下滑到时再考虑换成NSGA-III。ER-SRM后续还可以做电流波形优化和结构参数联合优化优化空间很大值得继续深挖。