0

我是 Simulink 的新手,并且有一个使用 S-Function 的模型。我不明白 mdlDerivatives 的输出与 mdlOutputs 的输出有何关系?换句话说,如果我想编写一个 mfile(不使用 Simulink),状态和输出是什么?我想写一个 mfile 并找到 ddq、dq 和 q 但不知道这两个部分中的状态是如何产生输出的?(附加文件)

function [sys,x0,str,ts]=s_function(t,x,u,flag)
switch flag,
case 0,
e[sys,x0,str,ts]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 3,
    sys=mdlOutputs(t,x,u);
case {2, 4, 9 }
    sys = [];
otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end

function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 4;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 4;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 0;
sys=simsizes(sizes);
x0=[0;0;0;0];
str=[];
ts=[];
function sys=mdlDerivatives(t,x,u)
q1=x(1);dq1=x(2);
q2=x(3);dq2=x(4);
dq=[dq1;dq2];

% The model is given by Slotine and Weiping Li(MIT 1987)
alfa=6.7;beta=3.4;
epc=3.0;eta=0;
m1=1;l1=1;
lc1=1/2;I1=1/12;
g=9.8;
e1=m1*l1*lc1-I1-m1*l1^2;
e2=g/l1;

H=[alfa+2*epc*cos(q2)+2*eta*sin(q2),beta+epc*cos(q2)+eta*sin(q2);
   beta+epc*cos(q2)+eta*sin(q2),beta];
C=[(-2*epc*sin(q2)+2*eta*cos(q2))*dq2,(-epc*sin(q2)+eta*cos(q2))*dq2;
   (epc*sin(q2)-eta*cos(q2))*dq1,0];
G=[epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)+(alfa-beta+e1)*e2*cos(q1);
   epc*e2*cos(q1+q2)+eta*e2*sin(q1+q2)];

tol(1)=u(1);
tol(2)=u(2);

ddq=inv(H)*(tol'-C*dq-G);
sys(1)=x(2);
sys(2)=ddq(1);
sys(3)=x(4);
sys(4)=ddq(2);
function sys=mdlOutputs(t,x,u)
sys(1)=x(1);
sys(2)=x(2);
sys(3)=x(3);
sys(4)=x(4);
4

1 回答 1

0

非线性状态空间模型由 2 个方程组成:

x_dot = f(x,u,t)

y = g(x,u,t)

如果系统是线性的,这将简化为(也许更熟悉的形式)

x_dot = A * x + B * u

y = C * x + D * u

对于 1 级 m 代码 S-Function(这就是您所拥有的),当 Simulink 想要计算模块的状态导数时,它调用mdlDerivatives,而当它不想模块的输出时,它调用mdlOutputs

即为mdlDerivatives实现上述等式x_dot,并为mdlOutputs实现上述等式y

于 2017-11-13T17:00:50.620 回答