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

在Simulink仿真过程中如何修改积分步长?

[复制链接]
发表于 2010-8-9 23:29:19 | 显示全部楼层 |阅读模式 来自 北京
本帖最后由 guqinor 于 2010-8-10 23:34 编辑

搭了一个比较繁杂的Simulink仿真回路,在仿真过程中,需要依照一定的条件实时修改最大积分步长(用嵌入的M语言进行条件判定并修改最大积分步长)。不过我不知道如何修改,特向大家请教。

比如,在仿真过程中:
1. 当变量distance<1000时,最大积分步长为Maxstep = 0.005;
2. 当变量distance<100时,最大积分步长为Maxstep = 0.001;
3. 当变量distance<50时,最大积分步长为Maxstep = 0.0001。
 楼主| 发表于 2010-8-13 11:35:47 | 显示全部楼层 来自 北京
Simdroid开发平台
自己顶一个。大伙谁知道啊,请赐教!
回复 不支持

使用道具 举报

发表于 2010-8-13 15:23:43 | 显示全部楼层 来自 北京
这个用s函数可以解决
嵌入式m函数可能不行
s函数当flag==4的时候,帮助文件里面写:
%   Return next time hit for variable step sample time in SYS.
你去修改
sys=mdlGetTimeOfNextVarHit(t,x,u);
这个函数就行了

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-8-14 08:58:04 | 显示全部楼层 来自 陕西西安
3# kokyo52
多谢kokyo52版主,我去试试。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-8-15 18:35:49 | 显示全部楼层 来自 陕西西安
这个用s函数可以解决
嵌入式m函数可能不行
s函数当flag==4的时候,帮助文件里面写:
%   Return next time hit for variable step sample time in SYS.
你去修改
sys=mdlGetTimeOfNextVarHit(t,x,u);
这个函数 ...
kokyo52 发表于 2010-8-13 15:23

按这个方法,修改的是s-函数的采样时间,而不是Simulink积分步长,且只能用于离散系统。而我是想修改Simulink中Solver的最大积分步长。

目前,可以通过下面两种方法成功修改最大积分步长(但不符合本贴要求):
1.通过GUI设置最大积分步长:
菜单:Simulation>Configuration parameters,Solver(ode45)>Max step size = 0.0001

2.在命令窗口(Command Window)通过命令修改当前Simulink的最大积分步长:
cset = getConfigSet(gcs,'Configuration')
set_param(cset,'MaxStep','0.0001')

而下面是我所希望的修改方式:

3.嵌入式M-函数修改当前Simulink的最大积分步长:
function y = fcn(u)
%
cset = getConfigSet(gcs,'Configuration');
if u<10
    set_param(cset,'MaxStep','0.0001');
elseif u<100
    set_param(cset,'MaxStep','0.001')
end
y = u;
%

不过不成功,命令窗口中错误提示如下:
??? Error using ==> get_param
Invalid Simulink object specifier.
Error in ==> getConfigSet at 11
  hMdl = get_param(mdl, 'Object');

不知如何是好?望赐教!
回复 不支持

使用道具 举报

发表于 2010-8-15 23:18:32 | 显示全部楼层 来自 北京
你不要用嵌入式m函数
我用MATLAB Fcn写你的代码仿真没有错,嵌入式m函数就会出错,嵌入式m函数使用起来会有很多限制
MATLAB Fcn输入为仿真时间,里面这样写
function Out = testsolve(u)
Out = 0;
cset = getConfigSet(gcs,'Configuration');
if u<10
    set_param(cset,'MaxStep','1');
else
    set_param(cset,'MaxStep','0.0001');
end
get_param(cset,'MaxStep')

仿真20s,命令窗口每一步都会输出当前MaxStep,我发现MaxStep确实变了,但是不知道后来simulink到底是不是按照0.0001走的
lz再研究研究

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-8-16 15:48:58 | 显示全部楼层 来自 陕西西安
用Matlab Fcn基本不会出错,而且simulink是按照set_param('mdl','MaxStep','xx')中的设置走的。不过偶尔也会出错,但没搞清楚是什么原因。
用5楼的嵌入式m函数,或者在s-Function中加入set_param('mdl','MaxStep','xx')语句,都会出错,原因不详。
由于时间紧迫,暂时不深究出错的原因了。
不管怎么说,问题基本解决,就用Matlab Fcn修改最大积分步长。
再次感谢kokyo52版主的帮助!
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-10-4 21:26 , Processed in 0.045290 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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