qian0117 发表于 2010-5-26 16:50:49

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 = [];

anbcjys 发表于 2010-5-27 07:51:10

类似相乘关系的 都要有*

qian0117 发表于 2010-5-27 10:20:57

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.怎么难道要输入输出一样么?

qian0117 发表于 2010-5-27 10:22:23

大侠们 帮我看看啊好郁闷 第一次编实在不知道错哪里了

陈光 发表于 2010-5-27 17:21:12

case 2,
    sys=mdlUpdate(t,x,u);
这有没有问题?

qian0117 发表于 2010-5-27 19:44:36

5# 陈光 什么问题 请说

qian0117 发表于 2010-5-30 15:41:19

大虾们 帮帮忙哦

qian0117 发表于 2010-5-31 12:34:53

{:3_66:}没人帮忙啊

qian0117 发表于 2010-6-3 10:57:44

救命啊 还是没有解决啊。。。

kokyo52 发表于 2010-6-4 12:48:47

你的
function calcABCD(x,u);
没有输出啊
函数写的有问题
起码给个输出,要不
=calcABCD(x,u);
怎么用啊

qian0117 发表于 2010-6-7 13:16:02

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:06:06

本帖最后由 lin2009 于 2010-6-7 15:11 编辑

11# qian0117
在初始化中你只定义了2个输出。
“sizes.NumOutputs   = 2;”
而实际上的输出个数不止2个
sys = ; 检查Uou和il的实际维数(size)

另外,你的公式写错了。(第一个公式的左边部分)

qian0117 发表于 2010-6-7 15:16:47

12# lin2009 那两个输出都是一维的啊,还有哪个写错了?谢谢。。

lin2009 发表于 2010-6-7 15:31:19

呵呵,说反了。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了,新变量...。

qian0117 发表于 2010-6-7 15:51:23

14# lin2009 郁闷了哦改后还是一样的错误提示哦 烦死我了 再帮我看看哦

lin2009 发表于 2010-6-7 17:15:04

15# qian0117
见10#
function calcABCD(x,u);
没有输出啊

qian0117 发表于 2010-6-7 18:32:32

恩 好了 谢谢你啊 然后还有个问题是 里面有个参数E我是想把E在matlab命令里赋值的 为什么会出错的? 16# lin2009

qian0117 发表于 2010-6-7 18:32:52

10# kokyo52 谢谢版主

lin2009 发表于 2010-6-8 10:36:40

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自身实例。

qian0117 发表于 2010-6-8 14:27:32

19# lin2009 嗯 是啊 第一次学着编这个 很多不懂 还请多多指导了 呵呵
页: [1] 2
查看完整版本: S函数如何编写?