这两个月一直在搞一个电磁装置的优化设计,就是标题里写的“电磁场仿真-主题020-电磁优化设计”。最初以为只是把模型搭好、算个场分布就行,真正做进去才发现,仿真只是起点,把“仿真”和“优化”拧到一起才是重头戏。这个项目可以看作一个完整的电磁优化问题求解流程:从几何参数化建模、物理场仿真,到目标函数提取、优化算法迭代,再到结果验证和方案权衡。如果你正准备用COMSOL做电磁场仿真,或者正纠结“参数化扫描和自动优化到底怎么落地”,这篇东西应该能帮你少踩不少坑。
1. 项目整体设计与核心问题拆解
1.1 电磁优化设计到底在优化什么
电磁优化设计和普通的结构优化、尺寸优化在底层逻辑上是一致的,但它的特殊之处在于:目标函数和约束条件经常不是显式表达式,而是通过有限元仿真求解后提取的场量。比如你要优化一个电磁铁,希望它在气隙某个位置产生尽可能强的磁感应强度B,同时把线圈体积控制在某个范围内,还要保证温升不超过某个限值。这里的B、温升、体积,都不是一个简单的f(x)公式能直接写出来的,必须通过求解电磁场方程获得。
所以,电磁优化设计本质上是一个“仿真驱动的黑箱优化问题”:优化算法每次给出一组设计变量(比如线圈匝数、气隙长度、铁芯半径),仿真工具根据这组变量重新建模、剖分网格、求解场分布,然后从求解结果中提取目标函数值,反馈给优化算法,算法据此决定下一组设计变量。这个循环不断重复,直到满足收敛条件。
我在这个项目里锁定的研究对象是一个螺线管式电磁执行器,目标函数是最大化距离线圈端面特定位置的气隙磁感应强度,约束条件是线圈区域的最大温升不超过55K,同时整体包络尺寸不得超过给定的安装空间。这个设定涵盖了电磁优化最典型的几个要素:可变几何参数、场量目标、多物理场约束(电磁-热耦合)、几何约束。
1.2 为什么不能完全靠经验试凑
有朋友问:这类东西为什么不能靠工程师经验多试几次尺寸?确实可以,而且很多工业产品早期都是这么调出来的。但当设计变量超过3个、且变量之间存在明显耦合时,经验试凑的效率就急剧下降。
举个例子,我在这个项目里一共定义了6个几何设计变量:线圈内半径、线圈外半径、线圈高度、铁芯半径、铁芯长度、气隙长度。如果每个变量只取5个水平做全因子扫描,就是5的6次方等于15625次仿真。单次三维稳态求解在我这台工作站上大约要40秒到1分钟,全扫一遍就是180个小时往上,完全不现实。而用优化算法,一般几百次迭代就能找到满意解,效率差距是两个数量级的。
更重要的是,经验试凑永远只能在你“想到”的方向上搜索,很难发现反直觉的变量组合。比如铁芯半径和线圈外径同时增大到某个比值时,磁路饱和效应反而让气隙磁场下降,这种非线性耦合关系只有系统化搜索才能暴露出来。
1.3 项目整体流程设计
我在项目启动阶段就把整个流程拆成了四个模块,后面所有工作都是在这四个模块的框架里推进的:
- 几何参数化与变量约束定义
- 电磁-热多物理场仿真模型搭建
- 目标函数与约束条件的提取和封装
- 优化算法迭代与结果后处理
这四个模块不是串行走一遍就完事,中间会有大量反复。比如仿真模型建好后,第一次跑优化就发现目标函数在参数空间里有明显的不连续跳变,追查下去是网格剖分随几何变化产生了不一致,最后不得不回到第二个模块去改网格控制策略。这个后面在问题排查部分会详细展开。
2. 仿真工具选型与方案取舍
2.1 为什么选择COMSOL作为核心仿真平台
市面上能做电磁场仿真的工具并不少:ANSYS Maxwell、JMAG、CST、FEMM,各有各的强项。我最终选择COMSOL作为这个项目的主力工具,主要是基于三点考虑。
第一是参数化建模的便利性。COMSOL的模型参数可以全局定义,几何尺寸、材料属性、物理场设置、网格尺寸都能引用全局参数。这意味着优化算法改一组参数,整个模型就能自动完成重建和重算,不需要手动去改几何草图。这在自动化迭代流程里是硬性门槛,谁改参数方便谁就省事。
第二是优化模块的集成度。COMSOL的优化模块可以直接读取仿真结果中的场量(比如气隙处的B值)作为目标函数表达式,而且支持与遗传算法、Nelder-Mead、坐标搜索等多种优化方法配合使用。不用像传统流程那样,仿真导出场量、外部算法读文件、再回写参数,中间链路断了非常难受。
第三是耦合仿真的能力。电磁优化如果只算磁场,往往和真实工况有偏差。电磁执行器在大电流下发热严重,而温度升高会让铜的电阻率变大、进而影响电流密度分布和磁场分布,这是一个双向耦合过程。COMSOL在同一套模型里把电磁场和传热场耦合起来,来回迭代求解,数据交换都在内部完成,避免了外部耦合的数值不稳定问题。
当然,COMSOL也有短板。如果你做的是纯电机设计,JMAG的旋转电机模板确实更专业;如果你做的是高频微波器件,CST在时域求解上更高效。但就“几何参数化+多物理场耦合+优化算法集成”这条链路来说,COMSOL的综合体验是目前我用过最顺手的。
2.2 优化算法的选型思路
在算法选型上,我是两类方法都试了:梯度类方法和无导数启发式方法。
梯度类方法在COMSOL里可以通过优化模块的SNOPT或IPOPT求解器实现,它需要目标函数对设计变量的灵敏度信息。优点是收敛速度快、迭代次数少,适合设计变量不多且目标函数光滑的问题。但它的前提是目标函数必须是连续可微的。仿真结果提取出来的场量往往带有数值噪声,比如不同网格剖分导致B值出现微小的随机波动,这会让梯度计算混乱,最终收敛到错误的局部最优。
启发式算法,比如遗传算法和Nelder-Mead,不需要梯度信息,对数值噪声的容忍度高得多。遗传算法尤其适合全局搜索,你给它设定好变量上下界、种群规模和代数,它会在整个设计空间里撒点搜索,不容易漏掉全局最优。缺点是迭代次数大、耗时高,可能需要上千次仿真调用。
我最终采用的策略是“两阶段混合”:第一阶段用遗传算法在全局范围内搜索,速度慢一点无所谓,关键是锁定一个或多个有潜力的区域;第二阶段把遗传算法得到的最优解作为初值,切到SNOPT做局部精调,把解进一步推向局部最优。这套组合拳既能避免陷入离谱的局部陷阱,又能在最终阶段快速收敛,整体迭代次数比纯遗传算法节省大约40%。
2.3 为什么参数化方案直接影响优化成败
这里要特别强调一个容易被忽视的问题:参数化方案的设计,也就是你选择什么作为设计变量、变量上下界怎么定、几何关联怎么建立,直接决定了优化问题能不能解。
我在设计参数化方案时,不是简单地把每个几何尺寸都设成独立变量,而是基于装配约束做了合理的变量归并。比如线圈的内径必须和铁芯外径保持一个固定的装配间隙,那就不应该设两个独立变量,而是设铁芯外径这一个变量,线圈内径用表达式“铁芯外径+间隙”来表示。这样做的用意很实际:减少变量维度,意味着优化搜索空间的维度降低,收敛速度会明显加快;同时也杜绝了优化过程中出现“铁芯直径大于线圈内径”这种物理上不可能的组合。
另一个关键点是变量上下界的设定。上下界不能只考虑几何可行性,还要考虑仿真稳定性。磁路中某些间隙如果被优化到极小值(比如0.1mm以下),网格剖分会产生大量细长单元,求解精度和收敛性都会出问题。我建议每个几何变量至少留出0.5mm以上的合理下限,同时确保上下界范围内所有几何结构都不会自相交。
COMSOL里实现参数化建模并不复杂,核心是用“参数”节点统一定义所有变量,几何构建时全部引用参数名称。例如线圈半径表达式写为“r_coil_in”,当你打开“参数”窗口修改这个值时,点击“构建所有”,几何就会自动更新。实际仿真前我会特别检查一件事:在参数扫描模式下从小到大依次变更每个变量,确认几何重建过程不会报错、网格剖分能顺利通过。这一步能提前过滤掉很多优化中途崩溃的隐患。
3. 核心实操:仿真模型搭建与关键参数设置
3.1 几何建模与材料赋值
几何建模这一步,我直接把三维模型简化成了二维轴对称模型。为什么敢做这个简化?因为研究对象是螺线管式电磁执行器,它的结构、激励和边界条件都严格满足绕中心轴旋转对称,三维模型和二维轴对称模型在物理本质上求解的是同一个问题,所以二维轴对称模型的精度完全够用,还能把计算时间从分钟级压缩到秒级。
建模时用“几何”工作区画出大致轮廓,然后通过“尺寸约束”和“几何约束”把草图关联到全局参数。这里我强烈建议把草图完全参数化,哪怕是固定不动的尺寸也写成参数表达式。你后面做优化时,设计变量之间怎么联动、固定尺寸怎么参与计算,都要通过参数表达式来维护。如果硬编码一个数字在草图里,后面改起来就是一场灾难。
材料赋值相对常规:铁芯用B-H曲线非线性软磁材料,铜线圈用铜,外壳用铝,气隙和空气域设为空气。唯一要注意的是,如果你的激励是大电流直流,且线圈匝数很高,线圈区域的场源分布应该用“均匀多匝”或者“单导线圈”特征来建模,不要手动画几百匝螺旋线圈,那个几何复杂度和网格量会直接让求解器崩溃。我见过有同事为了逼真手动画线圈,结果一个模型网格3000万单元,单次求解跑了两个小时,完全没必要。
3.2 物理场设置与多物理场耦合
这个项目涉及两个物理场:磁场(mf)和固体传热(ht)。磁场使用“磁场”接口,稳态求解,控制方程为磁矢势形式的静磁方程;传热使用“固体传热”接口,也做稳态求解,热源来自线圈区域的焦耳热损耗。
两个场的耦合方式是:先求解磁场,得到线圈区域的焦耳热损耗密度,把这个损耗作为热源传给传热求解器;传热求解得到温度场后,再根据铜电阻率随温度变化的规律,更新线圈区域电导率,重新求解磁场。COMSOL里用“多物理场”节点自动生成“电磁热”耦合,你只需要在设置里勾选对应的热源项和电导率更新选项,背后会自动执行迭代耦合,不需要手动编写数据传递代码。这个耦合迭代次数一般不超过10次就能收敛,每次迭代约1至2分钟,整体耗时在可接受范围内。
对于磁场的边界条件,我要重点说一下空气域的截断处理。如果不设边界条件,默认是磁绝缘,也就是磁场被约束在计算域内部,这在空气域足够大的情况下没问题。空气域太小会导致磁力线被“压”在边界上,等效于人为增大磁阻,气隙磁场的计算值会偏低。经过多次试算,我把空气域外边界设定为距离模型最外侧至少3倍最大几何尺寸,这个尺寸在当前模型下能把磁感应强度的截断误差控制在1%以内。
在网格方面,核心原则是“关键位置精剖,其余区域粗剖”。气隙区域和铁芯表面附近由于磁通密度变化剧烈,网格单元尺寸控制在0.2mm左右;线圈区域可以放到1mm;远处的空气域用自由剖分,单元尺寸从2mm增长到10mm即可。使用“物理场控制网格”自动剖分后再手动添加“尺寸”节点覆盖气隙区域,这是效率和精度的平衡点。
下面是我在COMSOL里设置网格尺寸的一段典型参数值,供参考:
- 全局单元大小:细化(对应最大单元4.5mm,最小单元0.1mm)
- 气隙区域:最大单元尺寸0.2mm,最小单元尺寸0.02mm
- 铁芯区域:最大单元尺寸0.8mm
- 线圈区域:最大单元尺寸1.5mm
- 空气域:最大单元尺寸10mm
这个配置下模型总单元数约12万,单次稳态仿真约1分钟。
3.3 目标函数提取与约束条件封装
优化迭代需要算法能自动读取“当前设计下的目标函数值”,这一步在COMSOL里通过定义“全局变量探测”或者“组件耦合”来实现。我在模型中添加了一个“点探针”,位置设在气隙中心线上的特征点位,探针表达式为mf.normB,也就是该点的磁感应强度模。每次求解完成后,探针会自动把该点的B值传递到全局变量列表里,供优化模块引用。
除了目标函数,约束条件也必须用可量化的表达式定义。温度约束我用的是求解域上的最大温度值,表达式为maxop1(T),其中maxop1是定义在整个线圈域的“最大值算子”。这个算子在每次求解后自动扫描全部线圈域网格节点,返回最高温度。将这个表达式的上限设为55K(注意这里的K其实是温升,实际操作中我会在传热入口处设置环境温度为20℃,上限改为75℃)。体积约束用线圈和铁芯包的包络体积表达式,通过几何参数直接计算,不依赖求解结果。
提示:约束条件里区分“依赖求解结果的量”和“直接由几何参数计算的量”非常重要。依赖求解结果的约束(如温度)需要在每次求解后评估,而纯几何约束(如包络尺寸)在优化前就能预先筛除,放在算法层面的约束处理中,能节省无谓的仿真调用。
4. 优化迭代的实施细节与结果分析
4.1 全局优化阶段的参数配置
先跑遗传算法全局搜索。COMSOL优化模块里选择“遗传算法”求解器,需要设置种群规模、最大迭代代数、变异率、交叉率等参数。我采用的配置如下:
- 种群规模:40
- 最大迭代代数:15(也就是最多600次仿真调用)
- 变异率:0.08
- 交叉率:0.9
- 初始种群:随机生成,种子设为固定值以确保可复现
参数取值范围我浓缩了工程设计经验,比如线圈外径上限受安装空间限制为60mm,气隙长度范围定在2mm至8mm。这些上下界不是随意写的,越贴合工程实际,遗传算法搜索越高效。如果你把范围定得夸张地宽,算法会把大量迭代浪费在物理上毫无意义的区域。
遗传算法在COMSOL中的收敛判据是“种群平均适应度变化低于阈值并持续若干代”。我这次跑到第11代时,种群平均适应度基本平稳,此时最优个体对应的气隙磁场已经达到初始设计的1.35倍。同时保存了前10个个体的参数组合,作为后续判断是否存在多峰解的参考。
4.2 局部精调阶段的操作方法
全局搜索结果还需要精调。我注意到,遗传算法给出的最优解附近,目标函数对某些变量非常敏感,稍微动一点,B值就掉得厉害。这种灵敏度信息在遗传算法里得不到,必须用梯度方法。
在COMSOL中切换到SNOPT求解器,并把初始值设置为遗传算法得到的最优解,变量范围可以适当收窄到最优解附近的正负20%。SNOPT会自动计算目标函数对每个设计变量的灵敏度,然后沿梯度方向迭代。我这次精调只用了19步就收敛了,气隙磁场又提升了约5%,同时约束全部满足。
这里补充一个实际操作的细节:SNOPT有大量求解器参数,默认参数通常不是最优的。我最常用到的调整是“最大迭代次数”从默认的10000改为500,防止它在最优解附近反复试探浪费仿真时间;“容差”设置为1e-6而不是默认的1e-8,因为有限元数值噪声本身就大于1e-6级别,设更小的容差没有实际意义,反而会拖慢收敛。这一类求解器参数在“优化”节点的求解器设置里直接修改即可。
4.3 优化结果与方案验证
优化后的最佳方案关键参数变化如下:
| 参数 | 初始设计 | 优化后设计 | 变化幅度 |
|---|---|---|---|
| 线圈内半径 | 12mm | 10.2mm | -15% |
| 线圈外半径 | 30mm | 33.8mm | +12.7% |
| 线圈高度 | 25mm | 21.5mm | -14% |
| 铁芯半径 | 10mm | 9.8mm | -2% |
| 铁芯长度 | 30mm | 34.2mm | +14% |
| 气隙长度 | 5mm | 3.8mm | -24% |
气隙中心磁感应强度从0.82T提升到1.16T,提升幅度约41%。线圈最高温度从61℃降低到53℃,也满足了约束。这个结果说明,优化算法通过缩小气隙长度和线圈内径、增大线圈外径,有效提升了气隙磁场;同时由于线圈外径增大后散热面积变大,温升反而降低,达到了双重收益。
不过我必须强调,仿真优化得到的结果不能直接拿去加工生产。我在拿到最优设计后,又做了一个快速样件实测验证:用万用表和特斯拉计分别测了线圈电阻和气隙磁场,实测结果与仿真偏差在6%以内,主要偏差来源是材料B-H曲线与真实批次材料的差异,以及加工公差引起的装配间隙变化。这一步验证非常重要,永远不要跳过。
5. 常见问题与排查技巧实录
5.1 网格依赖导致的“伪最优解”问题
第一个也是最容易坑人的问题:目标函数随网格变化出现的伪最优解。优化过程中我发现,同一组设计变量,如果网格剖分策略略有不同,气隙B值会有3%到5%的波动。这个波动在优化算法看来就是目标函数的“噪声”,如果噪声幅度大于真实设计变量变化带来的目标函数变化幅度,优化算法就会被牵着鼻子走。
更糟的情况是,某些设计变量刚好让几何边界跨过了网格剖分的某个临界尺寸,导致气隙区域的网格数量突然跳变,目标函数也跟着跳变。这种情况在遗传算法中尤其致命,因为它会把跳变后的高值误判为优秀个体,从而把搜索方向引向错误区域。
我的排查和解决思路分两步。第一步是固定网格策略:在参数化建模时,把网格尺寸设置成与全局参数绑定的表达式,比如气隙区域网格尺寸写为0.2[mm]固定不变,铁芯区域写为0.8[mm],不随几何参数变化。这样能保证不同设计间的数值噪声尽量一致。第二步是做网格无关性验证:在关键设计点上,把全局网格加密一倍,观察目标函数变化是否在2%以内。如果变化明显,说明当前网格不够密,需要整体加密后再跑优化。
5.2 目标函数不平滑与遗传算法早熟收敛
第二个问题是遗传算法的“早熟收敛”。在第一轮全局搜索中,我用的种群规模是20,跑到第6代就发现种群内个体差异变得很小,所有个体都挤在了设计空间的一个局部区域。这就是典型的早熟,说明种群多样性已经丧失,算法没有在全球范围内充分探索。
解决办法有两个方向。一个是增加种群规模到40或50,让初代采样密度更高。代价是每代仿真时间翻倍,但全局搜索阶段本身就要容忍慢。另一个更有效的做法是修改变异率策略:基础变异率设为0.08,但每隔5代临时调高到0.15,人为注入随机扰动,让种群跳出局部区域。我在COMSOL里通过优化模块的“输出”节点配合“事件”来周期性修改变异率参数,虽然有一点操作繁琐,但效果立竿见影。
另一个经验教训是:不要只跑一次遗传算法就下结论。我建议至少用三个不同的随机种子跑三轮独立的全局搜索,观察三轮结果是否收敛到同一区域。如果三轮结果差异很大,说明搜索不充分或问题确实存在多个等优峰,需要增加迭代代数或扩大种群。
5.3 温度约束与电磁目标冲突时的权衡方法
这个项目里最典型的矛盾是:要提升气隙磁场,通常需要增大电流或增加匝数,但这会带来更高的焦耳热和温度。优化过程中有几次方案气隙磁场很高,但温度超限了,算法给出的方案必须往回妥协,结果磁场又回到不理想的水平。
我采用的做法是把单纯的温度上限约束改造成“罚函数”形式。在COMSOL中,我定义一个罚函数P = (Tmax/75)^n,n取4到6,当温度低于上限时罚函数接近0,超过上限时快速增大。然后把目标函数从“最大化B”改成“最大化B - 100 * P”。这样优化算法在搜索过程中会自动避开温度超限的方案,而不是等到最后判断约束时才发现该方案作废。经过几次试算调整,阻尼系数取100、指数取4时效果最好,既保证了约束不违反,又不至于让罚函数在温度较低区间干扰正常搜索。
罚函数替换硬约束的方法在我后来做多目标权衡时也很有用。如果我想看“磁场最大”和“温升最小”之间的帕累托前沿,就固定住两组权重参数分别跑优化,把两个极端点和中间几个权重点连起来,就是近似的帕累托前沿。这个方法简单有效,适合在项目初期快速评估设计空间上的可行范围。
5.4 求解器不收敛的快速排查手册
优化过程中,求解器不收敛是最常见的卡壳点。下面这个排查顺序是我多次实战后总结出来的,按这个顺序查,能快速定位问题:
- 检查几何构建是否成功:尤其是参数化尺寸变化导致某些小特征消失或自相交。
- 检查网格剖分是否报错:出现“failed to mesh”时,把对应域的材料属性也查一遍,有时候是某个域被几何切割成了碎片。
- 检查材料属性的有效性:非线性B-H曲线插值要在整个磁密范围内有效,超出范围时会直接导致迭代发散。
- 对于稳态求解器,手动调低阻尼因子或增加迭代次数,看能否勉强收敛。
- 如果始终不收敛,用更粗的网格试跑一次,判断是网格问题还是物理设置问题。
- 最后的兜底手段是逐步加载:先以低电流求解,再增加到目标电流,把前一步的解作为下一步的初值。
这六个步骤基本覆盖了90%的收敛问题。最常被忽略的是第一条,因为几何参数化后,某些设计变量的组合确实会在几何重建时报错,而报错信息可能藏在日志的角落里,不是每次都能一眼看到。
6. 我踩过的坑与后期扩展想法
6.1 从二维到三维的扩展空间
这个项目用的是二维轴对称模型,对于旋转对称结构完全够用。但你如果把它推广到非对称结构,比如E型电磁铁、带偏心气隙的执行器,二维模型就不适用了,必须切换到三维。三维模型的计算量会增长一个数量级以上,这时前面提到的网格策略和优化算法参数都要重新调整。我的建议是:如果三维模型单次仿真时间超过5分钟,就一定要用代理模型(surrogate model)方法,先采样几百组参数建立响应面,再在响应面上做优化,否则优化周期会拉到不可接受的水平。
6.2 把优化结果反哺到知识库
最后说一个偏项目管理的经验。我在这个项目里把每一轮优化的参数组合、目标函数值和最终判定都记录到一张表里,即使是被淘汰的方案也保留下来。到项目后期,这些数据构成了一个宝贵的设计知识库。新项目启动时,我可以直接查这张表找到相似的初始设计,而不必每次都从零开始驱动遗传算法。比如这次优化发现“线圈外径与铁芯半径之比在3.2到3.5之间时气隙磁场接近峰值”,这个结论在新的电磁阀设计中可以当作经验公式来用,极大缩短了初始设计阶段的试错时间。
根据我个人的体会,电磁优化设计最大的门槛其实不在于某个软件用得多熟练,而在于建好“参数-仿真-目标-算法”这个闭环后,是否有耐心去调校每个环节的细节。网格策略、罚函数系数、算法参数、变量上下界,每一项都值得花时间反复试。当你把这条链路跑顺后,它会变成一套可以复用的设计方法论,而不仅仅是一个项目的解决方案。这个项目后期,我又用同样的流程优化了一个不同尺寸规格的执行器,只改了参数边界和材料曲线,整个优化流程几乎原样复用,跑了不到两天就拿到了满意的结果。这种“一次搭好、多次复用”的收益,才是这个项目最值钱的部分。