Создание системы передаточной функции MIMO (несколько входов и нескольких выходов) без жесткого кодирования количества входов и выходов.

Введение
В рамках более крупной системы я пытаюсь создать передаточную функцию с несколькими входами и несколькими выходами, которая связывает входы и выходы только на главной диагонали*. т.е. он имеет ненулевые передаточные функции между входом 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]; 

Это прекрасно работает, но (а) жестко кодирует количество входов/выходов и (б) становится все более ужасным, чем больше входов и выходов у вас есть.

Функция Diag
Эта проблема кажется идеальной для функции diag, однако, похоже, что diag не определена для типа 'tf'

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 из передаточных функций без "жесткого кодирования" количества входов и выходов


person Richard Tingle    schedule 30.07.2013    source источник


Ответы (2)


Я предлагаю вам попробовать реализовать каждый SISO как пространство состояний системы, скажем, (Ak, Bk, Ck, Dk), собирая большую диагональную систему, например

A = blkdiag(A1,....)
B = blkdiag(B1,...)
C = blkdiag(C1,...)
D = diag([D1, ....])

а затем используйте ss2tf для вычисления передаточной функции дополненной системы.

person Jan    schedule 30.07.2013
comment
Спасибо! Это именно то, что я искал - person Richard Tingle; 31.07.2013

diag в Matlab не совпадает с 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)

Вместо единиц вы можете использовать любые допустимые ненулевые записи.

person percusse    schedule 25.07.2015