zyf 发表于 2007-5-9 16:49

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

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

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

zyf 发表于 2007-5-9 16:52

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

各位大哥大姐,小弟由于毕业设计需要请教!如何用simulink来实现频率的波形图!!!!

cdwxg 发表于 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;
当然这个只是个例子,因为几个变量等都不知道

zyf 发表于 2007-5-11 11:25

还要编程啊?不是只要在simulink中画电路图仿真的吗?

cdwxg 发表于 2007-5-11 12:48

原帖由 zyf 于 2007-5-11 11:25 发表
还要编程啊?不是只要在simulink中画电路图仿真的吗?
当然大多数都可以通过直观的图形模型来搭建,但有些你可能找不到有些功能模块没有,所以只有自己通过matlab fcn或者S函数等来编程实现。
在simulink里面matlab fcn或者S函数也是模块,以图形的形式出现,只是内部需要用m文件来写。

zyf 发表于 2007-5-15 16:25

我要仿真的电路模型如附件,但是我弄不出来,MUX不知道怎么设置,老是出错!哪位大侠高手帮忙解决一下啊?谢谢了!

cdwxg 发表于 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 编辑 ]

zyf 发表于 2007-5-16 10:18

我的老师说不用写程序的。

cdwxg 发表于 2007-5-16 10:22

原帖由 zyf 于 2007-5-16 10:18 发表
我的老师说不用写程序的。
如果不用写,那应该就照图搭建,只是不知道你前面那个是不是调制器?如何搭建的,出来的是信号?
另外你如果不知道每个模块输出是哪种类型数据在simulink的format下拉菜单的port/signals displays后面选择port data types

zyf 发表于 2007-5-23 00:16

对X’=AX+Bu+Ed仿真前,要对A,B,E付值,可B=,L和C1都是常量,d是回路中的受控变量,无法直接付值,应该怎样处理呢???多谢指教!!!!!!!如果用B= u=,E=,u=,参数是多少啊?要怎么设啊?

张诚 发表于 2007-5-23 14:09

这样的情况好象应该用S函数来写吧?

cdwxg 发表于 2007-5-23 14:17

原帖由 zyf 于 2007-5-23 00:16 发表
对X’=AX+Bu+Ed仿真前,要对A,B,E付值,可B=,L和C1都是常量,d是回路中的受控变量,无法直接付值,应该怎样处理呢???多谢指教!!!!!!!如果用B= u=,E=,u=,参数是多少 ...
如果模块实现不了就用S函数,S函数写状态变量也是简单的
S函数的问题自己搜索,即便模块可以实现但你没有实现的情况下,为什么不考虑下S函数呢?

zyf 发表于 2007-5-24 16:52

实在是做不出来了!哪位高手帮忙写一下s函数的程序啊?还有关于模型的开环仿真bode图是怎么弄出来的?

zyf 发表于 2007-5-29 21:28

对X’=AX+Bu+Ed模块编写s函数,但是仿真时说有错误,为什么 啊?我的程序是
function = statefunc(t,x,u,flag,d)
A=;B=;
E=;C=;D=;
switch flag,
case 0,
    =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 =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= ;


str = [];


ts= ;   




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

sys = ;

function sys=mdlOutputs(t,x,u)

sys =;


function sys=mdlTerminate(t,x,u)

sys = [];

cdwxg 发表于 2007-5-30 11:09

sys = ;
sys =;这些表达方式不对.Vin又是什么?
参考该例子
function = 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, = 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 = 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 = ;
% 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] 2
查看完整版本: [求助]如何用 simulink中的 state-space实现 X’=AX+Bu+Ed?