Valore di riferimento e filtraggio, problema numerico?

Strumenti informatici per la matematica applicata, le simulazioni, il disegno: Mathcad, Matlab, Scilab, Microcap, PSpice, AutoCad ...

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
Messaggi: 5427
Iscritto il: 29 gen 2014, 7:54
0
voti

[1] Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteEcoTan » 5 ott 2021, 10:34

Mi capita una cosa incredibile, sicuramente sto sbagliando qualcosa ma non capisco cosa.
Ho un accelerometro, con l'asse x orizzontale, usato come inclinometro, facente parte di un modellino funzionante di robot ciclista.
Esso invia la sua lettura in formato Integer con segno a 16 bit a una variabile ax, alla velocità dettata dal protocollo I2C cioè probabilmente poche volte ogni millisecondo ma ciò non dovrebbe influire.
Il Main Program, all'accensione, prende una decina di letture ax a breve intervallo di tempo e ne memorizza la media in una variabile Floating axrf. Questa rappresenta la lettura di riferimento, teoricamente sarebbe zero ed avrà comunque un valore piccolo. Infatti l'accensione deve avvenire con la bici ferma in posizione di equilibrio.
Espletata questa funzione, il main program elabora ax ogni 0,4 msec (forse è un ciclo troppo breve ma dobbiamo considerare che il modellino è piccolo e leggero).
Detta elaborazione prevede per prima cosa che ax venga filtrata con una costante di tempo pari a 0,4 sec e qui avviene il mistero.
Il programma originale filtra prima ax e poi sottrae il valore di riferimento axrf dal valore filtrato, infine moltiplica per un modesto guadagno di 1.25. In tal modo il modellino funziona (con qualche pendolazione ma questo è un altro discorso).
Per ripulire il programma ho provato a sottrarre invece ogni volta axrf dal valore ax e poi filtrare, ma così la bici inesorabilmente cade.
Non è un problema di casting o di confusione fra formati integer e floating in quanto il compilatore C effettua automaticamente le conversioni e poi mi sono accertato che, facendo le conversioni a parte, non cambia nulla.
La versione originale è questa:

int ax; float axf, axrf, out;
filter://ogni 0,4 msec
axf=ax*.001+axf*.999;
out=(axf-axrf)*1.25;

La versione modificata è questa:

int ax; float axf, axrf, out, prova;
filter://ogni 0,4 msec
prova=ax-axrf;
axf=prova*.001+axf*.999;
out=axf*1.25;

Che possa crearsi un problema numerico non lo vedo, e poi sarebbe una notizia alquanto preoccupante per chi programma dei calcoli tecnici.

Avatar utente
Foto UtenteMarcoD
12,2k 5 9 13
Master EY
Master EY
Messaggi: 6696
Iscritto il: 9 lug 2015, 16:58
Località: Torino
0
voti

[2] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteMarcoD » 5 ott 2021, 11:31

Non saprei individuare l'errore di troncamento.
Posso suggerire solo qualche punto di indagine:

Se riformuli come axf=(prova-axf)*.001+axf; cambia qualcosa?

Campionare ogni 0,4 ms per realizzare una costante di 0,4 secondi richiede dividere l'errore per 1000, forse si crea un errore di troncamento.
Nyquist richiede di campionare ad almeno il doppio, ma non 1000 volte tanto.

Eseguire i calcoli una volta ogni 10 e dividere poi solo per 100 ?
O_/

Ho meditato: è un errore di troncamento.
Anche i numeri in floating point hanno una risoluzione limitata.
Nella versione modificata l'errore è maggiore:
Supponi
axrf = 100
e il valore di ax variabile prossimo a 110, lo filtri con costante di tempo e otterrai
supponiamo 110
poi sottrai 100, ottieni 10.

Nella versione modificata ottieni:
prova=ax-axrf = 110 - 100 = 10
filtrando, per errore di troncamento su un valore di 10 avrai zero

Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
Messaggi: 5427
Iscritto il: 29 gen 2014, 7:54
0
voti

[3] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteEcoTan » 5 ott 2021, 12:54

MarcoD ha scritto:Se riformuli come axf=(prova-axf)*.001+axf; cambia qualcosa?

