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+nperiod

上述图片中的参数就是按照电机系统 J θ ¨ = u + d ( t ) J\ddot \theta =u+d(t) Jθ¨=u+d(t)所填写的。其中 d ( t ) d(t) dt为扰动, θ \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˙1sys(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);

猜你喜欢

转载自blog.csdn.net/fantasty9413/article/details/107408555