Continuous-time model.
如果SISO线性定常系统?(A,B,C,D)完全能控,则可通过非奇异线性变换将状态空间表达式?(A,B,C,D)变换为能控标准型。
我们编制的函数ctrlss( ) 可实现这一变换。该函数的调用格式为:
Gc?ctrlss(G)
其中G为原来的状态空间模型。Gc为转换得到的能控标准型。
该函数程序如下:
function Gc=ctrlss(A,B,C,D) %将状态空间表达式变换为能控标准型 n=length(A); Uc=ctrb(A,B); U=inv(Uc); p1=U(n,:); for i=1:n
T(i,:)=p1*A^(i-1); end
Ac=T*A*inv(T); Bc=T*B; Cc=C*inv(T);
Gc=ss(Ac,Bc,Cc,D);
例1-10 考虑一个系统,它的状态空间表达式为
?0???1x???221?2?2??2?????2x?1u ????1???1??y??111?x
将其转换为能控标准型。
在命令窗中运行下列命令
>> A=[0 2 -2;1 1 -2;2 -2 1];B=[2 1 1]';C=[1 1 1];D=0;Gc=ctrlss(A,B,C,D)
返回 a =
x1 x2 x3 x1 -4.441e-016 1 1.665e-016 x2 -8.882e-016 0 1 x3 -2 1 2 b =
u1 x1 1.388e-017 x2 0 x3 1 c =
11
x1 x2 x3 y1 -20 -4 4 d =
u1 y1 0
Continuous-time model.
试编将状态空间表达式变换为能观测标准型的函数。
二 线性定常系统状态方程的解
1、线性定常连续系统状态转移矩阵的计算
线性定常连续系统的状态转移矩阵为?(t)?eAt?L?1[(sI?A)?1]。 在MATLAB中, 状态转移矩阵可直接用指数矩阵法和拉氏反变换法计算。例2-1 求系统矩阵A对应的状态转移矩阵。 A??01???3 ??2? ?指数矩阵法:
在命令窗中运行下列命令
>> A=[0 1;-2 -3];syms t; phet=expm(A*t) 返回
phet =
[ -exp(-2*t)+2*exp(-t), exp(-t)-exp(-2*t)] [ -2*exp(-t)+2*exp(-2*t), 2*exp(-2*t)-exp(-t)] 拉氏反变换法:
在命令窗中运行下列命令
>> A=[0 1;-2 -3]; syms s;G=inv(s*eye(size(A))-A) 返回
G =
[ (s+3)/(s^2+3*s+2), 1/(s^2+3*s+2)] [ -2/(s^2+3*s+2), s/(s^2+3*s+2)]
即(sI?A)?1。再对其进行拉氏逆变换,即在命令窗中输入语句 >>phet= ilaplace(G) 返回
phet =
[ -exp(-2*t)+2*exp(-t), exp(-t)-exp(-2*t)] [ -2*exp(-t)+2*exp(-2*t), 2*exp(-2*t)-exp(-t)] 2. 线性定常连续系统的状态方程求解
如果线性定常连续系统的状态空间表达式为
x??Ax?Bu y?Cx?Du
12
3-2-1) (
且初始状态为x(0),那么状态方程解的拉氏变换式为
x(s)?(sI?A)?1x(0)?(sI?A)?1Bu(s) (3-2-2)
其解为
x(t)?eAtx(0)??t0eA(t??)Bu(?)d? (3-2-3)
其中零输入响应为 eAtx(0)或L?1{(sI?A)?1}x(0) (3-2-4) 零状态响应为
?t0eA(t??)?1?1Bu(?)d或L{(sI?A)Bu(s)} (3-2-5)
系统的输出响应为 L?1{C(sI?A)?1x(0)?C(sI?A)?1Bu(s)}?Du(t) (3-2-6) 例2-2 已知系统的状态方程为
??? x?0??21??0?x????u ?3??1??1??,输入分别为u(t)?1(t)和 u(t)?t时状态方程的解。 ?1??试求初始状态为x(0)??编制程序%ex22求输入为u(t)?1(t)时状态方程的解。该程序如下: A=[0 1;-2 -3];B=[0 1]';syms
-1]';Xt1=phet*X0
Xt2=ilaplace(G*B*(1/s)) 在命令窗中运行该程序,即 >> ex22 返回 xt1 =
[ exp(-t)] [ -exp(-t)] xt2 =
[ 1/2-exp(-t)+1/2*exp(-2*t)] [ exp(-t)-exp(-2*t)]
其中xt1为零输入响应,xt2为零状态响应。
将该程序中u(s)?xt1 =
[ exp(-t)] [ -exp(-t)] xt2 =
[ 1/2*t-3/4-1/4*exp(-2*t)+exp(-t)] [ 1/2-exp(-t)+1/2*exp(-2*t)]
上述得到的是状态方程的解析解,MATLAB提供的函数step( ) 、impulse( )、lsim( ) 和
1ss;G=inv(s*eye(size(A))-A);phet=ilaplace(G);X0=[1
用u(s)?1s2代替可求出输入为单位斜坡函数时状态方程的解
13
initial( )可以求得系统响应的数值解。
? 函数step( ) 可直接求取线性连续系统的单位阶跃响应。该函数的调用格式为:
t为时间向量。通常取t=0:dt:t-end,其y?step(G,t) 其中G为给定系统LTI模型,中t-end为终值时间,而dt为时间步长。y为系统输出。
y?step(G) 这时时间向量t自动生成。
则x为系统状[y,t,x]?step(G,t) 或 [y,t,x]?step(G) 如果G为状态空间模型,态向量,否则x将返回空矩阵。
step(G,t) 或 step(G) 此时不返回任何变量,而自动地绘制单位阶跃响应输出曲
线。
? 函数impulse( ) 可直接求取线性系统的单位脉冲响应。该函数的调用格式与函数step( )的调用格式相似。
? 函数lsim( ) 可直接求取线性系统在任意输入信号作用下的响应。该函数的调用格式为:
y?lsim(G,u,t)
其中u为与时间向量t对应的输入向量。当然还可以和step( )函数一样有其它的调用格式。 ? 函数initial( ) 可求解系统的零输入响应。该函数的调用格式为
y?initial(G,x0) 或 [y,t,x]?initia(Gl,x0)
其中G为状态空间模型,x0为初始状态。 例2-3 已知系统为
?0?x????21??0??x???u ?3??1?y??11?x
?1??,试求u(t)为单位阶跃函数时系统状态响应和输出响应,并绘制状?1??初始状态为x(0)??态响应曲线和输出响应曲线。
在命令窗中运行下列命令,建立状态空间模型,计算系统在初始状态作用下的状态响应
和输出响应,并绘制相应的响应曲线。
>> A=[0 1;-2 -3]; B=[0;1]; C=[1 1]; D=0; G=ss(A,B,C,D); t=0:0.5:10; x0=[1;-1];
[yo,t,xo]=initial(G,x0,t); plot(t,xo,':',t,yo,'-') 返回图1。
14
图1状态响应 图2 输出响应
在命令窗中继续运行下列命令,计算系统在输入作用下的状态响应和输出响应,并绘制相应的响应曲线。
>>figure('pos',[50 50 200 150],'color','w') u=ones(size(t));
[yu,t,xu]=lsim(G,u,t); plot(t,xu,':',t,yu,'-') 返回图2。
再继续运行下列命令求系统总的状态响应和输出响应,并绘制相应的响应曲线。 >>y=yo+yu; x=xo+xu; plot(t,x,':',t,y,'-') 返回图3。
图3 图4 例2-4 已知系统
??? x?0??51??2?x????u ?6??0?
y??12?x
?t求出系统在初始状态为零,且u(t)?e(t?0)时系统的状态响应和输出响应。
在命令窗中运行下列命令
>>A=[0 1;-5 -6];B=[2;0];C=[1 2];D=0;G=ss(A,B,C,D);t=0:0.5:20;u=exp(-t);
[y,t,x]=lsim(G,u,t);plot(t,x,':k',t,y,'-k')
可得状态响应和输出响应的数值解以及相应的曲线,如图4。
也可编制如下程序%ex24,先求状态方程的解析解再求数值解,然后绘制曲线。 %ex24
15