【问题标题】:State space system gives different bode plot then transfer function matrix状态空间系统给出不同的波特图然后传递函数矩阵
【发布时间】:2014-10-28 11:07:45
【问题描述】:

我有一个包含矩阵 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)

【问题讨论】:

    标签: matlab control-theory state-space


    【解决方案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);
    

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

    【讨论】:

    • 我认为这是不正确的。请参阅:dcsc.tudelft.nl/~sc4060/transp/discreteNOTES.pdf 第 47 页。计算连续或离散时间系统的传递函数矩阵是相同的,只是 sz 互换,即 cont_sys = C*inv(s*I - A)*B + Ddisc_sys = C*inv(z*I - A)*B + D。还要注意我对 openingspost 所做的小修改。还要注意 A、B、C、D 矩阵已经是离散的!
    • 其实我的错误zsz = exp(s*T)有关。您的假设仍然不正确,但我会更新我的答案。
    • 波特图还是不一样,请用我的脚本自己检查一下,你的更正说服自己。我相信这是因为我使用了“零匹配极点”(mathworks.nl/help/control/ref/c2d.html)区分。此外,我仍然不相信真的:p。实际上 z = exp(s*T) 之间的关系,但是我在这里不处理任何连续时间系统,我只处理离散系统,例如,系统矩阵 A、B、C、D 已经是离散的.使用sys1 = ss(A,B,C,D,Ts) 后,所有矩阵都没有改变
    • 我只能访问 Octave,它不允许将传递函数和矩阵相乘s*eye(length(mjlsCE.A))z*eye(length(mjlsCE.A)),所以很遗憾我不能尝试。但是,如果您使用的是离散系统,请坚持使用sys1 方法,这是正确的方法。顺便说一句,矩阵不是“离散的”,它只是数字的集合。它可用于描述离散或连续系统,或两者兼而有之。
    • 真可惜。确实你是对的,矩阵不是离散的,但我的意思是连续时间系统的矩阵已经转换为离散时间系统的矩阵,即 (A,B,C,D) ->(广告,Bd,Cd,Dd)。不幸的是,坚持使用 sys1 对我不起作用,因为我还需要使用不同的方法计算不同的传递函数矩阵,但涉及与 C*inv(z*I - A)*B + D 中相同的技术
    【解决方案2】:

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

    意义

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

    【讨论】:

      【解决方案3】:

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

      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 的 tf 函数制定的传递函数具有更多的极点和零点。您还会注意到,这些“额外”极点和零点的每一对都是相等的——这意味着如果您只是简单的有理表达式,它们就会相互抵消。 MatLab 的 tf 呈现简化形式,消除了相等的零极对。这在代数上等价于未简化的形式,但在数值上不等价。

      当您在未简化的传递函数上调用 bode 时,MatLab 开始其数值绘图例程,其中极零对未通过代数消除。如果计算机是完美的,结果将与简化情况相同。然而,在计算分子和分母时,数值误差有效地使一些极点-零对“未消除”,并且由于其中许多极点位于 s 平面的最右侧,它们极大地影响了输出行为。

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

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

      【讨论】:

        【解决方案4】:

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

        注意:

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

        # 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'类而不是符号变量。

        你同意还是我有误解?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-30
          • 2018-05-02
          • 1970-01-01
          • 1970-01-01
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 2020-03-19
          相关资源
          最近更新 更多