声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2202|回复: 4

出现错误: must be a vector of length 0

[复制链接]
发表于 2007-3-5 10:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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
回复
分享到:

使用道具 举报

发表于 2007-3-10 17:37 | 显示全部楼层
??? Input argument "flag" is undefined.
S函数必须在simulink仿真中,所以没有模型这个通不过,也就更不知道其他的错误了

[ 本帖最后由 cdwxg 于 2007-3-10 17:41 编辑 ]
发表于 2007-3-12 16:56 | 显示全部楼层
我用S-function时候也出现过这个错误,我当时是因为有一个量为NaN。仔细检查发现在计算过程中出现了除数为0的情况。我没有仔细看你的程序,你可以跟踪一些变量,看看他们是不是在计算的过程中不是一个具体的值,而是像NaN这样的空的量。
 楼主| 发表于 2007-3-13 20:46 | 显示全部楼层
谢谢大家的回复,不过我不知道怎么跟踪变量!有什么办法呢?
发表于 2007-3-14 09:20 | 显示全部楼层
matlab中想要看变量的值很容易,只要把计算它的语句后面的分号去掉就可以了,然后所有的该变量的值就都在命令窗口了。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-16 09:20 , Processed in 0.053686 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表