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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top