4.1模型参数
上面介绍常用模块的时候,都是找到模块,双击模块,设置参数。这些参数都是模块参数。与之相对的,是模型参数。一些说明:
1)模型参数和模块参数并不是隶属关系,而是配合关系。当模型参数和模块参数有冲突时,会报错,而不是自动修改模块参数以匹配模型参数。
2)模型参数的设置方法,是在模型编辑界面里快捷键ctrl+e,在讲Simulink界面的时候提过,model configuration
3)模型参数为树状结构,左侧分类,右侧具体设置。且随处可见小三角,点开后有更多设置选项
4)搜索栏,如果知道模型参数的名字,但无法从树状结构中找到,可以用搜索
这些模型参数中,最常用又最难理解的,则是solver里的这几个:
1)start time 和 stop time,设定的是仿真开始时间和结束时间,即求解信号线y(t) 时的 t 的范围。其中stop time可以设置为 inf,此时模型会一直求解下去,直到有其他东西触发停止信号,例如人为点stop按钮。
2)type和solver,这个用来设定求解时的数值算法。
3)type分为定步长和变步长,当设置为定步长时,模型求解y(t),t=kdt_m, k=0,1,2… 这里用dt_m 来表示步长。对比之前说过信号线属性里的采样时间,会发现他们非常像。假设模型里有多个不同采样时间的信号,他们的采样时间分别为dt_s1、dt_s2…,那么dt_s和dt_,m需要满足,每一个dt_si/dt_m为正整数。这样,每一个信号线的采样时刻,都是模型的计算时刻,即每个信号线采样时刻的值,会被求解出来。
4)type为变步长时,模型求解y(t), t=t1,t2…tn 其中 t(i) 由 t(i-1) 进行计算。具体计算过程是:按照离散信号线采样时刻,找下一个需要计算的时刻 kdt_s 作为t(i),如果没有离散信号,就盲猜一个;计算y(t(i)),并估算这样的y结果是否准确;如果不准确,则减小t(i),直到y(t(i)) 的精度足够。
小结一下solver,定步长对步长dt_m有限制。变步长没啥限制,但因为有估算误差的过程,因此比较慢。
5)设定type后,可以在solver里进一步选择算法,如果想深入了解,可以看“龙格库塔”算法,例如ode45的意思,是龙格库塔4阶计算,5阶估算误差。
4.2全局变量
全局变量这个说法并不准确,这里想要解决的问题是:无论是模块参数还是模型参数,我们之前讲的都是在对应位置填入数字,那么有没有办法填入变量呢?比如constant模块,value里写个a,然后我去别的地方定义a等于多少?这里就牵涉到一个问题,如果参数遇到变量,Simulink会去哪里找呢?
完整的回答是,依次去:musk workspace、simulink workspace、base workspace / sldd 四个地方找。因为是依次去找,因此一旦找到,后面位置里定义的就失效了,比如在musk workspace里找到了a,那么base workspace里定义的a就没用了。
这四个位置中,base workspace就是MATLAB基础教材里讲的,MATLAB界面右侧的workspace。另外三个位置,对初学者而言可以忽略。一个常见的用法是,Simulink离散建模,有很多模块输出信号线的采样时间需要设置为同一个数值,此时可以设置模块参数为ts,然后在MATLAB中执行ts=0.1或者类似命令。这样模块参数在寻找ts的时候,会按照之前讲的顺序去四个位置找ts,因为其他位置里没有ts,因此最后在base workspace里找到ts=0.1
最后的总结:
模型=信号线+模块
信号线有属性,最基本的是采样时间、维度、数据类型
模块有模块参数,用来控制前后信号线的属性,一般是双击模块进行设置
模型有模型参数,需要和模块参数匹配,最基本是ctrl+e -> solver设置
参数设置可以用具体数值,也可以用base workspace里的变量