状态空间系统给出不同的波特图然后传递函数矩阵

时间:2014-10-28 11:07:45

标签: matlab control-theory state-space

我有一个带有矩阵A,B,C和D的状态空间系统。

我可以创建state space systemsys1 = ss(A,B,C,D)或计算transfer function matrixsys2 = C*inv(z*I - A)*B + D

然而,当我绘制两个系统的波特图时,它们是不同的,而它们应该是相同的。

这里出了什么问题?有人有线索吗?我知道由sys1生成的波特图是正确的。

系统可以在这里下载:https://dl.dropboxusercontent.com/u/20782274/system.mat

clear all;
close all;
clc;

Ts = 0.01;
z = tf('z',Ts);

% Discrete system
A = [0 1 0; 0 0 1; 0.41 -1.21 1.8];
B = [0; 0; 0.01];
C = [7 -73 170];
D = 1;

% Set as state space
sys1 = ss(A,B,C,D,Ts);

% Compute transfer function
sys2 = C*inv(z*eye(3) - A)*B + D;

% Compute the actual transfer function
[num,den] = ss2tf(A,B,C,D);
sys3 = tf(num,den,Ts);

% Show bode
bode(sys1,'b',sys2,'r--',sys3,'g--');

编辑:我犯了一个小错误,传递函数矩阵是sys2 = C*inv(z*I - A)*B + D,而不是之前写过的sys2 = C*inv(z*I - A)*B - D。问题仍然存在。


编辑2:我已经注意到,当我计算分母时,它是正确的。

syms z;
collect(det(z*eye(3) - A),z)

4 个答案:

答案 0 :(得分:1)

您认为sys2 = C*inv(z*I- A)*B + D不正确。与状态空间系统(A,B,C,D)的正确等效值为sys2 = C*inv(s*I- A)*B + D。如果您想用z来表达,您需要反转关系z = exp(s*T)sys1是您的状态空间系统的正确表示。我建议sys2做的事情如下:

sys1 = ss(mjlsCE.A,mjlsCE.B,mjlsCE.C,mjlsCE.D,Ts);
sys1_c = d2c(sys1);
s = tf('s');
sys2_c = sys1_c.C*inv(s*eye(length(sys1_c.A)) - sys1_c.A)*sys1_c.B + sys1_c.D;
sys2_d = c2d(sys2_c,Ts);

这应该会给你正确的结果。

答案 1 :(得分:1)

由于反函数的不准确性,额外的不可观察的极点和零点被添加到系统中。因此,您需要计算传递函数矩阵的最小实现。

含义

% Compute transfer function
sys2 = minreal(C*inv(z*eye(3) - A)*B + D);

答案 2 :(得分:1)

您注意到的实际上是关于零极点对取消的数值不稳定性。 如果您运行以下代码:

A = [0, 1, 0; 0, 0, 1; 0.41, -1.21, 1.8] ;
B = [0; 0; 0.01] ;
C = [7, -73, 170] ;
D = 1 ;

sys_ss = ss(A, B, C, D) ;

sys_tf_simp = tf(sys_ss) ;

s = tf('s') ;
sys_tf_full = tf(C*inv(s*eye(3) - A)*B + D) ;

zero(sys_tf_simp)
zero(sys_tf_full)

pole(sys_tf_simp)
pole(sys_tf_full)

你会发现矩阵直接形成的传递函数比MatLab函数所设计的极点和零点多得多。您还会注意到每一对"额外"极点和零点是相等的 - 意味着如果你只是理性的表达,它们会相互抵消。 MatLab的tf呈现简化形式,取消了相等的零极点对。这在代数上等同于未简化的形式,但不是数字上的。

当你在未简化的传递函数上调用bode时,MatLab开始其数值绘图程序,其中零极点对没有被代数取消。如果计算机是完美的,结果将与简化案例中的结果相同。然而,在评估分子和分母时,数值误差有效地留下了一些零极点对#&34;未取消"由于这些极点中的许多极点位于s平面的最右侧,因此它们会极大地影响输出行为。

查看此链接以获取有关同一问题的信息,但从设计的角度来看:http://ctms.engin.umich.edu/CTMS/index.php?aux=Extras_PZ

在您的原始代码中,您可以将绿色绘制的输出视为天真的设计师想要看他用零点取消所有不稳定的极点时的输出,但是用红色绘制的输出是什么他实际上已经得到了,因为在实践中,有限精度和现实世界的容差会阻止极点和零点完全抵消。

答案 3 :(得分:0)

为什么不可观察/不可控制的极点?我认为这个问题只是因为传递函数矩阵的逆在Matlab中是不准确的。

注意:

  1. A是3x3,最小实现也是3阶。
  2. 您所做的是传递函数矩阵的逆矩阵,而不是符号或数字矩阵。

  3. # Discrete system
    Ts = 0.01;
    A = [0 1 0; 0 0 1; 0.41 -1.21 1.8];
    B = [0; 0; 0.01];
    C = [7 -73 170];
    D = 1;
    
    z = tf('z', Ts)) # z is a discrete tf
    A1 = z*eye(3) - A # a tf matrix with a direct feedthrough matrix A
    
    # inverse it, multiply with C and B from left and right, and plus D
    G = D + C*inv(A1)*B 
    

    G现在是标量(SISO)传递函数。

    没有“minreal”,G有第9顺序(好笑,我不知道Matlab如何计算它,也许是“Adj(。)/ det(。)”方法)。 Matlab不能取消分子和分母中的公因子,因为z是'tf'类而不是符号变量。

    你同意还是我有误解?