s function 是matlab中经常使用的一个元件,当然也包括 level 2 s function
下面是在学习 sfunction 中的一些心得,整理于下:
在matlab中查看 s function的帮助文件:
可以在命令行窗口使用如下指令:
doc s-function
doc Level-2 MATLAB S-Function (msfunction)
下面搭建一个sfunction 的环境
输入 s function 然后找到对应的模块然后选中
sfunction 默认的名字是 system
双击后可以进行相关的更改,sfunction 需要在路径下建立一个同模块名字相同的函数作为 s函数,该函数在matlab中有模板,可以调出模板,然后拷贝一份进行相应的 更改:
获得模板的命令:
edit sfuntmpl
edit msfuntmpl
sfunction 对应的函数如何编写
首先看模板中的解释可以知道,在sfunction 中可以定义自己的 ode 微分方程,离散方程或者其他类的算法。
通常情况下matlab S function的格式如下:
[SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)
按照官方的解释是:
t 是当前的时间变量;
Flag 是一个判断的标志
X :是是当前的状态变量
U: 是当前的输入变量
不同flag 对应的函数说明,以及需要返回的变量关系:
- Flag==0
需要返回的变量 [SIZES,X0,STR,TS]
描述:
当flag==0 是系统的初始话函数,该函数要 通过 SYS 返回 系统的sizes ;
同时要返回初始状态 X0 ,返回状态顺序字串变量STR 通常STR=[], 返回采样时间TS
- flag==1
需要返回的变量 DX
描述;
返回连续状态变量X 的导数
- flag==2
需要返回的变量 Ds
描述;
更新离散状态 SYS=X(n+1)
- flag == 3
需要返回的变量 Y
描述:
返回系统的输出变量
- flag == 4
需要返回的变量 Tnext
描述:
返回系统的变量步长采样时间
- flag == 5
为系统预留
- flag == 9
无需返回变量
描述:
系统终止,执行相关析构
对于每个flag 值对应的执行的函数,下面来看下不同函数返回的值具体细节
状态向量X和X0由连续状态和离散状态组成。
可选择变量 P1...Pn 也可以应用在s function中,并且任何的flag 下都可使用
当 sfunction 的flag 等于0 时,需要返回的SYS 变量说明:
此时的SYS 的长度是7
SYS(1): 连续状态的 num
SYS(2) :离散状态的num
SYS(3) = Number of outputs.
SYS(4) = Number of inputs.
注意,前四个变量也可以设置为-1, 这样会根据变量的个数进行动态调整
% Any of the first four elements in SYS can be specified
% as -1 indicating that they are dynamically sized. The
% actual length for all other flags will be equal to the
% length of the input, U.
SYS(5) = Reserved for root finding. Must be zero.
SYS(5): 是系统预留的变量所以该数值必须为0
% SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function
% has direct feedthrough if U is used during the FLAG=3
% call. Setting this to 0 is akin to making a promise that
% U will not be used during FLAG=3. If you break the promise
% then unpredictable results will occur.
% SYS(7) = Number of sample times. This is the number of rows in TS.
SYS(7) : 采样时间的个数
s function 的输入需要使用 mux 进行将多个输入合并, s function 的输出需要使用 demux将其分开成为多个信号:
类似这样: