声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3184|回复: 22

[基本模块类] [求助]如何用 simulink中的 state-space实现 X’=AX+Bu+Ed?

[复制链接]
发表于 2007-5-9 16:49 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 牛小贱 于 2014-3-22 20:57 编辑

位大哥大姐,小弟由于毕业设计需要,要用simulink 来仿真,可不知X’=AX+Bu+Ed怎么用state-space实现,这是个状态空间方程,X是状态变量,u是两输入矢量,d 是另一输入量,而simulink里面只有X’=AX+Bu和y'=CX+Du这个状态空间模块,请问我这个要如何实现呢?/?请各位不吝赐教,将不胜感谢!!!!!!!!!!!
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-5-9 16:52 | 显示全部楼层

[求助]各位大哥大姐,小弟由于毕业设计需要请教

各位大哥大姐,小弟由于毕业设计需要请教!如何用simulink来实现频率的波形图!!!!
发表于 2007-5-9 21:51 | 显示全部楼层
原帖由 zyf 于 2007-5-9 16:49 发表
位大哥大姐,小弟由于毕业设计需要,要用simulink 来仿真,可不知X’=AX+Bu+Ed怎么用state-space实现,这是个状态空间方程,X是状态变量,u是两输入矢量,d 是另一输入量,而simulink里面只有X’=AX+Bu和y'=CX+ ...

  sys(1)=x(2);
   sys(2)=0.7143*(x(1)*x(2)^2-9.81*sin(x(3)));
   sys(3)=x(4);
   sys(4)=u;
当然这个只是个例子,因为几个变量等都不知道
 楼主| 发表于 2007-5-11 11:25 | 显示全部楼层
还要编程啊?不是只要在simulink中画电路图仿真的吗?
发表于 2007-5-11 12:48 | 显示全部楼层
原帖由 zyf 于 2007-5-11 11:25 发表
还要编程啊?不是只要在simulink中画电路图仿真的吗?

当然大多数都可以通过直观的图形模型来搭建,但有些你可能找不到有些功能模块没有,所以只有自己通过matlab fcn或者S函数等来编程实现。
在simulink里面matlab fcn或者S函数也是模块,以图形的形式出现,只是内部需要用m文件来写。

评分

1

查看全部评分

 楼主| 发表于 2007-5-15 16:25 | 显示全部楼层
我要仿真的电路模型如附件,但是我弄不出来,MUX不知道怎么设置,老是出错!哪位大侠高手帮忙解决一下啊?谢谢了!
clip_image002.gif
发表于 2007-5-15 18:26 | 显示全部楼层
原帖由 zyf 于 2007-5-15 16:25 发表
我要仿真的电路模型如附件,但是我弄不出来,MUX不知道怎么设置,老是出错!哪位大侠高手帮忙解决一下啊?谢谢了!

把模型传上来看下。
状态变量的你可以用S函数来写。
http://forum.vibunion.com/forum/thread-11632-1-27.html
该帖子下面最后几个帖子我都是找了些例子,里面有状态变量情况下的S函数的编写,希望对你有收获。

[ 本帖最后由 cdwxg 于 2007-5-15 18:29 编辑 ]
 楼主| 发表于 2007-5-16 10:18 | 显示全部楼层
我的老师说不用写程序的。
发表于 2007-5-16 10:22 | 显示全部楼层
原帖由 zyf 于 2007-5-16 10:18 发表
我的老师说不用写程序的。

如果不用写,那应该就照图搭建,只是不知道你前面那个是不是调制器?如何搭建的,出来的是信号?
另外你如果不知道每个模块输出是哪种类型数据在simulink的format下拉菜单的port/signals displays后面选择port data types

评分

1

查看全部评分

 楼主| 发表于 2007-5-23 00:16 | 显示全部楼层
对X’=AX+Bu+Ed仿真前,要对A,B,E付值,可B=[d/L,0;0,1/C1],L和C1都是常量,d是回路中的受控变量,无法直接付值,应该怎样处理呢???多谢指教!!!!!!!如果用B=[B,E] u=[u;d],E=[Vin/L;0],u=[Vin;Iz],参数是多少啊?要怎么设啊?
发表于 2007-5-23 14:09 | 显示全部楼层
这样的情况好象应该用S函数来写吧?
发表于 2007-5-23 14:17 | 显示全部楼层
原帖由 zyf 于 2007-5-23 00:16 发表
对X’=AX+Bu+Ed仿真前,要对A,B,E付值,可B=[d/L,0;0,1/C1],L和C1都是常量,d是回路中的受控变量,无法直接付值,应该怎样处理呢???多谢指教!!!!!!!如果用B= u=,E=[Vin/L;0],u=[Vin;Iz],参数是多少 ...

