- 积分
- 8
- 注册时间
- 2007-12-11
- 仿真币
-
- 最后登录
- 1970-1-1
|
有时候我们会遇到一些问题,比如在仿真的某些时候步长需要短一些,而其他时候,步长可能比较长就可以满足要求,以前我就在这里写过一篇文章,是关于使用使能子系统里加入方波发生器来改变仿真的步长的,现如今,技术不断发展,我发现原来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
查看全部评分
-
|