当tf2ss()返回空矩阵时我该怎么办?

时间:2012-05-20 20:15:47

标签: function matlab matrix transfer state-space

我正在通过向其发送输入并从中获取输出来迭代单输入单输出线性系统。系统传递函数的分母和分母分别由代码中的NomDen表示。

NomDen是在对某些多项式进行一些复杂运算后计算出来的,因此我没有关于这些多项式程度的先验信息。我唯一知道的是系统是正确的(即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 th 顺序时(需要Nom为0 th 顺序),tf2ss()返回ABCD的空矩阵。这在我的其他代码部分中有些问题。我需要这些矩阵至少为1乘1。

所以,我的问题是,对于那些返回空的人,我可以使用哪些等效的非空矩阵代替ABCD?例如,我可以假设所有空矩阵都是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

2 个答案:

答案 0 :(得分:1)

Ultimelty,您需要了解输出提供的内容。

为tf2ss编写代码的方式,if size(den) = 1然后a = b =c =[]

原因是因为你不再提供微分方程,而是将微分方程组件与输出分开。

出于您的目的,知道它是单输入单输出系统,AB可以是随机矩阵,只要您有x * C = [0],您应该没问题。这个想法是没有真正的“状态到等式”。但是,为了您的目的,您应该指示Matlab只有一个状态不受其衍生物的影响(即当前状态,对于纯增益系统是准确的),A = B = C = 0

虽然Matlab在构建系统时可能会有所不同,但事实是它们是相同的:

[A, B, C, D] = tf2ss([1], [2]);
H2 = ss(0,0,0,D);
H1 = ss(A,B,C,D);
bode(H1/ H2)

答案 1 :(得分:0)

空矩阵绝对不是1x1个零。如果您需要以某种方式标记结果不是数字,但仍有1x1的大小,请尝试返回NaN