1

入力を送信して出力を取得することにより、単一入力単一出力の線形システムを反復しています。システムの伝達関数の分子と分母は、コードでそれぞれNomとで表されます。Den

NomおよびDenは、いくつかの多項式で複雑な操作を行った後に計算されるため、これらの多項式の次数に関する事前情報はありません。私が知っている唯一のことは、システムが適切であることです (つまり、 の次数が の次Den数以上であるNom)。

私のコードは次のようになります。

% ...

Nom = (...);  % calculated after some complex operations
Den = (...);  % calculated after some complex operations

[A, B, C, D] = tf2ss(Nom, Den);
x = zeros(size(B));  % state vector
xp = x;              % derivative of the state vector

% ...

for t = 0 : SAMPLING_PERIOD : TIME_END
    % ...
    xp = A * x + B * u;    % 'u' is some scalar input, calculated in the code previously
    y  = C * x + D * u;    % 'y' is some irrelevant output signal, to be used in somewhere else in the code
    x  = xp * SAMPLING_PERIOD;
    % ...
end

% ...

Denが 0の場合(これNomも 0 次である必要があります) 、 、 、の空行列tf2ss()を返します。これは、コードの他の部分ではやや問題があります。これらの行列は少なくとも 1 行 1 列である必要があります。ABCD

それで、私の質問は、空を返す人のためにA、 、BCの代わりに使用できる同等の空でない行列は何ですか? Dたとえば、空行列はすべて 1 行 1 列のゼロ行列であると仮定できますか?


例:

[A, B, C, D] = tf2ss([1], [2])
戻り値
A = [] % Empty matrix
B = [] % Empty matrix
C = [] % Empty matrix
D = 0.5 % 1-by-1 matrix

4

2 に答える 2

1

最後に、出力が何を提供しているかを理解する必要があります。

コードが tf2ss 用に書かれている方法はif size(den) = 1a = b =c =[]

その理由は、微分方程式を提供しなくなり、微分方程式の成分を出力から分離しているためです。

あなたの目的のために、それが単一入力単一出力システムでAありB、ランダム行列である可能性があることを知っていて、x*C = [0] である限り、問題ないはずです。アイデアは、実際の「方程式への状態」は存在しないということです。ただし、あなたの目的のために、A = B = C = 0 で、微分の影響を受けない単一の状態 (つまり、純粋なゲイン システムに対して正確な現在の状態) のみが存在することを Matlab に指示する必要があります。

システムを構築するとき、Matlab では違いが見られるかもしれませんが、実際には同じです。

[A, B, C, D] = tf2ss([1], [2]);
H2 = ss(0,0,0,D);
H1 = ss(A,B,C,D);
bode(H1/ H2)
于 2012-05-20T21:06:35.073 に答える
0

空の行列は間違いなく1x1ゼロではありません。結果が数値ではないが、サイズがまだあることを何らかの方法でマークする必要がある場合は、代わりに1x1戻ってみてください。NaN

于 2012-05-20T20:18:55.970 に答える