Simscape Electrical快速仿真的实现方法
| 本文作者:MathWorks 中国高级应用工程师鲍经纬
很多工程师都经历过同一种变化:模型刚搭建时几秒钟就能跑完;随着器件、状态机、控制逻辑、传感器和记录信号不断增加,模型仍然能跑,但等待时间越来越长。
这时最常见的反应是更换求解器、调整步长、修改容差。然而,如果尚未定位真正的性能瓶颈,这些操作很可能只是碰运气。更可靠的路径是:先测量和解释仿真行为,再针对诊断结果调整模型。
1.全文结构
全文大致分为下面两部分,文中及最后有拓展内容的链接,感兴趣的同学可以进一步研究探索。
1.1模型性能分析
适用情况:模型已能运行,但仿真较慢、步长异常或初始化困难
核心内容:建立基线;定位主要耗时来源;分析求解器行为;检查状态与初始化;形成诊断结论
1.2建模及配置方法
适用情况:从零建模,或依据诊断结论调整模型
核心内容:保真度;PWM与采样时间;求解器与步长;变量尺度;仿真模式;HIL/HDL部署
仿真加速是一个经典的话题,MathWorks快速仿真指南已经给出了一个流程图:从诊断仿真时间和信号采样时间开始,随后根据主要仿真目的区分桌面仿真与HIL仿真。桌面仿真路径进一步涉及变步长物理网络、模型保真度、PWM、Solver Profiler及其他分析工具;HIL路径则涉及固定步长物理网络和Simscape to HDL。本文介绍的内容是流程图里的一些具体实现方法,希望当大家碰到仿真加速的问题时,可以据此发现“因”、洞见“果”。

2.性能分析
这一部分适用于模型已经建立并能够运行,但需要解释仿真时间过长、步长异常、初始化困难或计算开销增加等问题。重点是先获得可重复的测量结果,再依据工具输出定位原因和调整模型。
2.1Simulink Profiler:仿真时间主要消耗在哪里?
Simulink Profiler从模型执行角度查看模块和子系统的总时间、自用时间及调用次数。总时间包含子组件,自用时间表征组件本身的执行开销。分析时应区分“单次执行开销较大”和“调用次数过多”两类问题。
在MATLAB中使用下面命令打开示例模型:
openExample('simulink_automotive/ModelingAFaultTolerantFuelControlSystemExample')
在“调试>性能”中打开Simulink Profiler
在新标签页“探查器”里点击“探查”,运行结束后可以看到探查器报告。可以单击列表中的模块定位至模型中对应位置。

探查器报告用于识别主要耗时模块、子系统及调用链
2.2Solver Profiler:为什么求解器需要更多计算?
如果说Simulink Profiler关注的是“谁在消耗时间”,那么Solver Profiler关注的是“为什么求解器不得不消耗这么多时间”。它能够用于观察步长变化、过零事件、Solver Reset、Solver Exception、Jacobian更新等,帮助解释求解器为何缩小步长、重新计算或在局部时间区间遇到困难。
使用下面的命令打开示例模型:
openExample('simscapeelectrical/SinglePhaseGridSolarPVExample')
打开后在标签页“调试”-“性能”下可以看到“求解器探查工具”,如图:
可以通过勾选“配置”中的选项选择要记录的状态,运行后通过“查看”中的选项显示仿真中的事件,下图中可以看到过零事件通过黄色圆点显示出来。

页面中间显示着整个仿真期间步长的变化;左侧显示最大最小步长、总步数、运行/仿真事件比等统计信息;页面下方给出状态分析及优化建议。示例中可以观察到求解器异常和密集的过零事件的提示,并且Solver Profiler针对当前设置给出了增大最大步长和调整绝对容差值的建议。可以结合建议内容进一步分析仿真过程,比如当过零事件密集,可以看一看模型是否存在开关、限幅或逻辑切换频繁等情况。
对于Simscape模型,还有其他工具帮助我们从模型结构、状态和初始化解释仿真行为。
2.3Statistics Viewer:状态从哪里来?
Statistics Viewer用于统计模型特征,比如网络规模、状态数量,帮助理解模型真正的复杂度来源。沿用Solver Profiler一节中的模型,在标签页“调试”-“Simscape”里可以看到“统计量查看器”,如图:

