性能分析器:模型不合理的照妖镜!
本文介绍了Amesim仿真软件中多个分析模块的功能和应用。Run statistics模块统计了17项变量,其中关注的主要有CPU时长、运行时长、积分步长相关变量及不连续数量,这些变量能反映运算速度和模型稳定性。State contributions模块统计了状态变量在计算过程中的被调用次数,帮助分析模型在不同阶段的重点调用变量。Frequencies模块显示模型频率信息,重点关注阻尼比小的模态频率,以避免高频振荡。Discontinuities模块则提供了模型中不连续的详细信息,为优化子模型参数提供方向。这些模块共同帮助用户优化仿真模型,提高求解速度和稳定性。
1.1 求解的困境
在Amesim仿真求解过程中,我们经常会遇到求解十分缓慢并且没有有效提示信息,或者干脆卡死报错的情况,笔者称之为“求解的困境”。造成求解困境的最主要原因是参数设置不合理。
说到“参数设置不合理”,包括以下两种情况:
第一种是物理上的不合理。比如,当我们使用带限位的质量块时,如果设置的lower limit比higher limit还要大,这就好比儿子的年龄老子还大,肯定是不行的;再比如,图1所示的几种报错,都属于物理上的不合理而导致的计算中止。
图1 物理上的参数不合理举例
第二种是计算上的不合理。有些时候,模型的参数设置都符合工程实际,从物理上看也没有问题,但这并不意味着仿真计算可以顺利进行,因为工程上合理的参数也可能不满足Amesim求解器的运算要求,依然可能导致求解困境的发生。此时,我们仍然需要通过修改仿真参数来解决问题,甚至需要牺牲些许建模精度来换取仿真的顺利进行。
物理上的不合理通常是由建模错误造成的,我们通过认真检查都可以避免或排除此类问题;但计算上的不合理并非都源于建模错误,因此往往难以发现和解决。在我们QQ答疑群里经常会提到“参数设置不合理”,通常都是指计算上的不合理,而这正是性能分析器所要重点解决的问题。1.2 计算上的不合理导致计算上的不合理的直接原因通常有两个,一是高频振荡,二是不连续太多。我们知道,Amesim的求解器默认采用变步长进行仿真计算,可以根据具体模型调整求解步长,以便用较少的求解资源实现所需的求解精度。模型中的高频振荡和不连续会加大仿真求解的难度,求解器需要用较小的求解步长才能满足求解精度,从而减缓了仿真求解速度。如果高频振荡和不连续太多,就会大大增加求解难度,有时步长甚至会达到10的负几十次方秒的数量级,求解器会疯狂调用相应的状态变量,进而导致求解困境的发生。要解决这一问题,必须修改不合理的仿真参数,减少不必要的高频振荡和不连续数量。但麻烦的是,这些计算上的不合理往往没有那么直观,看不见也摸不着,就像妖怪一样藏在模型中惹是生非。我们没有孙悟空的火眼金睛,因此需要一面照妖镜把它们找出来,而性能分析器正是这样一面照妖镜,它可以帮我们揪出模型中参数设置的不合理之处,为我们指明改进的方向。二、性能分析器详解
通过��文的介绍,相信大家对于性能分析器的作用已经有了初步的认识。严谨讲就是:性能分析器工具可以让我们更好地分析和理解模型的求解性能;根据此工具提供的相关信息,我们可以对模型参数进行手动修改,以便改善模型的可求解性,加快仿真求解速度。
在仿真进行过程中或仿真结束后,单击工具栏中的Performance Analyzer按钮,即可打开性能分析器窗口,如图3所示。该窗口共包含四个模块,即运行统计Run statistics、状态贡献度State contributions、频率Frequencies和不连续Discontinuities。用户可以通过单击最左侧的四个按钮在不同模块间切换。
下面详细介绍性能分析器各模块的作用和使用方法。2.1 Run statistics模块Run statistics模块窗口如图5所示,用于统计计算过程中求解器的各种信息。窗口左侧显示了当前时刻求解器信息变量;右侧是绘图区,默认两张曲线图分别是CPU时长曲线和积分步长曲线(包括当前、最小和最大积分步长曲线,均以以10为底的对数形式表示)。另外,此处的变量和模型中其他变量一样,拖至模型空白处即可绘制相应曲线。
首先是CPU时长(变量①)和运行时长(变量②),前者是指从初始仿真时刻到当前仿真时刻CPU参与运算的时长,后者是指从初始仿真时刻到当前仿真时刻所经历的总时长,这两个时长往往稍有差别。在这两个时长的曲线图中,如果曲线斜率增大,说明运算速度在减慢;反之则运算速度在加快。
其次,变量③至⑦是与积分步长相关的变量,均以以10为底的对数形式表示。如果在某一时刻或某时间段内,积分步长很小,说明模型在此处存在高频振荡或者不连续的数量较多。需要指出的是,变量③表示当前时间步长,其曲线图受打印间隔影响较大,如果极小或极大的积分步长发生在打印间隔间隙,那么变量③的曲线图就会丢失这些重要信息;而变量④至⑦均不受打印间隔的影响,因此必须综合分析变量③和变量④至⑦的曲线图才能得到有用结论。
最后,变量⑧表示的是当前累计不连续数量。不连续越多,则运算越慢,甚至会卡死报错。
除上述8个变量外的其他变量,只有当我们为子模型编写代码时才有必要关注,因此通常情况下可以不用管。2.2 State contributions模块State contributions模块窗口如图6所示,用于统计各状态变量在计算过程中被调用的次数。窗口左侧列出了当前时刻模型中的各状态变量被调用的总次数,也包括它们的编号、所属子模型、变量名、单位、类型等详细信息;右侧为曲线图,上图是状态变量的累计贡献度,下图是瞬时贡献度。2.4 Discontinuities模块
上文已经提到过,不连续的数量太多会减慢仿真速度,过于密集甚至会卡死报错。Discontinuities模块提供了模型中不连续的详细信息,根据这些信息,我们可以分析得到哪些子模型在哪些时刻存在数量较多的不连续,从而为改进和优化子模型参数提供方向。