简介
作为更大系统的一部分,我正在尝试创建一个多输入多输出传递函数,它只将输入链接到引线对角线上的输出*。即它在输入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系统而无需“硬编码”输入和输出的数量
答案 0 :(得分:2)
我建议你尝试realizing每个SISO作为状态空间系统,比如(Ak, Bk, Ck, Dk)
,组装一个像
A = blkdiag(A1,....)
B = blkdiag(B1,...)
C = blkdiag(C1,...)
D = diag([D1, ....])
然后使用ss2tf
计算扩充系统的传递函数。
答案 1 :(得分:0)
diag
与blkdiag
不同。重载的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)
而不是你可以使用任何有效的非零条目。