simulink仿真过程
Simulink求解器
Simulink仿真过程
Simulink 模型的执行分几个阶段进行。首先进行的是初始化阶段,在此阶段,Simulink 将库块合并到模型中来,确定传送宽度、数据类型和采样时间,计算块参数,确定块的执行顺序,以及分配内存。然后,Simulink 进入到“仿真循环”,每次循环可认为是一个“仿真步”。在每个仿真步期间,Simulink 按照初始化阶段确定的块执行顺序依次执行模型中的每个块。对于每个块而言,Simulink 调用函数来计算块在当前采样时间下的状态,导数和输出。如此反复,一直持续到仿真结束。下图所示为一个仿真的步骤:
![](https://www.ilovematlab.cn/data/attachment/forum/201308/23/161834ccooc12no7nlj7nh.png)
![](https://www.ilovematlab.cn/data/attachment/forum/201308/23/161834ccooc12no7nlj7nh.png)
Simulink求解器分类
Simulink求解器可分为两大类:变步长求解器和定步长求解器。也可细分为:连续求解与离散求解、隐式求解与显式求解、单步求解与多步求解以及单阶式与变阶式求解。
(1)定步长与变步长求解器
定步长求解器的仿真步长为定制,没有误差控制机制;变步长求解器在仿真过程中需要计算仿真步长,通过增加/减小步长来满足所设定的误差宽容限。在生成实时运算代码时,必须使用定步长求解器,若不打算配置模型代码生成,求解器的选择根据建立模型而定。通常,变步长求解器可以减少仿真时间,定步长求解步长越小,仿真精度越高,故在同样仿真精度要求下,在采用定步长求解器进行仿真时,整个仿真过程必须采用变步长求解器中的最小步长。
(2)连续与离散求解器
在定步长与变步长求解器中均有连续与离散求解器。连续与离散求解器都是依靠模块来计算所有离散状态值。定义离散状态的模块负责在每个步长的时间点计算离散状态值,连续求解器是通过数值积分来计算定义连续状态的模块的状态值。在选择求解器时,必须先确定模型中是否需要离散求解器。在模型中若没有连续状态模块,求解器采用连续、离散均可,若有连续状态模型必须采用连续求解器。
(3)显式与隐式求解器
隐式求解器的应用主要解决模型中的刚性问题,显式求解器应用解决非刚性问题。譬如,在控制系统中,控制部件反应灵敏是快变的,具有小的时间常数,而受控对象一般惯性大事慢变的,具有大的时间常数。通常将具有非常不同时间尺度的系统称之为刚性系统,通俗讲,就是系统中含有时间快变和慢变解分量(同时含有小时间常数和大时间常数的系统)。刚性系统有非常大的恢复能力使得快变化分量的扰动很快就衰减,当数值积分这样一个系统时,一旦快变分量消失时期望选取合适的时间步长用于计算慢变分量。故刚性系统的实质是要计算的解是慢变化,但存在迅速衰减的扰动,这样的扰动出现使得慢变解的数值计算复杂化。故,对系统中的震荡现象,隐式求解远比显式求解稳定,但计算的消耗比显式求解大,它需要在仿真的每个步长利用Newton-like方法计算所产生的雅克比矩阵和代数方程组。为了减少计算消耗,Simulink提供了计算雅克比方法的参数,提高仿真性能。
(4)单步与多步求解器
在Simulink求解库中提供了单步与多步求解器。单步求解就是在计算系统当前时刻y(tn),需要利用前一时刻y(tn-1)以及在tn-1与tn之间多个时间点的微分量(这些时间点称为微步长);多步求解器就是利用系统前多个时刻的值计算当前时刻的值。Simulink提供了一个显式多步求解器ode113和一个隐式多步求解器ode15s,这两个都是变步长求解器。
(5)变阶式求解器
Simulink提供两种变阶式求解器,ode15s求解器利用1阶到5阶仿真;ode113应用1阶到13阶。对于ode15s可以设置最高阶次。
定步长求解器的选择
(1)定步长离散求解器
定步长离散求解器通过在当前时间点的基础上加上仿真步长来计算下一时间点。故,仿真的精度和时间长度取决于仿真步长的大小。步长越小精度越高。仿真步长可以任意设置,当步长设置为缺省时,若模型中含有离散采样模块,Simulink将最小采样步长作为求解器的基步长(通常指最小仿真步长),若没有则默认整个仿真只有50步,仿真步长为仿真时间历程的1/50。
(2)定步长连续求解器
定步长连续求解器通过在当前时间点的基础上加上仿真步长来计算下一时间点,但通过数值积分计算连续状态。利用上一时间点的值和积分微步计算当前时间点的值。定步长连续求解器可以用于计算没有连续状态的模型,但增加计算负担。通常,模型中没有连续状态模块采用离散求解器仿真。
Simulink提供了两种定步长连续求解器:隐式求解和显式求解。主要区别在于计算速度和稳定性方面,隐式比显式的每步计算量大,但稳定性好。
(a)显式定步长连续求解器
Simulink根据数值积分方法的不同分为多种不同显式定步长连续求解器,其系统显函数的数学表达为:
式中,x为状态,h为时间步长,Dx为状态微分,显式求解器利用当前时间点的状态值和状态微分计算下一时间点的状态值。Simulink提供的求解器具体如下表:
求解器
|
积分方法
|
精度等级
|
ode1
|
Euler’s Method
|
1
|
ode2
|
Heun’s Method
|
2
|
ode3
|
Bogacki-Shampine Formula
|
3
|
ode4
|
Fourth-Order Runge-Kutta (RK4)Formula
|
4
|
ode5
|
Dormand-Prince(RK5)Formula
|
5
|
ode8
|
Dormand-Prince RK8(7) Formula
|
8
|
这些求解器都没有误差控制机制,仿真精度和持续时间直接由仿真步长控制。表中的求解器根据数值积分方法的复杂度(精度等级)将求解器由简单到复杂排序。在相同的仿真步长设置下,求解器计算越复杂,计算结果精度越高。
在设置求解器时,若选择定步长求解,Simulink默认为ode3,其支持离散和连续状态求解,且仿真性能适中(计算精度和计算消耗),其仿真步长的设置和离散求解器一样,在缺省步长设置时,若模型中有离散状态模块,则将模型中最小采样时间作为求解器的基步长,若没有则默认整个仿真只有50步,仿真步长为仿真时间历程的1/50。
(b)隐式定步长连续求解器
Simulink提供了一种隐式定步长求解器,ode14x。其系统隐函数的数学表达为:
式中,x为状态,h为时间步长,Dx为状态微分,此求解器综合利用牛顿迭代法和外推法,根据当前状态值计算下一时间点的状态。用户可以设置牛顿法迭代次数和外推阶次。迭代次数越大、外推阶次越高,仿真精度越高,同时每一仿真步长的计算负担也越大。
(3)定步长连续求解选择过程
Simulink中的每个定步长连续求解器,只要设置足够小的仿真步长,都能达到期望的计算精度,但通常不实际,故需要选择最佳的求解器,其选择过程如下图所示。
![](https://www.ilovematlab.cn/data/attachment/forum/201308/23/161958nphmkrz5jelvuv6k.png)
![](https://www.ilovematlab.cn/data/attachment/forum/201308/23/161958nphmkrz5jelvuv6k.png)
变步长求解器的选择
变步长求解器与定步长求解器一样,包含多个连续求解器和一个离散求解器,两种求解器的选择关键在于模型中是否有状态模块或是否有离散状态模块。
(1)变步长连续求解器
Simulink中的变步长求解器通过增大/减小仿真步长,通过控制局部误差实现仿真精度控制。仿真过程中,在每一时间点都要计算步长,增加了计算开销,但在仿真精度要求下可以减少仿真的步数和仿真时间。
(a)显式变步长连续求解器
显式变步长求解器主要计算无刚度系统,有一下三种。
求解器
|
单步计算
|
多步计算
|
精度等级
|
方法
|
ode45
|
×
|
中
|
Runge-Kutta,
Dormand-Prince (4,5)pair
|
|
ode23
|
×
|
低
|
Rung-Kutta(2,3) pair of
Bogacki & Shampine
|
|
ode113
|
×
|
由低到高
|
PECE Implementation of Adams-Bashforth-Moutlon
|
ode45基于显式Runge—Kutta(4,5)公式,Dormand—Prince对.它是—个单步求解器(solver)。也就是说它在计算y(tn)时,仅仅利用前一步的计算结果y(tn-1).对于大多数问题.在第一次仿真时、可用ode45试一下。
ode23是基于显式Runge—Kutta(2,3).Bogackt和Shampine对.对于宽误差容限和存在轻微刚性的系统、它比ode45更有效一些.ode23也是单步求解器。
ode113是变阶Adams-Bashforth—Moulton PECE求解器.在误差容限比较严时,它比ode45更有效.odell3是一个多步求解器,即为了计算当前的结果y(tn),不仅要知道前一步结果y(tn-1),还要知道前几步的结果y(tn-2),y(tn-3),…。
(b)隐式变步长连续求解器
隐式变步长连续求解器用于解决刚性问题,主要有一下四种:
求解器
|
单步
|
多步
|
精度
等级
|
重置方法
|
最大阶次
|
方法
|
ode15s
|
×
|
低到中
|
×
|
×
|
Numerical Differentiation Formulas (NDFs)
|
|
ode23s
|
×
|
低
|
Second-order, modified Rosenbrock formula
|
|||
ode23t
|
×
|
低
|
×
|
Trapezoidal rule using a "free" interpolant
|
||
ode23tb
|
×
|
低
|
×
|
TR-BDF2
|
odel5s是基于数值微分公式(NDFs)的变阶求解器.它与后向微分公式BDFs(也叫Gear方法)有联系,但比它更有效。ode15s是一个多步求解器,如果认为一个问题是刚性的,或者在用ode45s时仿真失败或不够有效时,可以试试odel5s。 odel5s是基于一到五阶的NDF公式的求解器.尽管公式的阶数越高结果越精确,但稳定性会差一些.如果模型是刚性的,并且要求有比较好的稳定性,应将最大的阶数减小到2。选择odel5s求解器时,对话框中会显示这一参数. 可以用ode23求解器代替。del5s,ode23是定步长、低阶求解器。
ode23s是基于一个2阶改进的Rosenbrock公式.因为它是一个单步求解器,所以对于宽误差容限,它比odel5s更有效.对于一些用odel5s不是很有效的刚性问题,可以用它解决。
ode23t是使用“自由”内插式梯形规则来实现的。如果问题是适度刚性,而且需要没有数字阻尼的结果,可采用该求解器。
ode23tb是使用TR—BDF2来实现的,即基于隐式Runge—Kutta公式,其第一级是梯形规则步长和第二级是二阶反向微分公式。两级计算使用相同的迭代矩阵.与ode23s相似,对于宽误差容限,它比odtl5s更有效。
(2)过零检测
变步长求解器利用过零检测处理连续信号。
(3)变步长求解器误差容限
变步长求解器利用标准控制技术监视每一步长的局部误差。在每个仿真步长内,求解器计算步长时间点的状态和局部误差(即状态的局部误差,包括绝度误差和相对误差),并与设置的可接受误差(绝度和相对误差)进行比较,若超出设定值,则减小步长重新计算。
相对误差就是每一仿真步长计算的状态误差,默认为1e-3,即相对误差控制在0.1%。
绝对误差是一个误差界限值。Simulink默认设置为Auto,即所有状态的绝对误差容限初始设置为1e-6。
Simulink仿真参数设置界面
Solver 面板:
(1)仿真时间设置:
Start timeà开始时间:仿真和生成代码为双精度值,单位秒;参数名称为StartTime,参数类型为string。
Stop timeà结束时间:仿真和生成代码为双精度值,单位秒;参数名称为StopTime,参数类型为string;此值应不小于Start time(若相等,则只运行一步),可以设置为无穷大inf。
(2)求解器设置:不同的求解器,具体设置参数也不尽相同,这里指说明共同部分。
变步长求解器由下列构成
Solver
Max step sizeà设置最大步长,缺省为auto,即为仿真时间历程的1/50;参数名称为MaxStep。
Min step sizeà设置最小步长,缺省为auto,即为不限制警告数量,最小步长近似机器精度;可以设置为一个大于零的实数,或者两个元素的数组(在产生错误警告前,第一个元素最小步长,第二个元素为最大步长),参数名称为MinStep
Initial step sizeà求解器第一步执行的时间步长。
Relative tolerance
Absolute tolerance
Shape preservation
Initial step size
Number of consecutive min steps
Zero-crossing control
Time tolerance
Number of consecutive zero crossings
Algorithm
定步长求解器由
Solver
Periodic sample time constraint
Fixed-step size (fundamental sample time)
Tasking mode for periodic sample times
Higher priority value indicates higher task priority
Automatically handle rate transitions for data transfers
我们向往远方,却忽略了此刻的美丽