Professional Documents
Culture Documents
Facoltà di Ingegneria
Dipartimento di Ingegneria Elettrica Elettronica e dei Sistemi
Corso di Laurea Specialistica in Ingegneria dell'Automazione e del Controllo
dei Sistemi Complessi
_______________________________________________________
Docente:
Prof. G.Nunnari
Studenti:
L’Episcopo Gaetano,
Nicolosi Giuseppe,
Privitera Vanessa.
________________________________________________________
2. INDICE “ALICE”
L’indice “ALICE” rappresenta un metodo di valutazione utilizzato per l’analisi dei warning.
Questo metodo provvede alla definizione di una soglia calcolata dinamicamente, quindi non a
priori, ma sulla base delle misurazioni effettuate. Di fatto l’indice “ALICE” evidenzia una
variazione particolarmente rilevante del parametro monitorizzato al tempo t , comparandolo con il
valore medio delle misurazioni effettuate, ma soprattutto tenendo conto della “storia” delle
osservazioni eseguite.
∆T x (t ) − ∆T x (t )
A∆TX (T ) =
σ ∆Tx (t )
Dove ΔTx(t)= | Tx(t)- Tx(t-tc) | rappresenta la differenza in valore assoluto tra la misura
effettuata all’istante corrente t e la misura acquisita all’istante precedente di campionamento (tc ),
mentre <ΔTx(t)> e σΔT(t) rappresentano rispettivamente la media e la deviazione standard di ΔTx(t)
agli istanti precedenti.
I dati della serie temporale sono stati forniti in formato Access, si è resa necessaria quindi una
fase di pre-elaborazione dei dati. All’interno del database non era possibile distinguere le misure
effettuate dai vari sensori (in totale nove) e i relativi istanti di rilevamento. Si è provveduto alla
suddivisione, tramite Query, dei dati disponibili per sensore organizzati in differenti tabelle
Access, convertite in formato Excel adattando la precisione delle misurazioni e generando un file
di testo (codifica ANSI) per ogni sensore per renderne possibile l’elaborazione a mezzo MatLab.
Il codice è suddiviso in diverse funzioni; prevede un’interfaccia grafica per l’inserimento dei
parametri di esecuzione (file di testo da caricare, nome del sensore, ampiezza della finestra
temporale in minuti, ore o giorni, offset iniziale e percentuale di campioni scartate). La finestra
d’inserimento è la seguente:
Come già detto, i dati vengono acquisiti da file di testo e organizzati in fasce temporali; a seconda
se tale fascia è superiore o inferiore a un giorno, vengono richiamate due diverse funzioni:
“alice_giorni” o “alice_min_ore”: nel primo caso si hanno dei gruppi di giorni tra i quali verrà
calcolata la differenza (fra due intervalli consecutivi); nel secondo caso l’intera giornata viene
suddivisa in fasce orarie, e la differenza viene calcolata fra due fasce orarie uguali ma per giorni
consecutivi.
Per ogni fascia temporale viene determinato un valore rappresentativo che sarà nullo se non vi
sono misurazioni, sarà pari al valore dato se esso è l’unico per quella fascia e sarà pari alla media
fra il primo e l’ultimo valore della misurazione se si hanno più rilevazioni.
Ottenuti tali valori è possibile calcolare il valore dell’indice ALICE, come illustrato nella formula
precedentemente commentata, facendo attenzione ad aggiornare ad ogni passo le medie e le
deviazioni standard dell’insieme delle differenze determinate nelle iterazioni precedenti. Inoltre è
prevista, per evitare fluttuazioni dell’indice stesso dovute all’esiguità dei dati, soprattutto nelle
iterazioni iniziali, l’impostazione di una soglia relativa al numero di iterazioni, al di sotto della
quale l’indice non viene calcolato, ma vengono solo aggiornate la media e la deviazione standard;
viceversa viene calcolato anche l’indice tenendo conto anche dei dati al di sotto della soglia. Il
valore di tale soglia è impostabile attraverso la voce “percentuali di valori scartati” del prompt
grafico iniziale.
Calcolato l’indice ALICE (per i dati relativi ai tre riferimenti-nord, est, quota), si procede al
plottaggio grafico degli indici ottenuti, in seguito per evidenziare i movimenti anomali del suolo,
dovuti ad eventuali attività sismico-vulcaniche, si estrapolano dall’insieme degli indici ALICE
ottenuti quelli che costituiscono un’anomalia. L’individuazione della anomalia viene eseguita se si
verifica la seguente relazione:
Dove A∆TX (T ) rappresenta il valore dell’indice ALICE alla data iterazione, mentre 〈 A∆TX 〉 e σ ∆Tx
rappresentano rispettivamente il valore medio e la deviazione standard di tutti gli indici ALICE
relativi alla fascia temporale corrispondente. Dai valori così ottenuti si calcola il valore
percentuale di anomalie presenti per le singole fasce temporali con relativi grafici ad istogramma.
Prescindendo dalla qualità dei dati in ingresso, di cui non si conosce la relativa attendibilità, è
stato comunque possibile osservare una certa efficacia del sistema di warning realizzato. La
caratteristica saliente è costituita dalla possibilità di tenere conto della “storia” delle misurazioni
durante il calcolo dell’indice ALICE, limitando così l’insorgere di errate segnalazioni, dovute ad
esempio alle incertezze delle misurazioni e/o al rumore inevitabilmente presente in tutte le misure.
Si è osservata una progressiva riduzione della media delle percentuali di anomalie rivelate
all’interno di ogni fascia al crescere dell’intervallo di osservazione, come mostra la seguente
tabella, relativa al sensore SDF18:
- Interfaccia_alice.m
clear all
close all
clc
- alice_min_ore.m
function
[dati,numeroCampioniFascia,anomalieNord,anomalieEst,anomalieQuota,percentualeA
nomalie,percentualeMediaAnomalie]=alice_min_ore(target,datiCaricati,passoMinut
i,offset,percentuale)
%% Dati in ingresso
% target=Nome del sensore
% datiCaricati=dati letti dal file di testo e passati allo script. Il file
dev'essere strutturato in 8 colonne: la 1a: misure nord, la 2a: misure est, la
3a: misure quota, la 4a: giorno dell'acquisizione, la 5a: mese
dell'acquisizione, la 6a: anno dell'acquisizione, la 7a: ora
dell'acquisizione, la 8a: minuto dell'acquisizione
% passoMinuti=ampiezza dellintervallo temporale espresso in minuti
% offset=Parametro per eliminare eventuali misure iniziali affette da rumore
% percentuale=numero in percentuale dei dati iniziali su cui non calcolare
l'indice ALICE
%% Dati in uscita
% dati=dati caricati in memoria
% numeroCampioniFascia=numero di campioni contati per fascia oraria
% anomalieNord=anomalie rilevate nei dati del Nord
% anomalieEst=anomalie rilevate nei dati dell'Est
% anomalieQuota=anomalie rilevate nei dati della Quota
% percentualeAnomalie=percentale di anomalie rilevate per fascia oraria e per
Nord, Est e Quota
% percentualeMediaAnomalie=media delle percentali di anomalie rilevate nelle
varie fascie orarie per Nord, Est e Quota
for j=1:1:ncfcol % calcolo della media dei campioni di misura per fascia
y=1; % indice di lettura dalla matrice dati
for ind=1:1:ncfrig
x=numeroCampioniFascia(ind,j); % Calcolo del numero di misure per
fascia oraria
if(x==0) % Se non ci sono misure in una fascia, la media è posta a
zero
mediaNord(ind,j)=0;
mediaEst(ind,j)=0;
mediaQuota(ind,j)=0;
end
if((x==1)&&(y<=rigDati)) % Se c'è una sola misura in una fascia, la
media è pari a quel campione
mediaNord(ind,j)=datiNord(y,j);
mediaEst(ind,j)=datiEst(y,j);
mediaQuota(ind,j)=datiQuota(y,j);
y=y+x; % aggiornamento dell'indice di lettura dalla matrice dati
end
if((x>1)&&(y<=rigDati)) % Se ci sono 2 o più misure in una fascia, la
media è pari alla media fra il primo e l'ultimo campione della fascia
mediaNord(ind,j)=(datiNord(y+x-1,j)-datiNord(y,j))/2;
mediaEst(ind,j)=(datiEst(y+x-1,j)-datiEst(y,j))/2;
mediaQuota(ind,j)=(datiQuota(y+x-1,j)-datiQuota(y,j))/2;
y=y+x; % aggiornamento dell'indice di lettura dalla matrice dati
end
end
end
ALICENord(r-sogliaPlot+1,1)=(distNord(r)-
distMediaNord(r))/sigmaMediaNord(r); % Calcolo effettivo dell'indice ALICE per
il Nord
ALICEEst(r-sogliaPlot+1,1)=(distEst(r)-
distMediaEst(r))/sigmaMediaEst(r); % Calcolo effettivo dell'indice ALICE
per l'Est
ALICEQuota(r-sogliaPlot+1,1)=(distQuota(r)-
distMediaQuota(r))/sigmaMediaQuota(r); % Calcolo effettivo dell'indice ALICE
per la Quota
end
end
%% Calcolo della media e della deviazione standard degli indici ALICE
mediaALICENord(c)=mean(ALICENord(:,1),1);
mediaALICEEst(c)=mean(ALICEEst(:,1),1);
mediaALICEQuota(c)=mean(ALICEQuota(:,1),1);
stdALICENord(c)=std(ALICENord(:,1),1);
stdALICEEst(c)=std(ALICEEst(:,1),1);
stdALICEQuota(c)=std(ALICEQuota(:,1),1);
%% Verifica delle anomalie
anomalieFasciaN=0; % Numero di anomalie per fascia oraria - Nord
(inizializzazione)
anomalieFasciaE=0; % Numero di anomalie per fascia oraria - Est
(inizializzazione)
anomalieFasciaQ=0; % Numero di anomalie per fascia oraria - Quota
(inizializzazione)
for r=1:1:length(ALICENord) % Ciclo sulle colonne dell'indice Alice
calcolato
if((ALICENord(r))>(mediaALICENord(c)+2*stdALICENord(c)))||
((ALICENord(r))<(mediaALICENord(c)-2*stdALICENord(c))) % Verifica delle
anomalie per il Nord
% Assemblaggio della matrice delle anomalie per il Nord
anomalieNord(indexN,1)=G(sogliaPlot+r-1); % Prima colonna=Codice
del giorno dell'anomalia
anomalieNord(indexN,2)=c; % Seconda Colonna=Codice della fascia
oraria dell'anomalia
indexN=indexN+1;
anomalieFasciaN=anomalieFasciaN+1;
end
if((ALICEEst(r))>(mediaALICEEst(c)+2*stdALICEEst(c)))||
((ALICEEst(r))<(mediaALICEEst(c)-2*stdALICEEst(c))) % Verifica delle anomalie
per l'Est
% Assemblaggio della matrice delle anomalie per l'Est
anomalieEst(indexE,1)=G(sogliaPlot+r-1); % Prima colonna=Codice
del giorno dell'anomalia
anomalieEst(indexE,2)=c; % Seconda Colonna=Codice della fascia
oraria dell'anomalia
indexE=indexE+1;
anomalieFasciaE=anomalieFasciaE+1;
end
if((ALICEQuota(r))>(mediaALICEQuota(c)+2*stdALICEQuota(c)))||
((ALICEQuota(r))<(mediaALICEQuota(c)-2*stdALICEQuota(c))) % Verifica delle
anomalie per la Quota
% Assemblaggio della matrice delle anomalie per la Quota
anomalieQuota(indexQ,1)=G(sogliaPlot+r-1); % Prima colonna=Codice
del giorno dell'anomalia
anomalieQuota(indexQ,2)=c; % Seconda Colonna=Codice della fascia
oraria dell'anomalia
indexQ=indexQ+1;
anomalieFasciaQ=anomalieFasciaQ+1;
end
end
%% Calcolo la percentuale delle anomalie e assemblaggio della matrice
(percentualeAnomalie)
percentualeAnomalie(c,1)=c; % Prima colonna=codice di fascia
percentualeAnomalie(c,2)=(100*anomalieFasciaN)/length(ALICENord); % Seconda
colonna=Percentuale Anomalie Nord
percentualeAnomalie(c,3)=(100*anomalieFasciaE)/length(ALICEEst); % Terza
colonna=Percentuale Anomalie Est
percentualeAnomalie(c,4)=(100*anomalieFasciaQ)/length(ALICEQuota); % Quarta
colonna=Percentuale Anomalie Quota
%% Plot delle percentuali di anomalie rilevate nelle varie fasce orarie sul
totale di misurazioni (Istogrammi)
% Set delle stringhe da utilizzare nelle figure
titolo2='Percentuale anomalie su totale misurazioni vs fasce orarie'; % Titolo
generico per tutti gli istogrammi
subtitoloN=' - Dati Nord'; % Sottotitolo per il Nord
subtitoloE=' - Dati Est'; % Sottotitolo per l'Est
subtitoloQ=' - Dati Quota'; % Sottotitolo per la Quota
asseX='Fasce orarie [codice progressivo]'; % Nome per l'etichetta dell'asse
delle x
asseY='Percentuale anomalie su totale misurazioni [%]'; % Nome per l'etichetta
dell'asse delle y
anomalie='anomalie'; % Stringa utile per il nome del file da salvare
%% Dati in ingresso
% target=Nome del sensore
% datiCaricati=dati letti dal file di testo e passati allo script. Il file
dev'essere strutturato in 8 colonne: la 1a: misure nord, la 2a: misure est, la
3a: misure quota, la 4a: giorno dell'acquisizione, la 5a: mese
dell'acquisizione, la 6a: anno dell'acquisizione, la 7a: ora
dell'acquisizione, la 8a: minuto dell'acquisizione
% passoMinuti=ampiezza dellintervallo temporale espresso in minuti
% offset=Parametro per eliminare eventuali misure iniziali affette da rumore
% percentuale=numero in percentuale dei dati iniziali su cui non calcolare
l'indice ALICE
%% Dati in uscita
% dati=dati caricati in memoria
% percentualeAnomalie=percentale di anomalie rilevate per Nord, Est e Quota
end
end
if((x==1)) % Se c'è una sola misura in una fascia, la media è pari a
quel campione
mediaNord(j)=datiNord(1,j);
mediaEst(j)=datiEst(1,j);
mediaQuota(j)=datiQuota(1,j);
end
if((x>1)) % Se ci sono 2 o più misure in una fascia, la media è pari
alla media fra il primo e l'ultimo campione della fascia
mediaNord(j)=(datiNord(x,j)-datiNord(1,j))/2;
mediaEst(j)=(datiEst(x,j)-datiEst(1,j))/2;
mediaQuota(j)=(datiQuota(x,j)-datiQuota(1,j))/2;
end
end
ALICENord(r-sogliaPlot+1,1)=(distNord(r)-
distMediaNord(r))/sigmaMediaNord(r); % Calcolo effettivo dell'indice ALICE per
il Nord
ALICEEst(r-sogliaPlot+1,1)=(distEst(r)-
distMediaEst(r))/sigmaMediaEst(r); % Calcolo effettivo dell'indice ALICE per
l'Est
ALICEQuota(r-sogliaPlot+1,1)=(distQuota(r)-
distMediaQuota(r))/sigmaMediaQuota(r); % Calcolo effettivo dell'indice ALICE
per la Quota
end
end
%% Calcolo della media e della deviazione standard degli indici ALICE
mediaALICENord=mean(ALICENord(:,1),1);
mediaALICEEst=mean(ALICEEst(:,1),1);
mediaALICEQuota=mean(ALICEQuota(:,1),1);
stdALICENord=std(ALICENord(:,1),1);
stdALICEEst=std(ALICEEst(:,1),1);
stdALICEQuota=std(ALICEQuota(:,1),1);
%% Verifica delle anomalie
anomalieFasciaN=0; % Numero di anomalie per fascia - Nord
(inizializzazione)
anomalieFasciaE=0; % Numero di anomalie per fascia - Est (inizializzazione)
anomalieFasciaQ=0; % Numero di anomalie per fascia - Quota
(inizializzazione)
for(r=1:1:length(ALICENord)) % Ciclo sulle colonne dell'indice Alice
calcolato
if((ALICENord(r))>(mediaALICENord+2*stdALICENord))||
((ALICENord(r))<(mediaALICENord-2*stdALICENord)) % Verifica delle anomalie per
il Nord
% Assemblaggio della matrice delle anomalie per il Nord
anomalieNord(indexN,1)=G(sogliaPlot+r-1);
indexN=indexN+1;
anomalieFasciaN=anomalieFasciaN+1;
end
if((ALICEEst(r))>(mediaALICEEst+2*stdALICEEst))||
((ALICEEst(r))<(mediaALICEEst-2*stdALICEEst)) % Verifica delle anomalie per
l'Est
% Assemblaggio della matrice delle anomalie per l'Est
anomalieEst(indexE,1)=G(sogliaPlot+r-1);
indexE=indexE+1;
anomalieFasciaE=anomalieFasciaE+1;
end
if((ALICEQuota(r))>(mediaALICEQuota+2*stdALICEQuota))||
((ALICEQuota(r))<(mediaALICEQuota-2*stdALICEQuota))
anomalieQuota(indexQ,1)=G(sogliaPlot+r-1);
indexQ=indexQ+1;
anomalieFasciaQ=anomalieFasciaQ+1;
end
%% Calcolo la percentuale delle anomalie e assemblaggio della matrice
(percentualeAnomalie)
percentualeAnomalie(1)=(100*anomalieFasciaN)/length(ALICENord); % Prima
colonna=Percentuale Anomalie Nord
percentualeAnomalie(2)=(100*anomalieFasciaE)/length(ALICEEst); % Seconda
colonna=Percentuale Anomalie Est
percentualeAnomalie(3)=(100*anomalieFasciaQ)/length(ALICEQuota); % Terza
colonna=Percentuale Anomalie Quota
end
close all;
%% Plot dell'istogramma della percentuale delle anomalie
figure(1) % Figura 1=Percentuale delle anomalie vs intervalli orari per il
Nord
box on; % Abilitazione del box sul grafico
zoom on; % Abilitazione dello zoom sul grafico
bar(percentualeAnomalie); % Istogramma delle percentuali di anomalie vs dati
xlim([0 4]); % Set dell'intervallo sull'asse x
xlabel('Nord - Est - Quota'); % Set del nome sull'asse x
ylabel('Percentuale anomalie su totale misurazioni [%]'); % Set del nome
sull'asse y
tit=strcat(target,' - ','Percentuale anomalie su totale misurazioni vs Dati');
% Uso della concatenazione di stringhe per costruire il titolo del grafico
title(tit); % Set del titolo del grafico
set(gca,'FontSize',11); % Set della dimensione dei caratteri della figura
file=strcat(target,'_','percentuale-anomalie',ampiezzaFascia,'g'); % Uso della
concatenazione di stringhe per costruire il nome del file per il grafico da
salvare
print('-dpng',file); % Salvataggio della figura su file .png col nome
costruito nell'istruzione precedente
close all