Cosa devo fare quando tf2ss() restituisce matrici vuote?
-
12-12-2019 - |
Domanda
Sto iterando un sistema lineare a ingresso singolo e uscita singola inviandogli input e ottenendo output da esso.Il nominatore e il denominatore della funzione di trasferimento del sistema sono rappresentati da Nom
E Den
rispettivamente nel codice.
Nom
E Den
vengono calcolati dopo alcune operazioni complesse su alcuni polinomi, quindi non ho informazioni preliminari sul grado di questi polinomi.L'unica cosa che so è che il sistema è corretto (cioè;il grado di Den
è maggiore o uguale al grado di Nom
).
Il mio codice è questo:
% ...
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
% ...
Quando Den
è 0th ordine (che richiede Nom
essere 0th anche ordinare), tf2ss()
restituisce matrici vuote per A
, B
, C
E D
.Questo è alquanto problematico nelle mie altre parti di codice.Ho bisogno che queste matrici siano almeno 1 per 1.
Quindi, la mia domanda è: quali matrici equivalenti non vuote posso usare al posto di A
, B
, C
E D
per chi torna vuoto?Ad esempio, posso supporre che tutte le matrici vuote siano matrici zero 1 per 1?
Esempio:
[A, B, C, D] = tf2ss([1], [2])
ritorna
A = [] % Empty matrix
B = [] % Empty matrix
C = [] % Empty matrix
D = 0.5 % 1-by-1 matrix
Soluzione
In ultima analisi, è necessario capire cosa sta fornendo l'output.
Il modo in cui è scritto il codice per tf2ss, if size(den) = 1
Poi a = b =c =[]
Il motivo è che non stai più fornendo un'equazione differenziale e stai separando il componente dell'equazione differenziale dall'output.
Per i tuoi scopi, sapendo che si tratta di un sistema a ingresso singolo e uscita singola, A
E B
possono essere matrici casuali e finché hai x*C = [0], dovresti stare bene.L'idea è che non esiste un vero "stato dell'equazione".Tuttavia, per i tuoi scopi, dovresti istruire Matlab che esiste un solo stato che non è influenzato dalla sua derivata (cioèlo stato attuale, che è accurato per un sistema a puro guadagno) con A = B = C = 0
Sebbene Matlab possa notare una differenza durante la creazione del sistema, la realtà è che sono la stessa cosa:
[A, B, C, D] = tf2ss([1], [2]);
H2 = ss(0,0,0,D);
H1 = ss(A,B,C,D);
bode(H1/ H2)
Altri suggerimenti
Le matrici vuote sicuramente non lo sono 1x1
zeri.Se è necessario contrassegnare in qualche modo che il risultato non è un numero, ma ha comunque la dimensione 1x1
, prova a tornare NaN
Invece.