您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > simulink动态系统建模仿真 第7章
第7章高级仿真概念第7章高级仿真概念7.1过零检测7.2处理代数循环7.3高级积分器7.4仿真诊断选项设置7.5仿真性能优化设置第7章高级仿真概念7.1过零检测7.1.1过零检测的工作方式状态变量中的不连续常常表征了动态系统的重要事件,例如,当弹球撞击地板时,撞击的位置是不连续的。由于不连续性常常表示动态系统的一个重大改变,因此对不连续点进行精确仿真是非常重要的,否则,仿真可能会导致错误的结论。还以仿真小弹球为例,如果在两次仿真步之间小球撞击了地板,那么被仿真的小球在半空中就会翻转方向,这就会使研究人员对小球的物理运动得出错误的结论。第7章高级仿真概念为了避免这样的错误,对不连续点进行仿真是非常重要的,当然,完全依赖仿真算法来确定仿真时间是不能满足这样的要求的。以定步长算法为例,定步长算法在固定步长的整数倍时刻计算状态变量的值,但是,谁也不能保证不连续点的出现时刻就在定步长的整数倍时刻。用户也可以减小步长以增大撞击到不连续点的可能性,但这无疑会增加仿真的执行时间。第7章高级仿真概念这样看来,变步长算法似乎可以解决这样的问题。变步长算法会动态地调整步长,当状态变量变化缓慢时增大步长,而当状态变量变化快速时减小步长,在不连续点处,变量的变化是非常迅速的。这样,从理论上来说,变步长算法应该可以准确地找到不连续点,而存在的问题是定位不连续点的精确性。为了找到不连续点,变步长算法必须采用越来越小的步长,这样就大大降低了仿真的效率。虽然这会放慢仿真的速度,但这样做对有些模块来讲是至关重要的,因为这些模块的输出可能表示了一个物理值,它的零值有着非常重要的意义,也有可能这些模块用来控制另外的一些模块。事实上,只有少数模块能够发出事件通知,而且可能与不止一个类型的事件发生关联,当一个模块通知说前一个时间步上发生了过零,那么变步长求解器就会缩小步长,即使绝对误差和相对误差是可以接受的,它也会告知系统有事件发生。这个事件的通知过程如图7-1所示。第7章高级仿真概念求解器系统求解器系统图7-1第7章高级仿真概念Simulink利用过零检测来解决这样的问题。它是在系统和求解器之间建立一种对话工作方式,对话包含的一个内容就是事件通知,Simulink将消息由系统传送到求解器,即系统告知求解器在前一个时间步上发生了一个事件,一个重要的事件就是“发生了一个过零!”,事件都由过零表示。过零通常在下面两个条件下产生:(1)信号在上一个时间步改变了符号,即由正变负或者由负变正,包含变为0和离开0;(2)模块在上一个时间步改变了模式,例如积分器进入了饱和区段。第7章高级仿真概念使用Simulink中的过零检测后,模块在仿真开始时注册一组过零变量,其中的每个变量都是可能含有不连续状态变量的函数,当发生不连续时,过零函数会从正值或负值穿越零。在每个仿真步结束时,Simulink会要求每个已注册过零变量的模块更新变量,然后检查在仿真时间步的结束时刻是否有变量改变了符号,如果有,则表示在当前这个时间步上系统出现了不连续点。如果检测到过零,则Simulink会对每个改变符号的变量在前一时间步和当前时间步之间进行插值,以估算过零的准确时刻;然后,Simulink再逐渐增加时间步,并依次越过过零点进行仿真。利用这种方法,Simulink避免了对不连续点的仿真,而在很多情况下,这些不连续点处的状态变量的值可能都没有定义。第7章高级仿真概念7.1.2过零检测的实现方式过零检测可以使Simulink精确地仿真不连续点,而不必过多地选用小步长。实际上,Simulink中的许多模块都支持过零检测,在实际建模仿真中,如果用户对所有的系统,包括含有不连续环节的系统都利用过零检测进行仿真,那么不仅仿真过程的速度更快,而且精度也会提高。虽然Simulink中的许多模块都能够产生过零,但各个模块的过零类型是有差异的。下面举例说明带有过零的Simulink模块的过零检测方式。例如,对于Abs模块来说,当输入信号改变符号时将产生一个过零事件;而对于Saturation(饱和)模块来说,当过零检测功能检测到Saturation模块中的如下事件时产生过零:第7章高级仿真概念输入信号到达上限;输入信号离开上限;输入信号到达下限;输入信号离开下限。状态事件的检测依赖于模型内部过零信号的结构,这个信号并不受方块图的影响。对于Saturation模块,用来检测上限过零的信号为zcSignal=UpperLimit-u,这里,u是输入信号,UpperLimit是信号上限。第7章高级仿真概念此外,过零信号还具有方向属性,带有方向的过零通常用来驱动其他模块。这个方向属性值包括:rising(上升沿R)—当信号上升穿越零时,或者信号由零值到正值时,产生过零;falling(下降沿F)—当信号下降穿越零时,或者信号由零值到负值时,产生过零;either(双边沿E)—当上升沿或下降沿发生时,产生过零。图7-2说明了过零信号的方向属性。对于Saturation模块的上限,过零的方向就是either,这样,使用相同的过零信号就可以检测到上升沿和下降沿饱和事件。第7章高级仿真概念上升沿下降沿双边沿0FRRF图7-2第7章高级仿真概念如果误差容限太大,则Simulink也有可能无法检测到过零。例如,如果过零在一个时间步内发生,而时间步的起始时刻值和终止时刻值并没有指示出符号变化,那么求解器有可能越过过零时刻而没有检测到过零。图7-3表示的是一个过零信号,左图中的积分器越过了过零,右图中的求解器则检测到了过零事件。如果用户担心会出现这样的问题,则可以减小误差容限,以保证仿真算法的步长足够小。第7章高级仿真概念未检测到过零检测到过零图7-3第7章高级仿真概念这里,把定义模块自身状态事件的Simulink模块看做具有内在过零的模块,如果用户需要明确地通知过零事件,则可以使用HitCrossing模块,这个模块在输入穿过零点时会产生一个过零,可以用它为不带过零能力的模块提供过零检测的能力。把仿真参数对话框DataImport/Export选项面板中的Outputoptions选项设置为Refineoutput或Produceadditionaloutput对于定位错过的过零检测是没有帮助的,但这两个选项有助于减少错过过零检测的机会。为了避免在检测时错过过零,用户应该改变最大步长或输出点的个数。第7章高级仿真概念7.1.3使用过零检测对于某些模型,模型在不连续点处有可能会出现高频抖动。还以弹跳小球为例,将小球抛向空中,然后反复地撞击地面,每一次小球撞击地面时,Simulink在小球的速度和位置上都会遇到一个不连续点,由于这种撞击反复地出现过零检测,因此Simulink的仿真步长会变得越来越小。从本质上来说,这种仿真结果也不是很完善。在Simulink的仿真参数设置对话框中,对话框的Solver选项面板和Diagnostics选项面板都提供了对过零进行的检测设置,用户可以根据需要对模型进行相应的设置。第7章高级仿真概念图7-4是仿真参数对话框中的Diagnostics选项面板,其中的Consecutivezerocrossingsviolation(连续过零检测)选项有两个选项供用户选择,即warning和error,当Simulink在仿真过程中检测到连续过零时,它会根据用户的设置在MATLAB工作区中显示警告信息或错误信息。第7章高级仿真概念图7-4第7章高级仿真概念如果发生两个过零事件的时间小于某个特定的间隔,那么Simulink会认为这两个过零是连续的。图7-5描述的是Simulink在连续时间步t1和t2上检测过零ZC1和ZC2之间的仿真时间线,如果dtRelTolZC*t2,则Simulink会定义这两个过零是连续的,其中,dt是两个过零之间的时间,RelTolZC是Consecutivezerocrossingrelativetolerance(连续过零检测的相对误差)。Consecutivezerocrossingrelativetolerance参数在仿真参数对话框的Solver选项面板中进行设置,如图7-6所示。同时,用户还可以设置Numberofconsecutivezerocrossingsallowed(允许的连续过零的数目),如果Simulink检测到的连续过零的数目超过了限制值,那么它会根据用户在图7-4中指定的Consecutivezerocrossingsviolation诊断选项来显示警告消息或错误消息。当Simulink检测到非连续过零时,即连续过零已不再满足上述条件时,它会对过零重新进行计数。第7章高级仿真概念图7-6第7章高级仿真概念当选择变步长算法仿真模型时,Solveroptions选项区中的Zerocrossingcontrol选项可以控制是否启动过零检测,如图7-7所示。对于大多数模型来说,当选择较大步长仿真模型时,启动过零检测会加速仿真过程。但是,如果模型有极大的动态变化,则关闭过零检测会加速仿真过程,但会降低仿真结果的精确度。第7章高级仿真概念图7-7第7章高级仿真概念对于模型中的某些模块,用户可以在模块的参数对话框中不选择Enablezerocrossingdetection选项来关闭模块的过零检测,并设置Zerocrossingcontrol选项为Uselocalsettings,表示只对模型进行局部过零检测。局部过零检测可以减少Simulink频繁地对模型进行过零检测,而模型中的其他模块同样可以获得使用过零检测带来的高精度。表7-1列出了Simulink中具有过零的模块,每个模块的过零类型是不同的,有的过零只是用来通知求解器的模式是否发生了改变,另外一些过零类型则与信号有关,用来驱动其他模块。第7章高级仿真概念表7-1具有过零的Simulink模块模块过零说明Abs当输入信号在上升方向或下降方向发生过零时进行检测Backlash到达上限时进行检测;到达下限时进行检测DeadZone进入死区时(输入信号减下限)进行检测;离开死区时(输入信号减上限)进行检测FromWorkspace当输入信号在上升方向或下降方向有不连续点时进行检测HitCrossing当输入信号越过阈值时进行检测If当If条件满足要求时进行检测Integrator如果是重置端口,则当重置发生时进行检测。如果输出受限,则有三个过零:到达饱和上限时进行检测;到达饱和下限时进行检测;离开饱和时进行检测MinMax对于输出向量中的每个分量,当输入信号是新的最小值或新的最大值时进行检测第7章高级仿真概念Relay如果延迟关闭,则在开关打开时进行检测;如果延迟打开,则在开关关闭时进行检测RelationalOperator当输出改变时进行检测Saturation当到达上限或离开上限时进行检测;当到达下限或离开下限时进行检测Sign当输入信号越过零时进行检测SignalBuilder当输入信号在上升方向或下降方向有不连续点时进行检测Step检测时间步Subsystem对于依条件执行子系统,如果出现使能端口,则进行检测;如果出现触发端口,则进行检测Switch当开关条件发生时进行检测SwitchCase当满足case条件时进行检测第7章高级仿真概念例7-1使用过零检测。图7-8中的模型是一个带有过零检测功能的模型。该模型采用Function模块和Abs模块计算对应输入的绝对值,由于Function模块不支持过零,因此有一些拐角点被漏掉了,而Abs模块由于能够产生过零,因此每当它的输入改变符号时,都能够精确地得到零点的结果。第7章高级仿真概念图7-8第7章高级仿真概念这里将SineWave模块中的Frequency(rad/sec)值设置为2,把模型中的输出数据传送到MATLAB工作区,在工作区中利用plot(tout,yout)命令绘制输出结果曲线,可得到如图7-9所示的结果。从图中可以看到,实线是Function模块的输出,该模块未检测到过零事件,因此输出曲线在拐点处漏掉了一些点,正弦波的绝对值输出不完全正确;虚线是
本文标题:simulink动态系统建模仿真 第7章
链接地址:https://www.777doc.com/doc-3194673 .html