¿Qué hago cuando tf2ss() devuelve matrices vacías?
-
12-12-2019 - |
Pregunta
Estoy iterando un sistema lineal de una sola entrada, una sola salida enviándole entradas y obteniendo salidas.El denominador y denominador de la función de transferencia del sistema están representados por Nom
y Den
en el código respectivamente.
Nom
y Den
se calculan después de algunas operaciones complejas en algunos polinomios, por lo que no tengo información previa sobre el grado de estos polinomios.Lo único que sé es que el sistema es adecuado (es decir;el grado de Den
es mayor o igual al grado de Nom
).
Mi código es el siguiente:
% ...
Nom = (...); % calculated after some complex operations
Den = (...); % calculated after some complex operations
[A, B, C, D] = tf2ss(Nom, Den);
x = zeros(size(B)); % state vector
xp = x; % derivative of the state vector
% ...
for t = 0 : SAMPLING_PERIOD : TIME_END
% ...
xp = A * x + B * u; % 'u' is some scalar input, calculated in the code previously
y = C * x + D * u; % 'y' is some irrelevant output signal, to be used in somewhere else in the code
x = xp * SAMPLING_PERIOD;
% ...
end
% ...
Cuando Den
es 0th orden (que requiere Nom
ser 0th orden también), tf2ss()
devuelve matrices vacías para A
, B
, C
y D
.Esto es algo problemático en mis otras partes del código.Necesito que estas matrices sean al menos 1 por 1.
Entonces, mi pregunta es, ¿qué matrices equivalentes no vacías puedo usar en lugar de A
, B
, C
y D
¿Para los que regresan vacíos?Por ejemplo, ¿puedo suponer que todas las matrices vacías son matrices cero 1 por 1?
Ejemplo:
[A, B, C, D] = tf2ss([1], [2])
devoluciones
A = [] % Empty matrix
B = [] % Empty matrix
C = [] % Empty matrix
D = 0.5 % 1-by-1 matrix
Solución
En última instancia, es necesario comprender qué proporciona el resultado.
La forma en que está escrito el código para tf2ss, if size(den) = 1
entonces a = b =c =[]
La razón de esto es que ya no proporciona una ecuación diferencial y está separando el componente de la ecuación diferencial de la salida.
Para sus propósitos, sabiendo que es un sistema de entrada única y salida única, A
y B
pueden ser matrices aleatorias, y siempre que tenga x*C = [0], debería estar bien.La idea es que no existe un "estado real de la ecuación".Sin embargo, para sus propósitos, debe indicarle a Matlab que solo existe un estado que no está influenciado por su derivado (es decir,el estado actual, que es exacto para un sistema de ganancia pura) con A = B = C = 0
Si bien Matlab puede ver una diferencia al construir el sistema, la realidad es que son iguales:
[A, B, C, D] = tf2ss([1], [2]);
H2 = ss(0,0,0,D);
H1 = ss(A,B,C,D);
bode(H1/ H2)
Otros consejos
Las matrices vacías definitivamente no lo son. 1x1
ceros.Si necesita marcar de alguna manera que el resultado no es un número, pero aún tiene un tamaño de 1x1
, intenta regresar NaN
en cambio.