找回密码
 注册
Simdroid-非首页
查看: 465|回复: 23

S函数如何编写?

[复制链接]
发表于 2010-5-26 16:50:49 | 显示全部楼层 |阅读模式 来自 湖南长沙
本帖最后由 ljelly 于 2010-5-28 09:15 编辑

这个S函数怎么建啊 我建出来的出错function [sys,x0,str,ts] = PNGV02(t,x,u,flag,R1,C1,R2,C2,P)
switch flag,
  case 0,
    [sys,x0,str,ts]=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 [sys,x0,str,ts]=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  = [E];
str = [];
ts  = [0 0];
function sys=mdlDerivatives(t,x,u)
[A,B,C,D,il]=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=[1/C1,1/C2];
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)
[A,B,C,D,il]=calcABCD(x,u);
Uout=Cx+Dil+E

sys = [Uout,il];
function sys=mdlTerminate(t,x,u)
sys = [];

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2010-5-27 07:51:10 | 显示全部楼层 来自 北京
Simdroid开发平台
类似相乘关系的 都要有*
回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-27 10:20:57 | 显示全部楼层 来自 湖南长沙
2# anbcjys function [sys,x0,str,ts] = PNGV02(t,x,u,flag,E)
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  = 2;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 2;
sizes.NumInputs      = 5;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;  
sys = simsizes(sizes);
x0  = [0 0];
str = [];
ts  = [0 0];
function sys=mdlDerivatives(t,x,u)
[A,B,C,D,il]=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)
[A,B,C,D,il]=calcABCD(x,u);
Uout=C*x+D*il+E
sys = [Uou,il];
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.  怎么难道要输入输出一样么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-27 10:22:23 | 显示全部楼层 来自 湖南长沙
大侠们 帮我看看啊  好郁闷 第一次编  实在不知道错哪里了
回复 不支持

使用道具 举报

发表于 2010-5-27 17:21:12 | 显示全部楼层 来自 山西太原
case 2,
    sys=mdlUpdate(t,x,u);
这有没有问题?
回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-27 19:44:36 | 显示全部楼层 来自 湖南长沙
5# 陈光 什么问题 请说
回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-30 15:41:19 | 显示全部楼层 来自 湖南长沙
大虾们 帮帮忙哦
回复 不支持

使用道具 举报

 楼主| 发表于 2010-5-31 12:34:53 | 显示全部楼层 来自 湖南长沙
{:3_66:}没人帮忙啊
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-3 10:57:44 | 显示全部楼层 来自 湖南长沙
救命啊 还是没有解决啊。。。
回复 不支持

使用道具 举报

发表于 2010-6-4 12:48:47 | 显示全部楼层 来自 陕西西安
你的
function calcABCD(x,u);
没有输出啊
函数写的有问题
起码给个输出,要不
[A,B,C,D,il]=calcABCD(x,u);
怎么用啊
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-7 13:16:02 | 显示全部楼层 来自 湖南长沙
10# kokyo52


function [sys,x0,str,ts] = PNGV02(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  = 2;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 2;
sizes.NumInputs      = 5;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;  
sys = simsizes(sizes);
x0  = [0;0];
str = [];
ts  = [0 0];
function sys=mdlDerivatives(t,x,u)
[A,B,C,D,il]=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=[0 0;0 -1/C2*R2];B=[1/C1;1/C2];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)
[A,B,C,D,il]=calcABCD(x,u);
Uout=C*x+D*il
sys = [Uou il];
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.
麻烦斑竹帮我看看 郁闷死了。。
回复 不支持

使用道具 举报

发表于 2010-6-7 15:06:06 | 显示全部楼层 来自 湖南湘潭
本帖最后由 lin2009 于 2010-6-7 15:11 编辑

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

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

使用道具 举报

 楼主| 发表于 2010-6-7 15:16:47 | 显示全部楼层 来自 湖南长沙
12# lin2009 那两个输出都是一维的啊,还有哪个写错了?谢谢。。
回复 不支持

使用道具 举报

发表于 2010-6-7 15:31:19 | 显示全部楼层 来自 湖南湘潭
呵呵,说反了。MATLAB error message: Too many output arguments.

是你太粗心了。
[quofunction sys=mdlOutputs(t,x,u)
[A,B,C,D,il]=calcABCD(x,u);
Uout=C*x+D*il
sys = [Uou il];[/quote]

Uou 写错了,少了t。当然Matlab认为它是 0*1 size了,新变量...。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-7 15:51:23 | 显示全部楼层 来自 湖南长沙
14# lin2009 郁闷了哦  改后还是一样的错误提示哦 烦死我了 再帮我看看哦
回复 不支持

使用道具 举报

发表于 2010-6-7 17:15:04 | 显示全部楼层 来自 湖南湘潭
15# qian0117
见10#
function calcABCD(x,u);
没有输出啊
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-7 18:32:32 | 显示全部楼层 来自 湖南长沙
恩 好了 谢谢你啊 然后还有个问题是 里面有个参数E  我是想把E在matlab命令里赋值的 为什么会出错的? 16# lin2009
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-7 18:32:52 | 显示全部楼层 来自 湖南长沙
10# kokyo52 谢谢版主
回复 不支持

使用道具 举报

发表于 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)
[A,B,C,D,il]=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自身实例。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-6-8 14:27:32 | 显示全部楼层 来自 湖南长沙
19# lin2009 嗯 是啊 第一次学着编这个 很多不懂 还请多多指导了 呵呵
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 08:14 , Processed in 0.081278 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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