EDA365电子论坛网
标题:
了解一些Simulink求解器(Solver)方面的知识吧
[打印本页]
作者:
thinkfunny
时间:
2020-3-4 14:22
标题:
了解一些Simulink求解器(Solver)方面的知识吧
1.变步长(Variable—Step)求解器
& ^+ h, V, e5 ^" H4 ? h' @+ x
" h# ^% \7 ~( U _" w9 e
可以选择的变步长求解器有:ode45,ode23,ode113,odel5s,ode23s和discret.缺省情况下,具有状态的系统用的是ode45;没有状态的系统用的是discrete.
/ I/ J# b9 h* q; |
1)ode45基于显式Runge—Kutta(4,5)公式,Dormand—Prince对.它是—个单步求解器(solver)。也就是说它在计算y(tn)时,仅仅利用前一步的计算结果y(tn-1).对于大多数问题.在第一次仿真时、可用ode45试一下.
( @/ c* w: \1 m. J7 P2 R
% u6 A7 `! P. x; V. d1 g' U6 k" A
2)ode23是基于显式Runge—Kutta(2,3).Bogackt和Shampine对.对于宽误差容限和存在轻微刚性的系统、它比ode45更有效一些.ode23也是单步求解器.
+ j& M+ o" @9 a; n/ W0 I
: x7 j/ W' u O! y& k$ g% I/ M
3)odell3是变阶Adams-Bashforth—Moulton PECE求解器.在误差容限比较严时,它比ode45更有效.odell3是一个多步求解器,即为了计算当前的结果y(tn),不仅要知道前一步结果y(tn-1),还要知道前几步的结果y(tn-2),y(tn-3),…;
) s a. ?( J& {( { Y4 x1 q
W6 V2 s4 `; r
4)odel5s是基于数值微分公式(NDFs)的变阶求解器.它与后向微分公式BDFs(也叫Gear方法)有联系.但比它更有效.ode15s是一个多步求解器,如果认为一个问题是刚性的,或者在用ode45s时仿真失败或不够有效时,可以试试odel5s。 odel5s是基于一到五阶的NDF公式的求解器.尽管公式的阶数越高结果越精确,但稳定性会差一些.如果模型是刚性的,并且要求有比较好的稳定性,应将最大的阶数减小到2.选择odel5s求解器时,对话框中会显示这一参数. 可以用ode23求解器代替。del5s,ode23是定步长、低阶求解器.
5 Z& ~1 ~; l5 w) `4 m
9 l' m' E6 B1 y% |# G O
5)ode23s是基于一个2阶改进的Rosenbrock公式.因为它是一个单步求解器,所以对于宽误差容限,它比odel5s更有效.对于一些用odel5s不是很有效的刚性问题,可以用它解决.
1 O9 ^# q' k" e; e
. N+ E7 Q* X; K
6)ode23t是使用“自由”内插式梯形规则来实现的.如果问题是适度刚性,而且需要没有数字阻尼的结果,可采用该求解器.
9 N# E" e: v8 y8 I2 i7 a
0 t5 s7 {) S. @
7)ode23tb是使用TR—BDF2来实现的,即基于隐式Runge—Kutta公式,其第一级是梯形规则步长和第二级是二阶反向微分公式.两级计算使用相同的迭代矩阵.与ode23s相似,对于宽误差容限,它比odtl5s更有效.
; q2 O. r: T" ~% a# G- s% B
# [+ n3 T. p! h. ]
8)discrete(变步长)是simulink在检测到模型中没有连续状态时所选择的一种求解器.
& Y7 m* u$ o+ }* M I
& F( b6 h; y" P3 h4 d( K! B
=========================================================================================
/ Z2 ^$ ^ A/ H: u8 W0 A4 q* v
! b! B8 u! @8 \5 U% J
2.定步长(Flxed—Step)求解器
, b1 b3 Y% @% r L
" c, I1 G2 t( r" T
可以选择的定步长求解器有:ode5,ode4,ode3,ode2,ode1和discrete.
+ B7 z$ R8 |. L- g3 _
* n3 ?1 f% \, t% i, ^5 u
1)ode5是ode45的一个定步长版本,基于Dormand—Prince公式.
6 j" P( P% s, D1 Q* [9 v
+ i, s- I4 a: o5 w5 H0 h
2)ode4是RK4,基于四阶Runge—Kutta公式.
$ u$ Q* l9 w: _
; c) p+ Q$ T5 Z; d$ h+ a
3) ode3是ode23的定步长版本,基于Bogacki-Sbampine公式.
t) D, C7 _/ Q* r* `
! p0 c( X$ B" t( a' Y
4) ode2是Heun方法,也叫作改进Euler公式.
0 F. \( s- H$ D/ q+ v% L
2 X, T: b: x4 y. y; I; t! F
5) odel是Euler方法.
0 U( o7 K2 I' o, U4 C# M- I
, z( C q9 O& E6 [. \8 u
6) discrete(定步长)是不执行积分的定步长求解器.它适用于没有状态的模型,以及对 过零点检测和误差控制不重要的模型.
. M; Z. w$ K$ v$ d- Y7 Z" R, S
6 ]6 Z! j+ W6 t8 h& _
=========================================================================================
) i% `! N4 s3 S* D1 F
3 m& V( o, v9 W* `
3.诊断页(Diagnostics)
# ^7 K6 X W! Q4 ^0 p8 [
6 [! B5 p2 Y7 J J+ L ?0 r
可以通过选择Simulation Parameters对话框的Diagnostics标签来指明在仿真期间遇到一些事件或者条件时希望执行的动作.
! q( ~- H( F: m4 ?2 ^" @
对于每一事件类型,可以选择是否需要提示消息,是警告消息还是错误消息.警告消息不会终止仿真,而错误消息则会中止仿真的运行.
& ]3 q. Q' @6 K2 X
(1)一致性检查
# q& l, E. e+ I8 _. W
一致性检查是一个调试工具.用它可以验证Simulink的0DE求解器所做的某些假设.它的主要用途是确保s函数遵循Simulink内建模块所遵循的规则.因为一致性检查会导致性能的大幅度下阵(高达40%),所以一般应将它设为关的状态.使用一致性检查可以验证s函数,并有助于确定导致意外仿真结果的原因.
2 r8 b) K0 }/ _
为了执行高效的积分运算,Simulink保存一些时间步的结果,并提供给下一时间步使用.例如,某一时间步结束的导数通常可以放下一时间步开始时再使用.求解器利用这一点可以防止多余的导数运算.
3 ~& d# d Q& U8 S. [0 x$ L
一致性检查的另一个目的是保证当模块被以一个给定的t(时间)值调用时.它产生一常量输出.这对于刚性求解器(ode23s和odel5s)非常重要,因为当计算Jacobi行列式时.模块的输出函数可能会被以相同的t值调用多次.
6 c; V" K: a2 r, K5 ^2 d) z1 \
如果选择了一致性检查,Simulink置新计算某些值,并将它们与保存在内存中的值进行比较,如果这些值有不相同的,将会产生一致性错误.Simulink比较下列量的计算值:
+ Y0 d0 z$ J1 w$ q! `
1)输出;
" }2 k5 p$ |- s. c+ v6 i
2)过零点
; H1 F1 @4 E/ U3 G& T( Z; f! m0 [
3)导数;
7 n2 u6 O4 g3 e6 k6 {9 x; S( b, c
4)状态.
0 k2 C _/ @; _$ B3 c6 V# k
(2)关闭过零点检测
( c! v6 u' k$ t2 Q. _ n* {" ?
可以关闭一个仿真的过零点检测.对于一个有过零点的模型,关闭过零点检测会加快仿真的速度,但是可能影响仿真结果的精度.这一选项关闭那些本来就有过零点检测的模块的过零点检测.它不能关闭Hir crossing模块的过零点检测.
; K0 D+ B$ X1 u
(3)关闭优化I/O存储
* `1 n Y7 c& \! W% q) W; i
选择该选项,将导致Simulink为每个模块约I/()值分配单独的缓存,而不是重新利用援存.这样可以充分增加大模型仿真所需内存的数量.只有需要调试模型时才选择该选
% M. h; e+ a$ l; ^) i! ^: ^" ?
项.在下列情况下,应当关闭缓存再利用;
- H$ _5 u2 F2 v) `1 @# ?& D( Z7 q
1)调试一个C-MEX S-函数;
8 k5 F; |9 }0 {, R+ ^
2)使用浮点scope或display模块来察看调试模型中的信号.
( p/ F3 B$ f" p+ y
如果缓存再利用打开,并且试图使用浮点scope或display模块来显示缓存已被再利用的信号,将会打开一个错误对话框.
2 l v/ I( E! t
(4) 放松逻辑类型检验
% q1 _7 a. \+ U* }) v
选择该选项,可使要求逻辑类型输入的模块接受双精度类型输入.这样可保证与Simulink 3版本之前的模型的兼容性.
- |3 [ f; z5 P3 F/ k3 F+ B4 d
0 b B! t3 f6 _# s) \3 C
=========================================================================================
8 k, W! `- J1 u( R' Z1 Z
6 S5 A1 v: x$ k F8 [
4.提高仿真性能和精度
8 r8 ^, x% S6 h6 u
: B( P0 P' I8 N9 f& Z" z1 O" s% ?
仿值性能相精度由多种因素决定,包括模型的设计和仿真参数的选择.求解器使用它们的缺省参数值可以使大多数模型的仿真比较精确有效,然而,对于一些模型如果调整求解器相仿真参数将会产生更好的结果.而且,如果对模型的性能比较熟悉,并且将这些信息提供给求解器,得到的仿真效果将会提高。
' C8 X" V5 a, d4 J# Z; Q- S- |* B
(1)加快仿真速度
3 A& @5 b' d9 S; f: h( t
仿真速度慢的原因有多种.下面列举其中的一些:
# D: b7 v& z: y$ Y/ Z
1)模型中包含有MATLAB的Fcn模块.当模型包含有MATLAB的Fcn模块时,在仿真的每一时间步都会调用MATLAB的解释器,这将大大地减慢仿真的速度.因此应尽可能地使用内建的Fcn模块或者E1ementary Math模块.
* y5 m* c2 X k! v( J, [' s
2)模型中包含有M文件形式的S函数.M文件形式的S函数也将导致在每一时间步调用MATLAB的解释器.可以考虑将s函数转换为子系统或者c-MEx文件形式的s函数.
* S9 B$ O' U3 ^! z8 _! E
3)模型中包含有Memory模块.使用Memory模块使得变阶求解器(odel5s和odell3)在每一时间步将阶数设为1阶.
* p6 M! @* b! L) w0 l
4)最大的步长太小.如果改变了最大步长.可以试试重新使用缺省值(auto)运行仿真。
5 o {0 a( E( X4 F! i. f [7 ~3 I
5)对精度要求太高.缺省的相对容差(0.1%)通常已经足够了.对于状态值趋于0的模型.如果绝对容差设得太小.仿真时状态值在零点附近会花去太多的时间步.
+ D2 P: U0 w) g4 H
6)时间尺度可能太长.减小时间间隔;
, O- z8 i' p8 d$ l/ |. N
7)问题可能是刚性的.而使用的是非刚性求解器.这时可用odel5s试一下;
" [; b% j% L* x! Y3 S; F0 s
8)模型使用的采样时间相互之间不成倍数关系.相互之间不成倍数的混合采样时间会导致求解器采用足够小的步长,以保证采样时间符合所有的采样时间要求.
" Y x+ J, S# \" l) b
9)模型包含有代数循环.在每一时间步都会反复计算代数循环,因此这会大大地降低仿真的性能.
& _/ Q% _" n" j) Q
10)模型中将Random Number模块的输出传给了Intergrator模块.对于连续系统,在Sources库中使用Bond—limited Noise模块.
" ~& o1 h0 w2 a) X% t
(2)改进仿真精度
4 K1 j7 k- `+ K0 p( U
要检查仿真的精度.仿真运行一段时间以后,减小相对容差到1e-4或者减小绝对容差,并重新运行它.比较两次仿真的结果.如果它们之间没有很大的差别,可以确信结果收敛.
0 g% Y. ^" \& R/ o; n9 w
如果经过一段时间后,仿真结果变得不稳定,可能是如下原因:
9 b* d1 t1 E* |1 x; A+ k
1)系统可能不稳定.
2 n# x. Y `. L" { c2 t
2)如果使用的是odel5s,可能需要将最大的阶数限制在2阶(求解器稳定的最大阶数),或者试试用ode23s求解器.
* ?) V8 [' {; l. s1 E
如果仿真结果看起来不是很精确,可能是:
7 b* e$ K$ I) D! T. b
1)对于一个拥有趋于零的状态值的模型,如果绝对容差设得太大,仿真在零状态值附近花的步数太少.减小绝对容差的大小或者在Integrator对话框中为每—个状态分别调整绝对容差的设定.
: U5 V% w. h: C: n6 R
2)如果减小绝对容差不能有效地提高精度,减少相对容差的大小,减小步长,增加步数.
5 C/ d) m+ U/ w; D3 Y. O9 R6 R
( T- o# K* I4 `" |5 _: ]" |
=========================================================================================
: I! n6 ]0 {7 x4 ~
% p; w1 ]4 |2 l2 d C' `: T
5.处理复数信号
0 | Q+ B0 {9 ^! j" \
6 k5 J# @) h6 J9 c) {/ G
在缺省状态下,simulink信号值是实数.尽管如此,模型可以产生相处理具有复数值的信号.可以采取以下任何一种方法在模型中引入复数值信号.
+ n! r0 g& ^6 T
1)由顶层瑞口从MATLAB工作空间向模型中装入复数值信号数据.
" \& @* ?2 h; V$ N
2)在模型中产生一个常数模块,并设置其值为复数.
$ q' X( P" }# X* b
3)产生实数信号分别对应于复数信号的实部和虚部.然后用实-虚复数转换(Real-Imag to Complex Conversion)模块将各部连成复数信号.
. k( l4 P* q2 i; n+ A3 _
可以用接受复数的模块来处理复数信号,大多数simulink模块接受复数信导作为输入。
; t# r! Q H, V
& r8 i/ h. H' ]) [+ ^
3 d* ~+ g, g' t, x7 `5 H6 v$ k
b' B/ y2 p* J% O
% P: H2 d# G# @. P: R6 W' x' [" F
作者:
yin123
时间:
2020-3-4 17:23
Simulink求解器(Solver)知识
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2