点击“更新模型”之后左侧会出现统计信息:包括一维物理系统,Simulink/Simscape接口等,其中一维物理系统里包含了Simscape Electrical系统的信息(如果使用了基于Simscape物理网络的其他工具箱模块,也会在对应类别中显示统计信息),Simulink/Simscape接口给出了Simulink和Simscape转换模块的统计信息。可以看到Simscape生成的总状态变量有165个,实际保留的动态状态有9个连续变量。

状态数量用于理解模型实际复杂度
点击“变量”查看“微分变量”,可以看到该模型保留的微分变量主要对应电容电压和电感电流,这些变量构成模型动态状态的重要来源。

选择“L.i_L”,点击突出显示模块,可以看到模块高亮情况如下图:

再对比Solver Profiler中的状态,从下图中可以看到按状态导数排名前三个分别是L.v,Average_Value_Chopper.v2,C1.i,

突出显示后可以看到分别是下图中三个红圈中的模块。

做一个简单的区分,“统计量查看器”更关注模型结构,可以分析编译后的模型,帮助我们看到模型的规模、状态的来源、编译器减少了多少状态;“求解器探查工具”更关注仿真过程,帮助我们看到步长如何变化,以及哪些状态或事件与步长缩小有关。
2.4Variable Viewer:初始化是否合理?
Variable Viewer可以用于检查模型初始化结果。帮助分析初始状态是否合理、是否存在收敛问题等问题。

继续使用前面的模型,打开“调试”-“Simscape”-“变量查看器”,点击“更新”后可以看到如上图的内容。可以看到各变量初始化阶段的状态、优先级、目标值和实际值(求解器为系统的初始状态找到的值)等信息,模型会优先尝试满足高优先级的目标值,通过状态列显示实际值和目标值的符合状态。
图中可以看到状态呈现绿色,表示变量初始化目标已满足或该变量没有设置初始化优先级。如果不能满足高优先级的目标,仿真可能会出现警告或报错,对于低优先级的目标,求解器会尝试使实际值满足或接近目标值。如果Simscape模型出现初始化报错的情况,也可以尝试使用变量查看器进行检查。
2.5Performance Advisor:自动检查配置
在大型项目中,可以使用Performance Advisor通过自动检查发现配置问题、性能隐患、非最优设置等情况,相当于给模型做一次全面体检。自动检查不能替代工程判断,但可以作为调整前后的标准化检查,更多内容可以参考:
Improve Simulation Performance Using PerformanceAdvisor:https://ww2.mathworks.cn/help/simulink/ug/consult-the-performance-advisor.html。
3.建模及配置
这一部分从建模开始阶段讨论如何依据工程问题和目标用途选择模型结构与配置。内容既适用于从零开始建模,也可作为第一部分完成性能分析后的调整参考。这一部分涉及的内容大致如下:

