|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
用S函数(如下)编辑生成一个模块,输入信号为正弦信号;分别用out1和out2对输出和输入信号进行观测。
在命令窗口中输入:r=30;h=0.01;T=0.01;后进行仿真,结果出现下面错误,好几天了不知如何解决。请问人指点迷津!谢谢!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
错误:X0 returned by M-File S-function 'han_td' in 'ex_han/S-Function' must be a vector of length 0.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [sys,x0,str,ts]=han_td(t,x,u,flag,r,h,T)
switch flag,
case 0%初始化
[sys,x0,str,ts]=mdlInitializeSizes(T);
case 2%离散状态的更新
sys=mdlUpdates(x,u,r,h,T);
case 3%输出量的计算
sys=mdlOutputs(x);
case {1,4,9}%未使用的flage值
sys=[];
otherwise %处理错误
error(['Unhandled flag=',num2str(flag)]);
end;
%================================================================
%当flag为0时进行整个系统的初始化
%================================================================
function [sys,x0,str,ts]=mdlInitializeSizes(T)
%首先调用simsizes函数得出系统规模参数sizes,并根据离散系统的实际情况设置sizes变量
sizes=simsizes; %读入初始化参数模板
size.NumContStates=0; %无连续状态
size.NumDiscStates=2; %有两个离散状态
sizes.NumOutputs=2; %输出两个量:跟踪信号和微分信号
sizes.NumInputs=1; %系统输入信号一路
sizes.DirFeedthrough=0; %输入不直接传到输出口
sizes.NumSampleTimes=1; %单个采样周期
sys=simsizes(sizes); %根据上面的设置设定系统初始化参数
x0=zeros(2,1); %设置初始状态为零状态
str=[]; %将str变量设置为空字符串即可
ts=[-1 0]; %采样周期,设它能继承上一级的默认值
%================================================================
%在主函数的flag=2时,更新离散系统的状态变量
%================================================================
function sys=mdlUpdates(x,u,r,h,T)
sys(1,1)=x(1)+T*x(2);
sys(2,1)=x(2)+T*fst2(x,u,r,h);
%================================================================
%在主函数flag=3时,计算系统的输出变量:返回两个状态
%================================================================
function sys=mdlOutputs(x)
sys=x;
%================================================================
%用户定义的子函数:fst2
%================================================================
function f=fst2(x,u,r,h)
delta=r*h;delta0=delta*h;y=x(1)-u+h*x(2);
a0=sqrt(delta*delta+8*r*abs(y));
if abs(y)<=delta0
a=x(2)+y/h;
else
a=x(2)+0.5*(a0-delta)*sign(y);
end
if abs(a)<=delta
f=-r*a/delta;
else
f=-r*sign(a);
end |
|