最近在利用simulink工具对一系统进行模拟仿真,因涉及系统赋初值设置,所以在网上查了很多关于simulink模型/模块该如何赋初值的问题,但一直没找到具体的解决方案,反而看过一些求解思路后更迷惑了。 怎么实现Simulink整个模型赋初值和模型内某一具体模块赋初值的问题? (1)Simulink模型赋初值 由于simulink模型是基于零初值(zero initial condition)假设,因此系统在t=0时刻的系统输出值默认为0, 而现在我想更改系统simulink模型的初值,请问在什么地方可以设置整个simulink模型的初值? (2)Simulink模型中某一小模块初值的设置 这里直接以 Transfer function为例,网上查了很多,大部分说是transfer function本身无法设定初值,但可以通过将Transfer function转换为state space 模型或者将transfer function表达式改写为含积分器1/S的变换形式,然后通过状态空间模型中的矩阵参数或者是积分器来对传递函数进行赋初值,因此我就采用了改传递函数的方法,如传递函数是1/(0.25S+1), 我就将它改成了1/S × S/(0.25S+1)的形式,然后利用积分器赋初值。问题是刚才又看到了另外一种说法,说是可以直接采用Transfer function with initial output模块对初值进行设定,因此我在liabrary中找到了该模块并用它替换了之前的积分器形式,但发现除了初值为0设置两种方法得到的结果是一致外,其他非零初值设置得到的模拟结果就很不一样,很不理解, 因此想请教各位前辈,高人,如果有这方面经验的,能不能帮忙指点下,不甚感激。 |
模型的初始值可以分为模块的初始值(Unit Delay这要带有状态的状态量的初始值)以及信号的初始值(通常使用数据对象Simulink.Signal创建之后再属性之中设置)。 |
hyowinner 发表于 2015-10-14 11:15 谢谢回复,我想接着问下, 今天我试着用Signal Object去更改信号的初始值,按照说明书首先通过Model explorer在base workspace中添加了一与信号名称同为S1的一个Signal Object, 并设置signal object的initial value为10,storage Class为’ExceptedGlobal‘. 但运行过后的初始值并没有变化,如下图 麻烦您能不能帮忙看下?谢谢 |
output
2015-10-15 04:51 上传
点击文件名下载附件
15.29 KB, 下载次数: 33
ExampleSystem
youngjun51 发表于 2015-10-15 04:51 信号的初始值是用来初始化的,当然不会变化。 它只有上电第一次运行时使用。 |
hyowinner 发表于 2015-10-15 07:24 我的理解是输出应该是从初始值10开始变化,然后在按照实际数据输出,可为什么scope中体现不了呢? |
youngjun51 发表于 2015-10-15 09:58 正弦从10 开始?调整相位或offset。 |
本帖最后由 youngjun51 于 2015-10-16 04:57 编辑 hyowinner 发表于 2015-10-15 11:09 我的意思是既然已使用了signal object对信号赋初值,那么信号输出应该是从初值10(此处10是通过signal object赋予的初值)开始变化,而不是按实际函数值0输出,如果信号输出仍是按照实际函数输出,那么信号相当于并未被赋值或者说是和信号赋不赋值没有关系,我现在就是想实现信号赋值,并看到信号输出是根据被赋值变化的,就如同simulink教案图例中数据是从被赋予值4.5开始变化,这种就是我想实现的内容。 不知道是不是我在使用signal object对信号赋值过程中漏掉了什么,一直得不到我要的结果,就感觉信号被赋值之后和赋值之前没区别,按理说赋值之后应该是不一样的,很想弄清楚这一点。 |
本帖最后由 hyowinner 于 2015-10-16 06:28 编辑 youngjun51 发表于 2015-10-16 04:55 信号初始值只在in端口相连的信号代码生成中起作用,当他是一个输出信号时,由模型数据流决定其数值,自定义初始值只能在模块上进行。教案4.5是子系统内部状态变量的初始值。 |
本帖最后由 youngjun51 于 2015-10-17 02:50 编辑 hyowinner 发表于 2015-10-16 06:27 非常感谢您热心回答,刚试了下,确实是这样子,学到了 能不能再请教您一下,就是我现在尝试性地使用了三种不同赋值方式去对同一transfer function(1/0.25S+1)赋初值,方法如下: 1. 分解传递函数表达式,将其拆解为含有integrator的形式(图中第二栏部分),然后通过积分器设置initial condition, 2. 使用tf2ss得到参数A.B.C.D的值(图中第三栏),然后通过state space模块中的initial condition进行初始值设置, 3. 通过transfer Fcn(with inital states)模块中的initial condition直接设置初值(图中第四栏) 三种方法中,我发现方法2和3得到的结果是完全一致的,但是它们与方法1得到的结果不同,请问像方法1这种拆解形式用于传递函数赋初值方式可取吗? 三种方法哪一种比较合理?它们有什么不一样的地方? 麻烦您帮忙再指点下,感激。 |
TransferFcn
2015-10-17 02:46 上传
点击文件名下载附件
18.35 KB, 下载次数: 70
TranferFcn
youngjun51 发表于 2015-10-16 21:56 你这个问题可把我难住了,还是推荐使用后两个方法。 第一个积分计算,内部可能使用了线性化估算方法,导致了计算误差呢,我不确定。 |
hyowinner 发表于 2015-10-17 11:56 好的,谢谢你 |
:handshake |
youngjun51 发表于 2015-10-16 21:56 想请教楼主,我从fromworkspace传进来的数据,经过Analog Filter之后,产生的数也是从0开始的,请问该怎么设置才能给初始值赋值? |
hyowinner 发表于 2015-10-17 11:56 想请教楼主,我从fromworkspace传进来的数据,经过Analog Filter之后,产生的数也是从0开始的,请问该怎么设置才能给初始值赋值? |
youngjun51 发表于 2015-10-15 04:51 请问楼主,这些图片如何生成?并且如何上传? |
youngjun51 发表于 2015-10-16 04:55 您这个图层级感太棒了!!是matlab自动生成的吗?方便告诉一下如何生成吗? |
Powered by Discuz! X3.4
© 2001-2024