1

行列 A、B、C、D を持つ状態空間システムがあります。

状態空間システムを作成するか、伝達関数行列sys1 = ss(A,B,C,D)計算できます。sys2 = 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

4 に答える 4

1

逆関数が不正確であるため、余分な観測不能な極と零点がシステムに追加されます。このため、伝達関数行列の最小実現を計算する必要があります。

意味

% Compute transfer function
sys2 = minreal(C*inv(z*eye(3) - A)*B + D);
于 2014-10-28T14:40:18.240 に答える
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 に答える
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 に答える
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(.)」メソッド)。z はシンボリック変数ではなくクラス 'tf' であるため、Matlab は分子と分母の共通因数を取り消すことができません。

あなたは同意しますか、それとも私は誤解していますか?

于 2014-11-20T16:58:13.027 に答える