创建MIMO(多输入多输出)传输功能系统,无需对输入和输出的数量进行硬编码

时间:2013-07-30 14:20:56

标签: matlab control-theory transfer-function

简介
作为更大系统的一部分,我正在尝试创建一个多输入多输出传递函数,它只将输入链接到引线对角线上的输出*。即它在输入1和输出1,输入2和输出2等之间具有非零传递函数。

*你是否真的认为MIMO系统是一个公平的评论,我希望它采用这种格式,因为它链接到一个更大的系统,实际上是MIMO。

硬编码
我可以通过连接传递函数来实现这一点

tf1=tf([1 -1],[1 1]);
tf2=tf([1 2],[1 4 5]);
tf3=tf([1 2],[5 4 1]);

G=[tf1 0 0; 0 tf2 0; 0 0 tf3]; 

哪种方法很好,但(a)硬编码输入/输出的数量,(b)越多,输入和输出越多越可怕。

诊断功能
这个问题对于diag函数似乎是完美的,但是似乎没有为'tf'类型定义diag

G=diag([tf1, tf2, tf3])
??? Undefined function or method 'diag' for input arguments of type 'tf'.

手动矩阵操作
我也试过手动操作矩阵(不是我真的希望它能起作用)

G=zeros(3);
G(1,1)=tf1;
G(2,2)=tf2;
G(3,3)=tf3;
??? The following error occurred converting from tf to double:
Error using ==> double
Conversion to double from tf is not possible.

tf直接采用MIMO格式
tf还具有一种格式,其中所有分子和分母单独表示,并且直接创建MIMO系统。我试图以非硬编码格式使用它

numerators=diag({[1 -1], [1 2],[1 2]})
denominators=diag({[1 1], [1 4 5],[5 4 1]})
G=tf( numerators , denominators )
??? Error using ==> checkNumDenData at 19
Numerators and denominators must be specified as non empty row vectors.

这一个几乎工作,不幸的是,分子和分母在非对角线上是空的而不是0;导致错误

问题
是否可以从传输函数创建MIMO系统而无需“硬编码”输入和输出的数量

2 个答案:

答案 0 :(得分:2)

我建议你尝试realizing每个SISO作为状态空间系统,比如(Ak, Bk, Ck, Dk),组装一个像

这样的大型对角系统
A = blkdiag(A1,....)
B = blkdiag(B1,...)
C = blkdiag(C1,...)
D = diag([D1, ....])

然后使用ss2tf计算扩充系统的传递函数。

答案 1 :(得分:0)

matlab中的

diagblkdiag不同。重载的LTI运算符是blkdiag,用于将事物放在矩阵结构的对角线上。

在您的情况下,只需

即可完成
tf1=tf([1 -1],[1 1]);
tf2=tf([1 2],[1 4 5]);
tf3=tf([1 2],[5 4 1]);
G = blkdiag(tf1,tf2,tf3)

MIMO语法要求小区将多项式条目与MIMO结构区分开。此外,它不喜欢相同的零分母条目(这是可以理解的),因此如果你想进入你需要使用的mimo上下文

G = tf({[1 -1],0,0;0,[1 2],0;0,0,[1 2]},{[1 1],1,1;1,[1 4 5],1;1,1,[5 4 1]})

或您的语法

Num = {[1 -1],0,0;0,[1 2],0;0,0,[1 2]};
Den = {[1 1],1,1;1,[1 4 5],1;1,1,[5 4 1]};
tf(Num,Den)

而不是你可以使用任何有效的非零条目。