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在于您试图将传递函数对象分配到传递函数数组中的特定位置。这是不允许的,因此会出现错误。
根据您的情况,您可能需要考虑以下方法:
您可以这样做:
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 中的非对角元素为零或等于零传递函数时才能正常工作。