Newsgroup: it.scienza.informatica
Titolo: Funzione di trasferimento

Ciao a tutti, ho un problema.
Devo realizzare un semplice simulatore C++, lo scopo
è simulare un sistema di cui mi è nota la FDT.
Ho a disposizione un simulatore (non scritto da me) che
rende possibile il tutto tramite le matrici di stato, ovvero
segue quest'algoritmo:
(con A=0.9999, B=1, C=-0.00012539, D=1.0999)
    xnpiunoeva=0.9999*xneva+input;
    yneva=-0.00012539*xneva+1.0999*input;
Vorrei invece fare tutto tramite un modello ARMA, quindi
con una semplice formula autoregressiva che mi sembra più
appropriata. Le matrici suddette corrispondono alla seguente
FDT nel discreto:
Y(z)/U(z)=(c1*z+c2)/(c3*z+c4),
con c1=1.0999375,c2=-1.0999375,c3=1,c4=-0.999886.
I coefficienti c1,c2,c3,c4 sono stati calcolati in Matlab tramite il
comando [n,d]=ss2tf(A,B,C,D,1).
Quindi ho scritto il mio bel algoritmo:
 double
c1=1.0999375,c2=-1.0999375,c3=1,c4=-0.999886,x=0,xold=0,y=0,yold=0,a,b,c;
 a = c1/c3;
 b = c2/c3;
 c = -c4/c3;
 for (double i=0;i<800;i+=0.025) {
  xold=x;
  x=input;
  yold=y;
  y=c*yold+a*x+b*xold;
 }
(tempo di campionamento 0.025s)
Il problema che mi si pone, a questo punto, è il seguente: le uscite
dei due algoritmi non sono uguali! Se guardate il plot Matlab che ho messo
a questo link (20 KB) vedete che l'errore dopo 800s è di circa 0.15,
ovvero tutt'altro che trascurabile!
http://digilander.libero.it/asdrubs/Plot2.jpg
La linea rossa si riferisce al calcolo non mio (e presumo corretto)
effettuato
con le matrici di stato, la linea blu è riferita al mio output.
Evidentemente ho commesso un errore, sapete dirmi dove?
Vi ringrazio anticipatamente...
Livio

 Vi ringrazio anticipatamente...
800 secondi con campionamento 0.025 voglion dire 32000 passi. L'errore che
ti risulta alla fine è di circa 0.1, dunque supponendo che si accumuli
omogenamente è di circa 3ppm (parti per milione). Ora, anche prendendo
variabili double, il rumore introdotto dagli arrotondamenti dei fattori
nei due diversi algoritmi è già tale da poter giustificare la differenza
nel risultato. Utilizzando la forma di stato esistono delle configurazione
che minimizzano tale rumore, ma ricorda che vi sarà sempre e non è detto
non sia polarizzato.
Da notare che se il sistema fosse asintoticamente stabile i risultati
dovrebbero comunque convergere; essendo però A praticamente unitario si ha
di fatto una stabilità semplice. Tutto sommato è probabile che la
divergenza sia dovuta al tuo modello ARMA, divenuto un epsilon instabile
nelle conversione.
saluti,
   debrando
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 (tempo di campionamento 0.025s)
Un'altra cosa: non so se fosse un requisito di progetto, ma il tempo di
campionamento e' troppo piccolo per il processo. Da ricordare che al
diminuire dello stesso in generale poli e zeri si avvicinano al cerchio
unitario - in particolare al punto (1,0) - con conseguenti problemi
numerici.


 numerici.
Debrando, ti ringrazio immensamente per la risposta, anzi presto scriverò
un altro topic riguardo ad un altro problema affine... che data la tua
competenza spero mi aiuterai a risolvere ;)
Il tempo di campionamento è un requisito di progetto, mi è stato detto di
attenermi. Per curiosità però... mi dici in base a cosa affermi che è
piccolo?
Nel senso: è piccolo oggettivamente o piccolo in relazione al sistema di
cui parlavamo?

 cui parlavamo?
"Piccolo" in ingegneria è sempre un termine relativo. Nel caso in
particolare lo ritengo tale perchè a fronte di una dinamica con tempi
dell'ordine dei secondi ti ritrovi campionamenti a 50Hz. La frequenza di
campionamento è il parametro più ostico e importante da scegliere passando
ad un progetto discreto, per svariate ragioni tra cui quelle numeriche.
Nel tuo caso potresti valutare di passare a frequenze più basse per
l'algoritmo di controllo, usando i campioni aggiuntivi per realizzare un
filtro digitale. E' comunque solo una indicazione di massima, bisognerebbe
conoscere l'intero problema.
