找回密码
 注册
Simdroid-非首页
查看: 133|回复: 1

s函数变步长仿真初探

[复制链接]
发表于 2008-10-22 23:42:14 | 显示全部楼层 |阅读模式 来自 北京
有时候我们会遇到一些问题,比如在仿真的某些时候步长需要短一些,而其他时候,步长可能比较长就可以满足要求,以前我就在这里写过一篇文章,是关于使用使能子系统里加入方波发生器来改变仿真的步长的,现如今,技术不断发展,我发现原来Matlab本身就有很好的方式来解决这一问题,无需我们绞尽脑汁搭出那么复杂的模型了,那么我们就来看一看到底是什么东西可以满足这样一个要求~~
s-function功能强大,众所周知,可是正是因为强大,所以稍稍复杂,但是我一直认为Matlab是非常人性化的,各种重要的数据接口都已经在s-function中一览无余,其中,就有变步长这一环节。
在s-function 的 mdlInitializeSizes 函数中,需要指定该s-function的采样时间,即
%
% initialize the array of sample times
%
ts  = [0 0];
注意 ,默认是【0 0】,在我的 Matlab7.0中,注释为: Continuous sample time.
在sfuntmpl.m这个文件里,还介绍了:
【0      1】 : Continuous, but fixed in minor stepsample time.
【-2     0】 : Variable step discrete sample time where FLAG=4 is used to get time of next hit.
好了,我们看到了变步长的【-2  0】,那么我们只需要在
  case 4
    sys=mdlGetTimeOfNextVarHit(t,x,u);
的函数中设置一下,比如根据时间 t 来判断是否变化步长,或者 x ,或者u等等等等,看自己喜好(任务要求)了~~
举个简单的例子如下:
if t > 10
t = t + 1;
else
t = t + 0.1;
end
呵呵,例子不错吧~原创

前面看看帮助都知道,重点是后面:
1.有了上面的设置之后呢,不要以为你的整个大模型(比如说是一个大的连续系统包括很多很多小模块小s-function)会按照这个小小的s-function的设置来进行。上面讲的变步长,只保证了每次计算进入你这个s-function时,能够以一秒一秒(10s后是0.1秒0.1秒)的频率调用这个函数,但是!外面的那些小模块什么的,可能有自己的采样时间,或者说根本没有,是继承系统的采样时间。这样子的话,很可能外面的函数计算了很多次,而这个模块只被调用一次而已。
如果是这样一种普遍的特殊情况:即其他子系统都是继承大系统的采样时间,只有这一个s-function自己有采样时间而且需要变来变去。那么,我们就可以设置大系统的max step size 为 auto,且 min step size 为 auto,这样,整个系统基本上就听这个s-function的话了,而且,在需要精细仿真的时候,速度降下来,其他时候,全速前进~~
2.另外一点需要注意:s-function 给出 flag 的 顺序是(初始化之后且ts = 【-2 0】的情况下):4 -> 3 -> 2 -> 4 -> 3 ->2 ->......
也就是说,系统首先计算下一个t,然后才去访问什么输出啊、更新啊之类的东西,所以,如果你希望拿各种各样的条件来判断是否需要变步长了,注意一下这个顺序,不要给自己造成不必要的麻烦。尤其是在步长变得很厉害的情况下,比如本来是10s,现在是0.1s,那可不要让这个 s-function 把 10s 直接跳过去了。

好了,就到这里,在此抛砖引玉,希望对此有研究的大侠们不吝赐教,想几天前真的很头疼,现在总算可以松一口气了~~ 分享一下拙见而已

写完之后才发现,原来Matlab自己有一个例子是关于s-function变步长模块的:vsfunc.m

[ 本帖最后由 kokyo52 于 2008-10-23 00:00 编辑 ]

评分

1

查看全部评分

发表于 2017-7-20 13:12:57 | 显示全部楼层 来自 广东深圳
Simdroid开发平台
不错的教程!!!!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-24 20:09 , Processed in 0.034594 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表