Matalb中的sfunction(s函数)的编写使用方法
S函数的编写使用方法
一个S函数通常用来描述一个系统。这个系统有输入、有输出、有中间状态变量等。然而其本质就是描述现代控制中的状态空间模型。
x ˙ = A x + B u \dot x=Ax+Bu x˙=Ax+Bu
y = C x + D u y=Cx+Du y=Cx+Du
s函数中常用的有模型初始化(Initialization)、微分描述函数(mdlDerivative)、输出函数(mdlOutput)三种函数。
1.模型初始化(Initialization)
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0 0];
str = [];
ts = [0 0];
NumContStates
指系统中连续状态变量个数,即
x
x
x的维数;NumDiscStates
指系统中离散状态变量个数。
NumOutputs
指系统输出的个数,即
y
y
y的维数;NumInputs
指系统输入的个数,即
u
u
u的维数。
DirFeedthrough
指系统的输入是否直接相连。当直接相连时值为1,不直接相连时值为0。可以理解为当状态空间的D矩阵为0时,输入输出不直接相连,此时值为0;反之值为1。
NumSampleTimes
指采样时间的个数,即指ts的维数,对于控制对象来说一般是1;对于控制器来说填0也可以。当 NumSampleTimes
的值为0时,x0
,str
,ts
等三项得值不用填写;否则按照下规则填写。
x0
指状态变量的初值,用行向量表示。有几个状态变量就填几个初值。
str
一般不填。
ts
指采样时间。其格式一般为
t
s
=
[
p
e
r
i
o
d
,
t
i
m
e
]
ts=[period,time]
ts=[period,time],前者是采样周期,后者是起始时间点,计算可得每次得采样时间点为
t
i
m
e
+
n
∗
p
e
r
i
o
d
time+n*period
time+n∗period。
上述图片中的参数就是按照电机系统 J θ ¨ = u + d ( t ) J\ddot \theta =u+d(t) Jθ¨=u+d(t)所填写的。其中 d ( t ) d(t) d(t)为扰动, θ \theta θ为角度,系统输入为 u u u,系统输出为 θ \theta θ和 θ ˙ \dot \theta θ˙。
2.微分描述函数(mdlDerivative)
微分描述函数的作用是用来描述系统内部的,即描述状态空间模型中的
x
˙
=
A
x
+
B
u
\dot x=Ax+Bu
x˙=Ax+Bu表达式。
还是以电机系统
J
θ
¨
=
u
+
d
(
t
)
J\ddot \theta =u+d(t)
Jθ¨=u+d(t)为例,首先将这个二阶微分方程改写成状态空间表达式。令
x
1
=
θ
x_1=\theta
x1=θ,
x
2
=
θ
˙
x_2=\dot \theta
x2=θ˙,可以得到:
x
˙
1
=
x
2
x
˙
2
=
1
/
J
∗
(
u
+
d
(
t
)
)
\dot x_1=x_2\\ \dot x_2=1/J*(u+d(t))
x˙1=x2x˙2=1/J∗(u+d(t))
因此可以得到代码如下。其中微分描述函数的输入t是指时间,输入x是指状态变量,输入u是指整个系统的输入;微分描述函数的输出sys是指状态的微分,即
x
˙
\dot x
x˙。如下图中sys(1)
即为
x
˙
1
\dot x_1
x˙1,sys(2)
即为
x
˙
2
\dot x_2
x˙2。
function sys=mdlDerivatives(t,x,u)
J=2;
dt=sin(t);
ut=u(1);
sys(1)=x(2);
sys(2)=1/J*(ut+dt);
3.输出函数(mdlOutput)
输出函数描述的是整个系统的输出,即状态空间模型的表达式
y
=
C
x
+
D
u
y=Cx+Du
y=Cx+Du。还是采用刚刚的电机模型,前面讲到了系统的输出为
θ
\theta
θ和
θ
˙
\dot \theta
θ˙,并且
x
1
=
θ
x_1=\theta
x1=θ,
x
2
=
θ
˙
x_2=\dot \theta
x2=θ˙,因此系统的输出实际上是下面的表达式。
y
1
=
x
1
y
2
=
x
2
y_1=x_1 \\ y_2=x_2
y1=x1y2=x2
因此输出函数的代码非常简单。其中函数的输入同上,函数输出sys
其实就是状态空间表达式里的
y
y
y。
function sys=mdlOutputs(t,x,u)
sys(1)=x(1);
sys(2)=x(2);