Non cambia.
Ho anche pensato che il valore iniziale di axf potrebbe avere un ruolo quindi ho provato ad inizializzarlo sia axf=0 che axf=axrf ma non pare che cambi nulla, e anche questo è un po' strano perché dovrebbe invece influire sul transitorio iniziale del filtro.
La situazione poi è complicata ma spero di avere isolato correttamente il problema.

Avatar utente
Foto UtenteGioArca67
4.585 4 6 9
Master EY
Master EY
Messaggi: 4595
Iscritto il: 12 mar 2021, 8:36
0
voti

[4] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteGioArca67 » 5 ott 2021, 15:37

Hai cambiato di un fattore 1000 il peso di axrf

Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
Messaggi: 5427
Iscritto il: 29 gen 2014, 7:54
0
voti

[5] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteEcoTan » 5 ott 2021, 18:10

MarcoD ha scritto: è un errore di troncamento

Accetto questa spiegazione per esclusione, forse potrei dire per disperazione, ma non è che mi convinca del tutto.
(Poi ci sono altre stranezze in quanto il programma originale filtrava anche la lettura di un giroscopio con la stessa costante di tempo e poi miscelava le uscite dei due filtri, adesso ho pensato di miscelare prima e poi filtrare per risparmiare due moltiplicazioni floating, ma anche questo non funziona bene.
Il programma originale lo ho fatto io andando in cerca soltanto della massima garanzia di funzionamento, adesso che vorrei razionalizzarlo e magari ottenere un risultato ancora migliore sono tornato in alto mare.)

Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
Messaggi: 5427
Iscritto il: 29 gen 2014, 7:54
0
voti

[6] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteEcoTan » 8 ott 2021, 20:18

EcoTan ha scritto:ho pensato di miscelare prima e poi filtrare per risparmiare due moltiplicazioni floating, ma anche questo non funziona bene

Dopo centinaia di prove ho sistemato il modellino e mi sono convinto di quanto segue:
In un calcolo iterativo con diversi loop di regolazione annidati e nodi sommatori anche in cascata fra loro, può avvenire che alcune variabili lentamente divergano mentre il sistema apparentemente continua a funzionare perché altre variabili creano una compensazione, divergendo anch'esse, finché qualcosa va in overflow o in saturazione e il sistema salta. Questo inconveniente ha delle cause un po' misteriose ma non dovrebbe crearsi, credo, se ciascuna parte dell'algoritmo simula correttamente qualcosa di fisicamente reale.
Mi rendo conto che il mio discorso è un po' vago, ma in sostanza è ciò che mi è capitato.

Avatar utente
Foto UtenteGioArca67
4.585 4 6 9
Master EY
Master EY
Messaggi: 4595
Iscritto il: 12 mar 2021, 8:36
0
voti

[7] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteGioArca67 » 8 ott 2021, 20:30

Mi sembra un po' singolare. Se fosse così anche la versione precedente fallirebbe.
Stai usando 2 formule diverse, il risultato non può essere che diverso.

Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
Messaggi: 5427
Iscritto il: 29 gen 2014, 7:54
0
voti

[8] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteEcoTan » 8 ott 2021, 21:13

Il punto è che due calcoli, che dal punto di vista algebrico sarebbero equivalenti, dopo migliaia di iterazioni creano un comportamento diverso. La cosa viene esasperata nel caso della bici perché lì la differenza si rende evidente, o cade o non cade. Non è che sono troppo sicuro ma intanto mi soddisfa.

Avatar utente
Foto UtenteGioArca67
4.585 4 6 9
Master EY
Master EY
Messaggi: 4595
Iscritto il: 12 mar 2021, 8:36
0
voti

[9] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteGioArca67 » 8 ott 2021, 21:18

I due calcoli che fai non sono equivalenti

Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
Messaggi: 5427
Iscritto il: 29 gen 2014, 7:54
0
voti

[10] Re: Valore di riferimento e filtraggio, problema numerico?

Messaggioda Foto UtenteEcoTan » 8 ott 2021, 21:42

Hai considerato che prima di entrare nel loop filter: possiamo impostare inizialmente axf=axrf ?
Comunque la questione del primo post è superata dagli sviluppi seguenti, che non ho esposto in dettaglio.


Torna a “Programmi applicativi: simulatori, CAD ed altro”