S函数如何编写?
本帖最后由 ljelly 于 2010-5-28 09:15 编辑这个S函数怎么建啊 我建出来的出错function = PNGV02(t,x,u,flag,R1,C1,R2,C2,P)
switch flag,
case 0,
=mdlInitializeSizes(E);
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 =mdlInitializeSizes(E)
sizes = simsizes;
sizes.NumContStates= 2;
sizes.NumDiscStates= 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 5;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0= ;
str = [];
ts= ;
function sys=mdlDerivatives(t,x,u)
=calcABCD(x,u);
sys =A*x+B*il;
%calcABCD
function calcABCD(x,u)
R1=u(1);
C1=u(2);
R2=u(3);
C2=u(4);
P=u(5);
A=[0,0
0,1/C2*R2];
B=;
C=[-1,-1];
D=[-R1];
il=((E-x(1)-x(2))-((E-x(1)-x(2))^2-4*R1*P)^0.5)/2*R1
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u)
=calcABCD(x,u);
Uout=Cx+Dil+E
sys = ;
function sys=mdlTerminate(t,x,u)
sys = []; 类似相乘关系的 都要有* 2# anbcjys function = PNGV02(t,x,u,flag,E)
switch flag,
case 0,
=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 =mdlInitializeSizes()
sizes = simsizes;
sizes.NumContStates= 2;
sizes.NumDiscStates= 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 5;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0= ;
str = [];
ts= ;
function sys=mdlDerivatives(t,x,u)
=calcABCD(x,u);
sys =A*x+B*il;
%%%%%%%%%%%%%%%%%%%%
function calcABCD(x,u);
R1=u(1);
C1=u(2);
R2=u(3);
C2=u(4);
P=u(5);
il=((E-x(1)-x(2))-((E-x(1)-x(2))^2-4*R1*P)^0.5)/(2*R1);
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u)
=calcABCD(x,u);
Uout=C*x+D*il+E
sys = ;
function sys=mdlTerminate(t,x,u)
sys = [];
改成这样了 模型为 提出出错。。
Invalid setting for input port dimensions of 'PNGV000/Demux'. The dimensions are being set to 1. This is not valid because the total number of input and output elements are not the same.怎么难道要输入输出一样么? 大侠们 帮我看看啊好郁闷 第一次编实在不知道错哪里了 case 2,
sys=mdlUpdate(t,x,u);
这有没有问题? 5# 陈光 什么问题 请说 大虾们 帮帮忙哦 {:3_66:}没人帮忙啊 救命啊 还是没有解决啊。。。 你的
function calcABCD(x,u);
没有输出啊
函数写的有问题
起码给个输出,要不
=calcABCD(x,u);
怎么用啊 10# kokyo52
function = PNGV02(t,x,u,flag)
switch flag,
case 0,
=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 =mdlInitializeSizes()
sizes = simsizes;
sizes.NumContStates= 2;
sizes.NumDiscStates= 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 5;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0= ;
str = [];
ts= ;
function sys=mdlDerivatives(t,x,u)
=calcABCD(x,u);
sys =A*x+B*il;
%%%%%%%%%%%%%%%%%%%%
function calcABCD(x,u);
R1=u(1);
C1=u(2);
R2=u(3);
C2=u(4);
P=u(5);
A=;B=;C=[-1,-1];D=[-R1];
il=((E-x(1)-x(2))-((E-x(1)-x(2))^2-4*R1*P)^0.5)/(2*R1);
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u)
=calcABCD(x,u);
Uout=C*x+D*il
sys = ;
function sys=mdlTerminate(t,x,u)
sys = [];
现在这样的 仿真时出错 说:
Error in 'PNGV000/S-Function' while executing M-File S-function 'PNGV02', flag = 3 (output), at time 0. MATLAB error message: Too many output arguments.
麻烦斑竹帮我看看 郁闷死了。。 本帖最后由 lin2009 于 2010-6-7 15:11 编辑
11# qian0117
在初始化中你只定义了2个输出。
“sizes.NumOutputs = 2;”
而实际上的输出个数不止2个
sys = ; 检查Uou和il的实际维数(size)
另外,你的公式写错了。(第一个公式的左边部分) 12# lin2009 那两个输出都是一维的啊,还有哪个写错了?谢谢。。 呵呵,说反了。MATLAB error message: Too many output arguments.
是你太粗心了。
[quofunction sys=mdlOutputs(t,x,u)
=calcABCD(x,u);
Uout=C*x+D*il
sys = ;
Uou 写错了,少了t。当然Matlab认为它是 0*1 size了,新变量...。 14# lin2009 郁闷了哦改后还是一样的错误提示哦 烦死我了 再帮我看看哦 15# qian0117
见10#
function calcABCD(x,u);
没有输出啊 恩 好了 谢谢你啊 然后还有个问题是 里面有个参数E我是想把E在matlab命令里赋值的 为什么会出错的? 16# lin2009 10# kokyo52 谢谢版主 17# qian0117
需要将E定义成global 变量。
在s函数中,
global E;
还有一些错误,
如 sizes.DirFeedthrough = 1;
而在case 3时sys根本就与输入无关
“function sys=mdlOutputs(t,x,u)
=calcABCD(x,u);
Uout=Cx+Dil+E”
所以sizes.DirFeedthrough 设置错误。
再从你原来程序的错误,
如PNGV02(t,x,u,flag,R1,C1,R2,C2,P)这里的R1,C1,R2,C2,P是通过函数的参数传递的。
而在下面语句中却变成了输入变量
function calcABCD(x,u)
R1=u(1);
C1=u(2);
R2=u(3);
C2=u(4);
P=u(5);
可以看出你对s函数甚至m函数的编程存在概念性的错误,建议静下心来,好好看看s函数的帮助文件和Matlab自身实例。 19# lin2009 嗯 是啊 第一次学着编这个 很多不懂 还请多多指导了 呵呵
页:
[1]
2