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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top