-1.4142 Cc =
1.7321 1.2247 -0.7071 Tc =
-0.5774 0.5774 -0.5774 0.4082 -0.4082 -0.8165 -0.7071 -0.7071 0 Kc =
1 1 0
另一种按能控性分解的形式为
?c??Ac?x??????xc??0y?CcA12??xc??Bc???????u Ac??xc??0???xc?Cc?? (3-3-2)
?xc??将由ctrbf( )函数得到的各系数矩阵均利用MATLAB提供的函数rot90( )旋转180就可得这种形式。函数rot90( )的调用格式为
rot90(a,k) 将矩阵a逆时针旋转k?90.
我们编制的函数cdescom ( )能够将系统分解为这种形式。该函数的调用格式为 ?Ac??BcCcTck??cdesc(oAm,B,C)
Tc其中(A,B,C)为给定系统的状态空间模型,Ac,Bc,Cc为分解后系统的状态空间模型。
为相应的线性变换矩阵。k表示能控状态变量的数目。该函数的程序如下
function [Ac,Bc,Cc,Tc,k]=cdescom(A,B,C) %按能控性分解 U=ctrb(A,B); m=rank(U); n=size(A,1); if m~=n
t1=U(:,1); for i=2:n*m
t2=[t1,U(:,i)]; if rank(t2)==i t1=t2; else t1=t1; end
if rank(t1)==m
break; end end
p=zeros(n-m,n); for i=0:m
p(1:n-m,m+1-i:n-i)=eye(n-m,n-m); Tc=[t1,p']; if rank(Tc)==n break; end end
Ac=inv(Tc)*A*Tc; Bc=inv(Tc)*B; Cc=C*Tc; k=m; end
在命令窗中运行下列命令
>> A=[0 0 -1;1 0 -3;0 1 -3];B=[1;1;0];C=[0 1 -2];[Ac Bc Cc Tc]=cdescom(A,B,C) 返回 Ac =
0 -1 -1 1 -2 -2 0 0 -1 Bc = 1 0 0 Cc =
1 -1 -2 Tc =
1 0 0 1 1 0 0 1 1 k =
2
2) 按能观测性分解
如果线性系统状态不完全能观测,则可通过非奇异线性变换将系统(或状态)分解为能观测和不能观测两部分。
MATLAB提供的函数obsvf( )可将系统(或状态)分解为如下形式:
?o??Ao?x??????xo??0A12??xo??Bo???????u Ao??xo??Bo??x?y?0Co?o? (3-3-3)
?xo???该函数的调用格式为
?Ao其中?ABoCoToKo??obsvf(A,B,C)
BoCo?为分解后系统的状态空间
BC?为给定系统的状态空间模型,?Ao模型。To为相应的线性变换矩阵,Ko返回系统能控状态变量的数目。
例3-5 按能观测分解例3-4中系统
另一种按能观测性分解的形式为
?o??Ao?x??????xo??A21y?Co0??xo??Bo???????u Ao??xo??Bo???x?0?o? (3-3-4) ?xo??将由ctrbf( )函数得到的各系数矩阵均利用MATLAB提供的函数rot90( )旋转180就可得这种形式。
我们编制的函数odescom ( )能够将系统分解为这种形式。该函数的调用格式为
?Ao?BoCoTok??odesc(oAm,B,C)
其中(A,B,C)为给定系统的状态空间模型,(Ao,Bo,Co)为分解后系统的状态空间模型。
To为相应的线性变换矩阵。k表示能观测的状态变量的数目。该函数的程序如下
function [Ao, Bo, Co, To, k]=odescom(A,B,C) %按能观测性分解
V=obsv(A,C); m=rank(V); n=size(A,1); if m~=n
t1=V(1,:); for i=2:n*m
t2=[t1;V(i,:)]; if rank(t2)==i t1=t2; else t1=t1; end
if rank(t1)==m break; end end
p=zeros(n-m,n); for i=0:m
p(1:n-m,m+1-i:n-i)=eye(n-m,n-m); To=[t1;p]; if rank(To)==n break; end end
Ao=To*A*inv(To); Bo=To*B; Co=C*inv(To); k=m; end
3) 按能控性和能观测性分解(Kalman分解)
如果线性系统的状态不完全能控和不完全能观测,则可通过非奇异线性变换将系统(或状态)分解为能控能观测、能控不能观测、不能控能观测和不能控不能观测四部分。
?co??Aco?x?????xco???A21?co??0?x?????xco???00Aco00A13A23AcoA430??xco??Bco??????A24??xco??Bco??u
?????x00co?????Aco???xco??0?y?Cco?0Cco?xco??x?0?co? (3-3-5) ?xco????xco??可利用函数ctrbf( )、obsvf( )编制按能控性和能观测性分解函数kalmdec( ),该函数调用格式为:
?Ak其中?ABkCkTk??kalmdec(A,B,C)
BkCk?为分解以后系统的状态空
BC?为给定系统的状态空间模型,?Ak间模型,Tk为线性变换矩阵。该函数的程序如下
function [Ak, Bk, Ck ,Tk]=kalmdec(A,B,C) %按能控能观测性分解
[Ac,Bc,Cc,Tc,Kc]=ctrbf(A,B,C); nc=rank(ctrb(A,B));
n=length(A); ic=n-nc+1:n;
[Ao1,Bo1,Co1,To1,Ko1]=obsvf(Ac(ic,ic),Bc(ic),Cc(ic)); if nc [Ao2,Bo2,Co2,To2,Ko2]=obsvf(Ac(inc,inc),Bc(inc),Cc(inc)); end [m1,n1]=size(To1); [m2,n2]=size(To2); To=[To2,zeros(m2,n1); zeros(m1,n2),To1]; T=To*Tc; n1=rank(obsv(Ac(ic,ic),Cc(ic))); n2=rank(obsv(Ac(inc,inc),Cc(inc))); K=[zeros(1,n-nc-n2),ones(1,n2),2*ones(1,nc-n1),3*ones(1,n1)]; Ak1=T*A*inv(T);Bk1=T*B;Ck1=C*inv(T); Ak=rot90(Ak1,2); Bk=rot90(Bk1,2); Ck=rot90(Ck1,2); Tk=rot90(T,2); 例3-6 按能控性和能观测性分解例3-4中系统 在命令窗中运行下列命令: >> A=[0 0 -1;1 0 -3;0 1 -3]; B=[1;1;0]; C=[0 1 -2]; [Ak Bk Ck Tk]=kalmdec(A,B,C) 返回 Ac = -1.0000 0 1.2247 3.4641 -1.0000 -2.1213 -0.0000 0.0000 -1.0000 Bc = -0.7071 -1.2247 0