Soluzione alternativa a lsim()

di il
1 risposte

Soluzione alternativa a lsim()

Buongiorno a tutti,
vi scrivo perchè ho un problema al quale non riesco a trovare soluzione.
In sostanza possiedo una funzione di trasferimento TF definita in S e mi è necessario valutare, istante per istante, la sua risposta nel dominio del tempo ad un determinato ingresso.
Cercando nell'help di Matlab ho trovato la funzione lsim()
http://www.mathworks.it/help/toolbox/control/ref/lsim.html

Purtoppo però lsim() richiede un vettore di ingressi e dei tempi che abbiano almeno dimensione 2 e, dato che la funzione che sto implementando viene richiamata da codice esterno che non posso modificare, devo lavorare con ingressi e tempi di natura unidimensionale.
Quindi chiedo a voi se esista una funzione, oppure una maniera operativa alternativa, che mi permetta di calcolare la risposta nel tempo della suddetta TF con un solo campione dell'ingresso.
Grazie e buona giornata!

1 Risposte

  • Re: Soluzione alternativa a lsim()

    Ok, credo di aver trovato una soluzione quanto meno funzionante, la posto di seguito nel caso a qualcuno servisse in futuro (oppure nel caso qualcuno voglia sgridarmi per l'oscenità scritta ).
    Non potendo calcolarmi la risposta di TF nel dominio del tempo in un dato istante e sollecitata da un determinato ingresso attraverso lsim(), ho deciso di intraprendere la strada più complicata ed antitrasformare TF nella funzione f(t, u).
    Successivamente, la valuto nell'istante t e nell'ingresso u che mi vengono passati, e gli e termino la funzione ritornando tale valore.
    Il punto meno piacevole è stato scoprire che il comando ilaplace(), che serve per effettuare l'antitrasformata di Laplace, non funziona con l'oggetto TF in quanto facente parte della classe tf mentre invece ilaplace() richiede un oggetto di tipo syms.
    Ho dovuto quindi lavorare un pò di tfdata() e poly2sym() per ottenere quanto desiderato.
    Ecco il codice
    
    [num, den] = tfdata(TF);
    syms s;
    TF_syms = poly2sym(cell2mat(num), s) / poly2sym(cell2mat(den), s);
    iTF = ilaplace(TF_syms)
    
    % trucchetto
    iTF = @(t) subs(iTF, 't', t)
    
    % ora è possibile calcorale iTF(t) con t valore scalare a piacere
    return iTF(time);
    
Devi accedere o registrarti per scrivere nel forum
1 risposte