如果模块实现不了就用S函数,S函数写状态变量也是简单的
S函数的问题自己搜索,即便模块可以实现但你没有实现的情况下,为什么不考虑下S函数呢?
 楼主| 发表于 2007-5-24 16:52 | 显示全部楼层
实在是做不出来了!哪位高手帮忙写一下s函数的程序啊?还有关于模型的开环仿真bode图是怎么弄出来的?
 楼主| 发表于 2007-5-29 21:28 | 显示全部楼层
对X’=AX+Bu+Ed模块编写s函数,但是仿真时说有错误,为什么 啊?我的程序是
function [sys,x0,str,ts] = statefunc(t,x,u,flag,d)
A=[0 -1000000/335;100000 -100000/11];B=[1000000d/335 0;0 100000];
E=[Vin*1000000/335 0];C=[0 1];D=[0 0];
switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
  case 2,
    sys=[];
  case 3,
    sys=mdlOutputs(t,x,u,);
  case 4,
    sys=[];
  case 9,
    sys=mdlTerminate(t,x,u);
  case 1,
    sys =mdlDerivatives(t,x,u,d);
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);

end


function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;

sizes.NumContStates  = 2;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 3;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   

sys = simsizes(sizes);

x0  = [0];


str = [];


ts  = [0 0];     




function sys=mdlDerivatives(t,x,u,d)

sys = [Ax+Bu+Ed];

function sys=mdlOutputs(t,x,u)

sys =[Cx+Du];


function sys=mdlTerminate(t,x,u)

sys = [];
发表于 2007-5-30 11:09 | 显示全部楼层
sys = [Ax+Bu+Ed];
sys =[Cx+Du];这些表达方式不对.Vin又是什么?
参考该例子
function [sys,x0,str,ts] = dsfunc(t,x,u,flag)
%DSFUNC An example M-file S-function for defining a discrete system.
% Example M-file S-function implementing discrete equations:
% x(n+1) = Ax(n) + Bu(n)
% y(n) = Cx(n) + Du(n)
%
% See sfuntmpl.m for a general S-function template.
%
% See also SFUNTMPL. % Copyright (c) 1990-1998 by The MathWorks, Inc. All Rights Reserved.
% $Revision: 1.13 $
% Generate a discrete linear system:
A=[-1.3839 -0.5097 1.0000 0]; B=[-2.5559 0 0 4.2382];
C=[ 0 2.0761 0 7.7891]; D=[ -0.8141 -2.9334 1.2426 0];
switch flag,
% Initialization
case 0,[sys,x0,str,ts] = mdlInitializeSizes(A,B,C,D);
% Update % %%%%%%%%%%
case 2, sys = mdlUpdate(t,x,u,A,B,C,D); %%%%%%%%%%
% Output % %%%%%%%%%%
case 3, sys = mdlOutputs(t,x,u,A,C,D); %%%%%%%%%%%%%
% Terminate % %%%%%%%%%%%%%
case 9, sys = []; % do nothing %%%%%%%%%%%%%%%%%%%%
% Unexpected flags % %%%%%%%%%%%%%%%%%%%%
otherwise, error(['unhandled flag = ',num2str(flag)]);
end %end dsfunc
%
%=======================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=======================================================================
%
function [sys,x0,str,ts] = mdlInitializeSizes(A,B,C,D)
sizes = simsizes;
sizes.NumContStates = 0; sizes.NumDiscStates = size(A,1); sizes.NumOutputs = size(D,1);
sizes.NumInputs = size(D,2); sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1;
sys = simsizes(sizes); x0 = ones(sizes.NumDiscStates,1); str = []; ts = [1 0];
% end mdlInitializeSizes
%
%=======================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=======================================================================
% function sys = mdlUpdate(t,x,u,A,B,C,D)
sys = A*x+B*u; %end mdlUpdate
%
%=======================================================================
% mdlOutputs
% Return Return the output vector for the S-function
%=======================================================================
%
function sys = mdlOutputs(t,x,u,A,C,D)
sys = C*x+D*u; %end mdlUpdate
另外,help里面有S函数的详细例程和讲解,这些只能靠你自己了.好好看下吧
:handshake

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-6-7 23:06 , Processed in 0.087586 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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