如何从 Octave 的传递函数矩阵中提取元素?

Jus*_*n T 5 octave control-theory transfer-function

我正在控制包中使用 Octave,我想采用一组传递函数(初始化如下)并提取矩阵的对角线元素。每当我尝试这样做时,都会遇到以下错误。我尝试了很多解决方法(将其转换为状态空间图、将元素存储在单元格中等),但我要么遇到类似的错误,要么最终得到一个无法再与其他矩阵交互的对象传递函数。文档中有一些未实现的函数(如 ss2ss),我认为这些函数很有用,但不可用。

我该如何解决这个问题?

初始化我正在使用的对象类型的代码:

s = tf('s');
m = inv(s*e - mat); // e and mat are just square matrices of numbers
Run Code Online (Sandbox Code Playgroud)

我用来尝试提取对角线分量的代码:

function D = getD(W) // W is of the similar type as above
    n = size(W,1);
    Dtemp = tf(eye(n));
    for i = 1:n
        Dtemp(i,i) = W(i,i);
    end
    D = Dtemp;
end
Run Code Online (Sandbox Code Playgroud)

我不断收到的错误:

error: lti: subsasgn: invalid subscripted assignment type '()'.  you must select an LTI key first, i.e.  sys.keyname(...) = ...
Run Code Online (Sandbox Code Playgroud)

请注意,当我将 Dtemp 初始化为单元格 (n,n) 时,我得到以下类型:

{
  [1,1] =

    <class tf>

  [2,1] =

    <class tf>
etc.
Run Code Online (Sandbox Code Playgroud)

而不是这种类型:(这是我希望它与之交互的类型)

{
  [1,1] =

    <class tf>

}

Run Code Online (Sandbox Code Playgroud)

尽管它们的大小都是nxn。我希望能够将前者转换为后者,这样我就可以与后一种类型的其他对象进行交互。

小智 1

在 Octave 中,如果要创建传递函数数组,然后提取对角线元素,则必须使用元胞数组。您的函数的问题getD在于您试图将传递函数对象分配到传递函数数组中的特定位置。这是不允许的,因此会出现错误。

根据您的情况,您可能需要考虑以下方法:

  1. 使用传递函数初始化元胞数组。
  2. 将对角线元素提取到另一个元胞数组中。
  3. 需要时将传递函数元胞数组转换为传递函数数组。

您可以这样做:

s = tf('s');
m = inv(s*e - mat);

function D = getD(W)
    n = size(W,1);
    Dtemp = cell(n,n);
    for i = 1:n
        Dtemp{i,i} = W{i,i};
    end
    D = Dtemp;
end
Run Code Online (Sandbox Code Playgroud)

调用 getD 后,您将得到一个array D包含对角传递函数的单元格。当您希望 D 与其他传递函数数组交互时,可以使用控制包中的 tfcell2tf 将其转换回来:

D_tf = tfcell2tf(D);
Run Code Online (Sandbox Code Playgroud)

NowD_tf是一个传递函数数组,可用于与其他传递函数数组交互。请记住,tfcell2tf 仅当 D 中的非对角元素为零或等于零传递函数时才能正常工作。