声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1275|回复: 4

[基本模块类] 关于S-函数的问题

[复制链接]
发表于 2008-3-14 17:29 | 显示全部楼层 |阅读模式

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

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

x
function [sys,x0,str,ts]=PF_1(t,x,u,flag,Ts)
global A,B,C,D,G,H
A=[0,1,0,0;0,0,-3.8354,0;0,0,0,1;0,0,28.0160,0];
B=[0;1.7392;0;3.5735];
C=[1,0,0,0;0,0,1,0];
D=[0;0];
G=exp(A*Ts);
H=quad(@fun,0,Ts);
switch flag,
    case 0,
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 2,
        sys=mdlUpdate(t,x,u,Ts);
    case 3,
        sys=mdlOutputs(t,x,u,Ts);
    case 9,
        sys=[];
    otherwise,
        error=(['Unhandled flag=',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumConStates=0;
sizes.NumDiscStates=1;
sizes.NumOutputs=1;
sizes.NumInputs=3;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=u(3);
str=[];
ts=[1 0];
function sys=mdlUpdates(t,x,u,Ts)
sys=G*x+H*u(2);
function sys=mdlOutPuts(t,x,u,Ts)
sys=C*G*G*x+C*G*H*u(2)+C*H*u(1);
function y=fun(t);
y=exp(A*Ts-A*t)*B;
以上是我自己编的程序,编辑S-函数模块时出现如下问题
??? Undefined function or variable "B".
Error in ==> PF_1 at 2
global A,B,C,D,G,H
高手帮我指点下怎么改谢谢了~~~~~
回复
分享到:

使用道具 举报

发表于 2008-3-19 15:17 | 显示全部楼层
function [sys,x0,str,ts]=PF_1(t,x,u,flag,Ts)
global A B C D G H
A=[0,1,0,0;0,0,-3.8354,0;0,0,0,1;0,0,28.0160,0];
B=[0;1.7392;0;3.5735];
C=[1,0,0,0;0,0,1,0];
D=[0;0];
G=exp(A*Ts);
%H=quad(fun,0,Ts);
H=exp(A*Ts-A*t)*B;
switch flag,
    case 0,
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 2,
        sys=mdlUpdate(x,u);
    case 3,
        sys=mdlOutput(x,u,C,G,H);
    case 9,
        sys=[];
    otherwise,
        error=(['Unhandled flag=',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumConStates=0;
sizes.NumDiscStates=1;
sizes.NumOutputs=1;
sizes.NumInputs=3;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=u(3);
str=[];
ts=[1 0];
function sys=mdlUpdate(x,u)
sys=G*x+H*u(2);
function sys=mdlOutput(x,u,C,G,H)
sys=C*G*G*x+C*G*H*u(2)+C*H*u(1);
发表于 2008-3-19 18:10 | 显示全部楼层

我也问一个关于sfunction 的问题,请高手指点!

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

function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates=3;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[1;
    1;
    1];
str=[];
ts=[0,0];

function sys=mdlDerivatives(t,x,u)
dx(1)=-u*x(2)+x(3);
dx(2)=(u*u-1)*x(2)+u*x(3);
dx(3)=-x(3)+x(1)*x(1)+0.5;
sys=dx;

function sys=mdlUpdate(t,x,u)
sys=[];

function sys=mdlOutputs(t,x,u)
sys=x(1);
function sys=mdlTerminate(t,x,u)
sys=[];

命令窗口老是有Warning: Unable to reduce the step size without violating minimum step size of 0.01 at time 2.805106062496166.  Continuing simulation with the step size restricted to 0.01 and using an effective relative error tolerance of 2.569641885883541e+040, which is greater than the specified relative error tolerance of 0.001.

还提示sfunction有问题,说是State derivatives returned by S-function 'system1' in 'fz/S-Function' during flag=1 call must be a real vector of length 3.
我实在找不出什么原因,请高手指教!
发表于 2008-3-20 08:53 | 显示全部楼层
这个看上去确实没什么问题,还是检查模型看看吧,
发表于 2008-3-21 23:04 | 显示全部楼层

我也碰到这个问题了,请高手指点方向。谢谢!

State derivatives returned by S-function 'system1' in 'fz/S-Function' during flag=1 call must be a real vector of length 3.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-6-2 09:18 , Processed in 0.084762 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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