3.1保真度
模型保真度可以理解为模型保留物理细节的程度。模型应具有足以回答工程设计问题的细节,但不应加入超出需求的复杂度,因为更高保真度会降低仿真速度并增加参数化复杂度。
3.1.1功率变换器
以功率变换器为例,在Simscape Electrical中,可以采用两种方法来构建模型:
使用预构建的功率变换器模块:使用Simscape >电气> Semiconductors & Converters库中提供的预构建变换器模块。
从基本组件构建模型。
使用Simscape >电气> Semiconductors & Converters库中的模块来建模半导体器件,例如晶体管和二极管。
使用Simscape >电气> Passive库中的模块来建模电感、电容等无源元件。
在条件允许时优先使用预构建模块;只有当现有拓扑不支持,或确实需要离散器件提供的功能时,再使用基本组件搭建。下面链接中的示例采用了可变子系统的方式对三种不同保真度的转换器进行了建模仿真结果对比:
Manage Model Fidelity Using Variants
https://ww2.mathworks.cn/help/sps/ug/manage-model-fidelity-using-variants.html
3.1.2 Phasor or EMT
在保真度这一部分,还要提一下相量(phasor)仿真和电磁暂态(EMT)仿真。采用相量仿真有两个核心条件:模型中包含具有共同基频的周期交流信号;关注的是变化较慢的交流相关量,例如幅值、相位,以及直流输出信号。简单来说,相量模式更适合研究包络和慢动态,而不是一个交流周期内发生了什么。通过Solver Configuration模块可以进行相关的设置,感兴趣的同学可以移步该示例做进一步研究:
Phasor-Mode Simulation Using Simscape Components
https://ww2.mathworks.cn/help/sps/ug/phasor-mode-simulation-in-simscape-components.html
3.1.3电池模型
对于锂电池建模,可以使用Simscape Battery直接配置参数以平衡建模粒度与模型仿真速度。

3.2求解器
在Simscape模型中,“求解器”常常指两层设置:
Simulink全局求解器:在模型配置参数中设置,负责整个模型的时间推进。它可以是变步长或固定步长,也可以是显式或隐式方法。
Simscape局部求解器:在Solver Configuration模块中为某个物理网络启用。不同物理网络可以采用不同的局部求解器设置。
如果目标是模型开发、调试、参数分析或算法验证,建议优先使用变步长求解器。原因不只是“省时间”,更关键的是它会根据系统动态自动调整步长:动态平缓时迈大步,快速变化或事件附近自动缩小步长。对于同时包含快慢时间常数的电气系统,这通常能在精度与速度之间取得更好的平衡。
对于包含物理网络的模型,通常优先采用隐式求解器,例如daessc、ode23t或ode15s。物理系统经常包含微分代数方程以及数值刚性,隐式方法通常比ode45、ode113一类显式方法需要更少的时间步。新建模型的自动求解器会根据模型结构选择合适方法。
当模型需要用于实时仿真、HIL测试,或者生成按固定采样周期执行的嵌入式代码时,通常需要采用固定步长求解器。此时有两条主要路线:Simscape局部固定步长和Simulink全局固定步长。使用局部求解器后,该物理网络以其局部步长执行,并作为离散状态呈现给全局Simulink求解器;全局固定步长更适合分析PWM开关事件与采样时间之间的相互影响。两条路线没有绝对优劣。局部求解器方案在某些模型中可能具有更好的仿真时间表现,但最终仍需基于具体模型测试。对于局部求解器方案,可以先用Backward Euler获得稳定基线,再比较Trapezoidal Rule和Partitioning。
固定步长的核心不是“越小越准确”,而是在计算预算内解析目标动态。步长过大,可能错过开关事件、无法充分解析高频动态、改变峰值或相位;步长过小,则会让实时处理器超限,桌面仿真也会明显变慢。
建议先使用变步长求解器完成模型调试与验证,并将其结果作为固定步长仿真的参考基线。对于需要用于实时仿真、HIL测试,或者生成按固定采样周期执行的嵌入式代码的模型,可以在完成变步长验证后切换到固定步长模式,通过比较固定步长与变步长结果,并结合Solver Profiler分析模型动态特性,逐步调整步长大小,在计算成本与仿真精度之间取得平衡。
对于物理仿真求解器的选择,更多的内容可以参考链接:
Making Optimal Solver Choices for Physical Simulation
https://ww2.mathworks.cn/help/simscape/ug/making-optimal-solver-choices-for-physical-simulation.html
3.3变量尺度
当模型中的物理量跨越多个数量级时,标称尺度不合理可能使误差控制和收敛变得困难。Variable Scaling Analyzer(变量缩放分析器)可以用于分析变量尺度,能够帮助发现哪些变量可能存在尺度问题以及应如何调整标称值(Nominal Value)从而提高求解器稳定性与效率。这个工具可以在APP标签页中找到,如下图:

