1

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

我可以创建一个状态空间系统sys1 = ss(A,B,C,D)或者计算传递函数矩阵sys2 = C*inv(z*I - A)*B + D

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

这里出了什么问题?有人有线索吗?我知道 btw 生成的 bodeplotsys1是正确的。

系统可以在这里下载: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

4 回答 4

1

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

意义

% Compute transfer function
sys2 = minreal(C*inv(z*eye(3) - A)*B + D);
于 2014-10-28T14:40:18.240 回答
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);

那应该给你正确的结果。

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

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

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

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

于 2015-11-28T09:51:54.177 回答
0

为什么是不可观察/不可控制的极点?我认为这个问题的出现只是因为传递函数矩阵的逆矩阵在 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' 类而不是符号变量。

你同意还是我有误解?

于 2014-11-20T16:58:13.027 回答