liukuncyj111 发表于 2010-3-14 17:18

跪求!!S函数编写遇到的问题 !

高手指点一下 帮忙看看这个程序有什么问题 谢谢!
此s函数目的是实现Uk=Zd*U(k-1)/Z(k-1)   

function = MIIC(t,x,u,flag,Zd,Uk,Zk,U(k-1),Z(k-1))
switch flag,
   
case 0,
    =mdlInitializeSizes;
case 1,
    sys=[];
case 2,
    sys=mdlUpdate(t,x,u);
case 3,
    sys=mdlOutputs(t,x,u,Zk,Zd,U(k-1));
case 4,
    sys=[];
case 9,
    sys=[];
otherwise
    error('unhandledFlag', num2str(flag));
end
function =mdlInitializeSizes
% Call function simsizes to create the sizes structure.
sizes = simsizes;
% Load the sizes structure with the initialization information.
sizes.NumContStates= 0;
sizes.NumDiscStates= 0;
sizes.NumOutputs= 1;
sizes.NumInputs= 3;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=0;
% Load the sys vector with the sizes information.
sys = simsizes(sizes);
%
x0 = []; % No continuous states
%
str = []; % No state ordering
%
ts = [-1 0]; % Inherited sample time
% End of mdlInitializeSizes.
%==============================================================
% Function mdlOutputs performs the calculations.
%==============================================================
function sys = mdlOutputs(t,x,u,Zk,Zd)
syms Zd Z(K-1)
a=1;
U0=a*Zd;

if Z(k)~=0
   for k=1:100
      Uk=U(k-1)*Zd/Z(k-1);
       if abs((Zk-Zd)/Zd)>=1

       U(k-1)=Uk;
       Z(k-1)=Z(k-2);
      
   else
       sys=Uk;
   
   end
   end   
   
   end

liukuncyj111 发表于 2010-3-14 17:20

回复 楼主 liukuncyj111 的帖子

补充:U(k-1)是Uk上一次的值,Zk也是 ,请高手看一下 变量定义有什么问题,程序有什么问题 谢谢!

Matlabsim 发表于 2010-3-14 18:55

无需这么麻烦吧
s函数有很多例子的

liukuncyj111 发表于 2010-3-15 10:02

回复 板凳 Matlabsim 的帖子

感谢楼上的回复,能不能说具体点呀 我刚学simulink,楼上说的s函数例子很多事什么意思...

yufeng 发表于 2010-3-16 20:17

你的k是什么 没有付值

liukuncyj111 发表于 2010-3-19 11:01

回复 5楼 yufeng 的帖子

k是迭代次数,这个k还用复制么?问题是我这个s函数是3个输入一个输出,小弟不知道这3个输怎么接到s函数上 用mux接?那么我在程序中用u(1) u(2) u(3)来表示这3个输入可以么?应该怎么来表示这3个输入啊?另外其中输入还由k的次数递增 来迭代。请问 我这个程序改怎么改?

yufeng 发表于 2010-3-20 12:47

你知道这是迭代次数 电脑可不知道 另外你的三个输入 没有用到 输入用的是u(1) u(2) u(3) 总体来说s函数有自己的格式 必要严格按照格式编写程序

liukuncyj111 发表于 2010-3-22 11:29

回复 7楼 yufeng 的帖子

感谢指教!! 我把程序改了一下,里面没有设置迭代次数 K 但是能运行 麻烦帮我看一下哪个地方不对。小弟先谢了!
function = MIIC(t,x,u,flag,a)
global a
switch flag,
   
case 0,

    =mdlInitializeSizes(a);
case 1,
    sys=mdlderivatives(t,x,u);
case 2,
    sys=mdlUpdate(t,x,u);
case 3,
    sys=mdlOutputs(t,x,u,a);
case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,
    sys=mdlTerminate(t,x,u);
otherwise
    error('unhandledFlag', num2str(flag));
end

function =mdlInitializeSizes(a)
   
% Call function simsizes to create the sizes structure.
sizes = simsizes;
% Load the sizes structure with the initialization information.
sizes.NumContStates= 0;
sizes.NumDiscStates= 0;
sizes.NumOutputs= 1;
sizes.NumInputs= 3;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
% Load the sys vector with the sizes information.
sys = simsizes(sizes);
%
x0 = []; % No continuous states
%
str = []; % No state ordering
%
ts = [-1 0]; % Inherited sample time
% End of mdlInitializeSizes.
    function sys=mdlDerivatives(t,x,u)
      sys=[];
      function sys=mdlUpdate(t,x,u)
            sys=[];
%==============================================================
% Function mdlOutputs performs the calculations.
%==============================================================
function sys = mdlOutputs(t,x,u,a)
% U =u(1);
% Z =u(2);
% Zd=u(3);
for k=0:1:20
    if k<1
          u(1)=a*u(3);
    else
      if u(2)==0
         u(1)=0;
      else
            if abs((u(1)-u(3))/u(3))>=1
         
         u(1)=u(1)*u(3)/u(2);
      

      
      
            end
      end
    end
       sys=u(1);
end
    function sys=malGetTimeOfNextVarHit(t,x,u)   
      sampleTime=1;
      sys =t+sampleTime;
      function sys=mdlTerminate(t,x,u)
       sys=[];
页: [1]
查看完整版本: 跪求!!S函数编写遇到的问题 !