打开后可以点击运行查看模型中变量的信息,其中有仿真期间模型变量有多少时间低于绝对容差、最大最小值等信息,方便进行标称值的确定。

Simscape模型中标称值设置选项如下图所示。同时需要注意变量缩放不是简单改变数值大小,而是向求解器提供合理的量级信息,调整后仍需验证结果。

除了使用上述的方法之外,建议在建模仿真时注意以下几点,进一步提升效率:
仿真模式选择
这个功能可能不少同学已经有所了解,Simulink提供了Normal Mode,Accelerator,Rapid Accelerator等仿真模式。如果模型结构不再频繁变化,可以使用Accelerator或Rapid Accelerator。它们通过构建并复用仿真执行目标来减少部分执行开销,在很多场景下能够获得更好的仿真性能。对于结构保持不变的重复仿真,还可评估Fast Restart,以减少重复编译。当然,实际效果取决于模型结构、参数变化方式以及单次或批量运行场景。
关于这部分内容,想了解更多的同学可以移步:
选择仿真模式:
https://ww2.mathworks.cn/help/simulink/ug/choosing-a-simulation-mode.html
利用多核计算能力
现在大多数工程师的电脑都具备多核CPU。但很多仿真任务实际上只使用了单个核心。而有些任务天然适合并行执行,例如参数扫描、灵敏度分析、设计优化、Monte Carlo分析等,这种情况下可以借助并行计算工具(Parallel Computing Toolbox),同时运行多个仿真实例。这里优化的是全部工况的总完成时间,而不一定是单次仿真时间。
PWM实现方式
对于采用高频开关控制的系统而言,PWM实现方式本身往往就是决定仿真效率的关键因素。即使采用相同的转换器模型、相同的求解器以及相同的保真度等级,不同PWM实现方案所产生的开关事件数量、离散采样频率以及状态切换方式仍可能导致明显不同的执行时间表现。
MATLAB/Simulink提供了多种实现方式,满足谐波分析、功率损耗分析、控制设计等多种场景,可以结合下图进行选择,具体示例可参见文末链接。

面向HIL、FPGA与HDL的模型边界
当目标是HIL、FPGA或HDL实现时,模型还需要满足确定性执行、固定采样、计算资源和可部署结构等要求。建议区分用于桌面分析的高保真参考模型与用于硬件执行的实时模型,并通过关键指标保持两者之间的可追溯验证。
由于篇幅限制,本文未能对所有内容展开详细讨论,感兴趣的同学可以参考以下资料进一步了解。
1) 视频:
用于快速仿真的 Simscape Electrical建模实践 【点击“阅读原文”】或者选择以下 b 站方式打开。
2) 示例:
https://github.com/simscape/FastElectricalSimulations
视频为全部内容的集合,不仅包含了分析方法,还有结果分析与调整优化的过程,比如其中的“使用快速实现来生成变频脉冲”,以LLC谐振变换器为例,使用Solver Profiler定位过零事件、求解器异常,在明确保真度需求的前提下进行了调整优化,显著改善了仿真性能,非常适合了解本文相关内容后实践。
示例链接为内容相关的模型,打开后是工程的形式,与视频内容对应,可下载仿真。
结语
Simscape Electrical快速仿真是一项贯穿建模、分析和部署的工程工作。成熟的性能优化不是让模型尽可能简单,而是在满足工程问题的前提下,以合适的计算成本获得可信结果。
关于作者
鲍经纬,MathWorks中国
MathWorks 中国高级应用工程师,致力于基于模型设计的应用和推广。在加入 MathWorks 之前,曾供职于江南造船和中国航发商发,从事船舶电力系统设计、航空发动机控制系统研发等工作。毕业于浙江大学,获得机械电子工程博士学位和通信工程学士学位。









