Appendice A:
Schemi Labview
In questa appendice sono mostrati gli schemi dei programmi Labview utilizzati per
l’acquisizione del segnale e per generare il segnale N-samples-constant.
Programma per la generazione del segnale N-samples-constant e l’immagazzinamento
nella memoria del generatore di funzioni LeCroy LC9100.
Nelle figure seguenti sono mostrati rispettivamente:
•
Diagramma a blocchi del programma per il calcolo della portata media,
l’acquisizione dei segnali ed il salvataggio dei dati.
•
Parte del diagramma dedicata al calcolo della portata media.
•Front Panel del programma di acquisizione dati
Appendice B:
Calcolo della portata media
La procedura per il calcolo della portata media mediante flangia tarata con prese di
pressione sugli spigoli è tratto da [7].
La relazione per il calcolo della portata volumetrica è:
2 2 22
2
4
4
d
Qm
= ⋅ ⋅
α ε
π
⋅
⋅
⋅ ⋅∆ = ⋅ ⋅ ⋅
ρ
P
α ε
π
β
⋅
D
⋅ ⋅∆
ρ
P
dove:
41
C
α
β
=
−
Coefficiente di portata del dispositivo di strozzamento
1.75 6 2.1 8 2.5
10
0.5959 0.0312
0.184
0.0029
Re
DC
=
+
⋅
β
−
⋅
β
+
⋅
β
⋅
(
4)
1 0.41 0.35
P
K P
ε
= −
+
⋅
β
⋅
∆
⋅
Coefficiente di comprimibilità del fluido
D
Diametro condotto
d
Diametro flangia
D
d
=
β
Rapporto tra i diametri di flangia e condotto
ρ Densità del fluido
P
Pressione a monte della flangia
∆P Differenza di pressione misurata ai capi della flangia
ReD
Numero di Reynolds calcolato in base al diametro del condotto D
Poiché il coefficiente di portata
α dipende dal numero di Reynolds Re
D, che è funzione
della portata stessa, per il calcolo della portata è necessario effettuare un ciclo
iterativo.
Il calcolo di P,
∆P e T (necessario per il calcolo di ñ) ed il calcolo della portata sono
Appendice C:
Dimensionamento del volume di separazione
Alla frequenza di 100 Hz, l’ errore percentuale massimo nella misura della portata
media, per portata di 5.4 gr/s, si calcola dalle relazioni:
γ
= 1.41 Rapporto dei calori specifici per l’aria
0a
= 1 Coefficiente dipendente da
maxminQv
Qv
V = 2120 cm
3Volume totale camera di smorzamento e tubazione tra sorgente
pulsante e flangia tarata
f = 100 Hz Frequenza di pulsazione
Qm
= 5.4 gr/s Portata media in massa
p
∆
= 14 mbar Pressione differenziale media
P = 2.249· 10
5Pa Pressione assoluta a monte della flangia
ñ = 2.67 kg/m
3Densità
Qm
Qv
ρ
=
= 2.03· 10
-3m
3/s Portata volumetrica media
0
V f
p
H
Qv P
⋅ ⋅∆
=
⋅
=0.671 Numero di Hodgson:
0 00.4 a
H
γ
ϕ
=
⋅
= 0.707 Errore percentuale nella misura della portata
L’errore percentuale diminuisce all’aumentare della portata; al variare della pressione
di ingresso si ottiene:
P
∆
p
ö
1250· mbar
4 mbar
1.441
2250 mbar
14 mbar
0.707
Appendice D:
Trasformata di Fourier
Per identificare le componenti in frequenza del segnale, è stata utilizzata la trasformata
di Fourier. Di seguito, sono riportate alcune nozioni al riguardo.
Sia x(t) una funzione periodica di periodo T, tale da soddisfare la relazione:
x(t) = x(t + kT) k = 1, 2, 3, ...
La x(t) può essere espressa come somma di un numero infinito di funzioni sinusoidali;
tale forma è detta serie di Fourier:
(
)
(
)
0 1( )
cos 2
sin 2
2
k k k k ka
x t
∞a
π
f t
b
π
f t
==
+
∑
⋅
⋅ ⋅ + ⋅
⋅ ⋅
dove:
∫
=
Tx
t
dt
T
a
0 0(
)
2
(
)
02
( ) cos 2
T k ka
x t
f t dt
T
π
=
∫
⋅
⋅ ⋅
k = 0, 1, 2, ...
(
)
02
( ) sin 2
T k kb
x t
f t dt
T
π
=
∫
⋅
⋅ ⋅
k = 1, 2, 3, ...
kk
f
T
=
k = 1, 2, 3, ...
La trasformata di Fourier X(f) di una generica funzione x(t) è data da:
2
( )
( )
j f tX f
+∞x t e
− ⋅ ⋅ ⋅πdt
−∞
=
∫
⋅
-
∞ < f < ∞
Se è noto X(f), x(t) può essere ricavato dall’ antitrasformata di Fourier:
2
( )
( )
j f tx t
+∞X f e
⋅ ⋅ ⋅πdf
−∞
=
∫
⋅
-
∞ < t < ∞
∫
+∞ ∞ −∞
<
dt
t
x
(
)
2Sia x(t) una funzione di tipo random e x
T(t) una funzione random troncata perchédefinita non nulla solo nell’intervallo di tempo 2T. Poiché per quest’ultima è verificata
la condizione precedente, esiste l’integrale di Fourier di x
T(t):∫
+∞ ∞ −⋅
⋅
=
ω
ω
π
X
e
ωd
t
x
j t T T2
(
)
1
)
(
con:
∫
+∞ ∞ − −⋅
=
x
t
e
dt
X
j t T(
ω
)
(
)
ωDal teorema di Parseval:
ω
ω
d
X
dt
t
x
dt
t
x
T T T T T∫
∫
∫
+− +∞−∞ +∞ ∞ −=
=
2 2 2(
)
(
)
(
)
∫
∫
+∞ ∞ − ∞ → ∞ + ∞ − ∞ →
⋅
=
=
=
ω
ω
ω
d
ω
T
X
d
X
T
t
x
t
x
T T T T2
)
(
lim
)
(
2
1
lim
)
(
)
(
2 2 2 2Si definisce la densità spettrale di potenza di x(t):
=
∞ →T
X
p
T T2
)
(
lim
)
(
2ω
ω
Si ottiene quindi:
∫
+∞ ∞ −=
p
ω d
ω
x
2(
)
Il prodotto p(ω)dω è il contributo al valore quadratico medio delle componenti aventi
frequenze comprese tra ω e ω+dω ; il valore quadratico medio rappresenta l’ene rgia
del segnale.
Appendice E:
Procedure di calcolo in linguaggio Matlab
Ugello
%=====================================================================================% % Questo programma disegna il grafico delle velocità media, massima, minima % % e oscillante in vari punti dello sbocco dell'aria in forma di % % - andamento in funzione della distanza % % - vettori % % - campo di velocità % %=====================================================================================%
clc,clear all,close all, format compact, %=====================================================================================% % Caricamento dati %=====================================================================================% load dati_ugello_125Hz4.mat %=====================================================================================% % Creazione delle matrici
%=====================================================================================%
x=[0,1,5,10,20,40,70,110]
y=[-15,-12,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,3,4,5,6,9]
disp(' ') disp(' ')
disp('Matrice del vettore velocità media nei vari punti') disp(' ') linea0v = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 v0 0 0 0 0 0 0 0 0 0]; linea1v = [0 0 0 0 0 0 0 0 0 0 0 v1_1e5s,v1_1s,v1_05s,v1,v1_05d,v1_1d,v1_1e5d 0 0 0 0 0 0]; linea5v = [0 0 0 0 0 0 0 0 0 0 v5_2s 0 v5_1s,v5_05s,v5,v5_05d,v5_1d 0 v5_2d 0 0 0 0 0]; linea10v = [0 0 0 0 0 0 0 0 0 v10_3s,v10_2s 0 v10_1s,v10_05s,v10 v10_05d,v10_1d 0 v10_2d,v10_3d 0 0 0 0]; linea20v = [0 0 0 0 0 0 0 0 v20_4s,v20_3s,v20_2s 0 v20_1s,v20_05s,v20,v20_05d,v20_1d 0 v20_2d,v20_3d,v20_4d 0 0 0]; linea40v = [0 0 0 0 0 v40_7s v40_6s v40_5s v40_4s v40_3s v40_2s 0 v40_1s 0 v40 0 v40_1d 0 v40_2d v40_3d v40_4d v40_5d 0 0]; linea70v = [0 0 v70_10s 0 v70_8s 0 v70_6s 0 v70_4s 0 v70_2s 0 v70_1s 0 v70 0 v70_1d 0 v70_2d 0 v70_4d 0 v70_6d 0]; linea110v = [v110_15s v110_12s 0 v110_9s 0 0 v110_6s 0 0 v110_3s 0 0 0 0 v110 0 0 0 0 v110_3d 0 0 v110_6d v110_9d]; Vx = [linea0v;linea1v;linea5v;linea10v;linea20v;linea40v;linea70v;linea110v]; %=====================================================================================% % Tabella riassuntiva %=====================================================================================% tabella = [[NaN;x'],[y;Vx]]; results = [num2str(tabella)]; disp(results) disp(' ')
disp(['Velocità media in x=0 = ',num2str(v0),' m/s']) disp(' ')
%=====================================================================================% % GRAFICO DELLA VELOCITA' PER RIGHE
%=====================================================================================% % ciascuna riga rappresenta una diversa distanza dall'ugello
%=====================================================================================% % Velocità media
y0=[0];
linea0v = [v0];
y1=[-1.5 -1 -0.5 0 0.5 1 1.5];
linea1v = [v1_1e5s v1_1s v1_05s v1 v1_05d v1_1d v1_1e5d]; y5=[-2 -1 -0.5 0 0.5 1 2]; linea5v = [v5_2s v5_1s v5_05s v5 v5_05d v5_1d v5_2d]; y10=[-3 -2 -1 -0.5 0 0.5 1 2 3]; linea10v = [v10_3s v10_2s v10_1s v10_05s v10 v10_05d v10_1d v10_2d v10_3d]; y20=[-4 -3 -2 -1 -0.5 0 0.5 1 2 3 4]; linea20v = [v20_4s v20_3s v20_2s v20_1s v20_05s v20 v20_05d v20_1d v20_2d v20_3d v20_4d]; y40=[-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5]; linea40v = [v40_7s v40_6s v40_5s v40_4s v40_3s v40_2s v40_1s v40 v40_1d v40_2d v40_3d v40_4d v40_5d]; y70=[-10 -8 -6 -4 -2 -1 0 1 2 4 6]; linea70v = [v70_10s v70_8s v70_6s v70_4s v70_2s v70_1s v70 v70_1d v70_2d v70_4d v70_6d]; y110=[-15 -12 -9 -6 -3 0 3 6 9]; linea110v = [v110_15s v110_12s v110_9s v110_6s v110_3s v110 v110_3d v110_6d v110_9d]; figure
plot(y0,linea0v,'-*',y1,linea1v,'-*',y5,linea5v,'-*',y10,linea10v,'-*',y20,linea20v, '-*',y40,linea40v,'-*',y70,linea70v,'-*',y110,linea110v,'-*')
legend('x = 0 mm','x = 1 mm','x = 5 mm','x = 10 mm','x = 20 mm','x = 40 mm','x = 70 mm','x = 110 mm',2)
title('Velocità media per f = 125 Hz') xlabel('Distanza dall''asse [mm]') ylabel('Velocità [m/s]')
ylim([0 80]) grid
% print V_media_125 -f1 -depsc2 -tiff
%=====================================================================================% % Velocità massima
%=====================================================================================%
linea0vmax = [vmax0];
linea1vmax = [vmax1_1e5s vmax1_1s vmax1_05s vmax1 vmax1_05d vmax1_1d vmax1_1e5d]; linea5vmax = [vmax5_2s vmax5_1s vmax5_05s vmax5 vmax5_05d vmax5_1d vmax5_2d]; linea10vmax = [vmax10_3s vmax10_2s vmax10_1s vmax10_05s vmax10 vmax10_05d vmax10_1d
vmax10_2d vmax10_3d];
linea20vmax = [vmax20_4s vmax20_3s vmax20_2s vmax20_1s vmax20_05s vmax20 vmax20_05d vmax20_1d vmax20_2d vmax20_3d vmax20_4d];
linea40vmax = [vmax40_7s vmax40_6s vmax40_5s vmax40_4s vmax40_3s vmax40_2s vmax40_1s vmax40 vmax40_1d vmax40_2d vmax40_3d vmax40_4d vmax40_5d];
linea70vmax = [vmax70_10s vmax70_8s vmax70_6s vmax70_4s vmax70_2s vmax70_1s vmax70 vmax70_1d vmax70_2d vmax70_4d vmax70_6d];
linea110vmax = [vmax110_15s vmax110_12s vmax110_9s vmax110_6s vmax110_3s vmax110 vmax110_3d vmax110_6d vmax110_9d];
figure
plot(y0,linea0vmax,'-*',y1,linea1vmax,'-*',y5,linea5vmax,'-*',y10,linea10vmax, '-*',y20,linea20vmax,'-*',y40,linea40vmax,'-*',y70,linea70vmax,
'-*',y110,linea110vmax,'-*')
legend('x = 0 mm','x = 1 mm','x = 5 mm','x = 10 mm','x = 20 mm','x = 40 mm','x = 70 mm','x = 110 mm',2)
title('Velocità massima per f = 125 Hz') xlabel('Distanza dall''asse [mm]')
ylabel('Velocità [m/s]') ylim([0 80])
grid
% print V_massima_125 -f2 -depsc2 -tiff
%=====================================================================================% % Velocità minima
%=====================================================================================%
linea0vmin = [vmin0];
linea1vmin = [vmin1_1e5s vmin1_1s vmin1_05s vmin1 vmin1_05d vmin1_1d vmin1_1e5d]; linea5vmin = [vmin5_2s vmin5_1s vmin5_05s vmin5 vmin5_05d vmin5_1d vmin5_2d]; linea10vmin = [vmin10_3s vmin10_2s vmin10_1s vmin10_05s vmin10 vmin10_05d vmin10_1d
vmin10_2d vmin10_3d];
linea20vmin = [vmin20_4s vmin20_3s vmin20_2s vmin20_1s vmin20_05s vmin20 vmin20_05d vmin20_1d vmin20_2d vmin20_3d vmin20_4d];
linea40vmin = [vmin40_7s vmin40_6s vmin40_5s vmin40_4s vmin40_3s vmin40_2s vmin40_1s vmin40 vmin40_1d vmin40_2d vmin40_3d vmin40_4d vmin40_5d];
linea70vmin = [vmin70_10s vmin70_8s vmin70_6s vmin70_4s vmin70_2s vmin70_1s vmin70 vmin70_1d vmin70_2d vmin70_4d vmin70_6d];
linea110vmin = [vmin110_15s vmin110_12s vmin110_9s vmin110_6s vmin110_3s vmin110 vmin110_3d vmin110_6d vmin110_9d];
figure
plot(y0,linea0vmin,'-*',y1,linea1vmin,'-*',y5,linea5vmin,'-*',y10,linea10vmin, '-*',y20,linea20vmin,'-*',y40,linea40vmin,'-*',y70,linea70vmin,
'-*',y110,linea110vmin,'-*')
legend('x = 0 mm','x = 1 mm','x = 5 mm','x = 10 mm','x = 20 mm','x = 40 mm','x = 70 mm','x = 110 mm',2)
title('Velocità minima per f = 125 Hz') xlabel('Distanza dall''asse [mm]')
ylabel('Velocità [m/s]') ylim([0 80])
grid
% print V_minima_125 -f3 -depsc2 -tiff
%=====================================================================================% % GRAFICI DELLA VELOCITA' MEDIANTE VETTORI
%=====================================================================================%
[X,Y] = meshgrid(y,x);
Vy = zeros(8,24); % la componente radiale della velocità non viene misurata
figure
quiver(X,Y,Vy,Vx,0.2) % disegna i vettori %axis ([-35 35 -2 70 -12 12])
view(90,90)
%view(0,90)
% Disegno dell'ugello
% La superficie è inclinata di 15° rispetto all'asse del foro
hold on a3 = [-1.35,1.35]; b3 = [-1.35*sin(pi/12),1.35*sin(pi/12)]; line(a3,b3,'color','k') a4 = [-1.35,-1.35,-5,-5]; b4 = [-2,-1.35*sin(pi/12),-5*sin(pi/12),-2]; fill(a4,b4,[0.8 1 0.8]) a5 = [1.35,1.35,5,5]; b5 = [-2,1.35*sin(pi/12),5*sin(pi/12),-2]; fill(a5,b5,[0.8 1 0.8]) axis square
title('Velocità media') hold off
%print V_ugello_vett_1 -f1 -depsc2 -tiff
figure % Disegna i vettori quiver(X,Y,Vy,Vx,0.2,'k') axis ([-6 6 -2 10 -12 12]) view(90,90) %view(0,90) % Disegno dell'ugello
% La superficie è inclinata di 15° rispetto all'asse del foro
hold on
line(a3,b3,'color','k') fill(a4,b4,[0.8 1 0.8]) fill(a5,b5,[0.8 1 0.8]) axis square
title('Velocità media') hold off
%print V_ugello_vett_2 -f2 -depsc2 -tiff
%=====================================================================================% % GRAFICI DELLA VELOCITA' MEDIANTE COLORI
%=====================================================================================% %=====================================================================================%
% Velocità media
%=====================================================================================% % ciascuna riga rappresenta una diversa distanza dall'ugello
% Interpolazione dei risultati per righe;
yi = -15:0.1:9; y0=[-1.35,1.35]; riga0 = [v0 v0];
riga0i = interp1(y0,riga0,yi); rigam1i = riga0i; % linea fittizia
riga1 = linea1v; riga1i=interp1(y1,riga1,yi); riga5 = linea5v; riga5i=interp1(y5,riga5,yi); riga10 = linea10v; riga10i=interp1(y10,riga10,yi); riga20 = linea20v; riga20i=interp1(y20,riga20,yi); riga40 = linea40v; riga40i=interp1(y40,riga40,yi); riga70 = linea70v; riga70i=interp1(y70,riga70,yi); riga110 = linea110v; riga110i=interp1(y110,riga110,yi); riga200i=ones(1,241); % linea fittizia
allineam(1:241)=81; % massima velocità misurata
% Figura contenente le misurazioni di velocità nell'intorno dell'ugello
xi=[-20,-1,0,1,5,10,20,40,70,110,200]; Zi = [allineam;rigam1i;riga0i;riga1i;riga5i;riga10i;riga20i;riga40i;riga70i;riga110i ;riga200i]; [Xi,Yi] = meshgrid(yi,xi); figure %colormap(jet) %(default)
surface(Xi,Yi,Zi,'EdgeColor','none'); colorbar
shading interp view(0,90)
title('Velocità media')
% Disegno dell'ugello
% La superficie è inclinata di 15° rispetto all'asse del foro
hold on a3 = [-1.35,1.35]; b3 = [-1.35*sin(pi/12),1.35*sin(pi/12)]; line(a3,b3,'color','k') a4 = [-1.35,-1.35,-4,-4]; b4 = [-2,-1.35*sin(pi/12),-5*sin(pi/12),-2]; fill(a4,b4,[0.8 0.8 0.8]) a5 = [1.35,1.35,4,4]; b5 = [-2,1.35*sin(pi/12),5*sin(pi/12),-2]; fill(a5,b5,[0.8 0.8 0.8])
%axis equal % Scala correttamente gli assi x ed y
axis ([-15 10 -2 200 0 100]) % Tutta l'immagine %axis ([-6 6 -2 50 0 100]) % Zoom + stretto
hold off
%print V_media_125_superf -f6 -depsc2 -tiff %print V_media_125_superf -f6 -dbmp
%print V_media_125_superf -f6 -djpeg % print V_media_125_superf_r -f6 -djpeg
%=====================================================================================% % Velocità massima
%=====================================================================================% % ciascuna riga rappresenta una diversa distanza dall'ugello
% Interpolazione dei risultati per righe;
riga0 = [vmax0 vmax0];
riga0i = interp1(y0,riga0,yi); rigam1i = riga0i; % linea fittizia
riga1 = linea1vmax;
riga5 = linea5vmax; riga5i=interp1(y5,riga5,yi); riga10 = linea10vmax; riga10i=interp1(y10,riga10,yi); riga20 = linea20vmax; riga20i=interp1(y20,riga20,yi); riga40 = linea40vmax; riga40i=interp1(y40,riga40,yi); riga70 = linea70vmax; riga70i=interp1(y70,riga70,yi); riga110 = linea110vmax; riga110i=interp1(y110,riga110,yi); riga200i=ones(1,241); % linea fittizia
% Figura contenente le misurazioni di velocità nell'intorno dell'ugello
xi=[-20,-1,0,1,5,10,20,40,70,110,200]; Zi = [allineam;rigam1i;riga0i;riga1i;riga5i;riga10i;riga20i;riga40i;riga70i;riga110i ;riga200i]; [Xi,Yi] = meshgrid(yi,xi); figure %colormap(jet) %(default)
surface(Xi,Yi,Zi,'EdgeColor','none'); colorbar
shading interp view(0,90)
title('Velocità massima')
% Disegno dell'ugello
% La superficie è inclinata di 15° rispetto all'asse del foro
hold on a3 = [-1.35,1.35]; b3 = [-1.35*sin(pi/12),1.35*sin(pi/12)]; line(a3,b3,'color','k') a4 = [-1.35,-1.35,-4,-4]; b4 = [-2,-1.35*sin(pi/12),-5*sin(pi/12),-2]; fill(a4,b4,[0.8 0.8 0.8]) a5 = [1.35,1.35,4,4]; b5 = [-2,1.35*sin(pi/12),5*sin(pi/12),-2]; fill(a5,b5,[0.8 0.8 0.8])
%axis equal % Scala correttamente gli assi x ed y
axis ([-15 10 -2 200 0 100]) % Tutta l'immagine %axis ([-6 6 -2 50 0 100]) % Zoom + stretto
hold off
%print V_massima_125_superf -f7 -djpeg %print V_massima_125_superf_r -f7 -djpeg
%=====================================================================================% % Velocità minima
%=====================================================================================% % ciascuna riga rappresenta una diversa distanza dall'ugello
% Interpolazione dei risultati per righe;
yi = -15:0.1:9; y0=[-1.35,1.35]; riga0 = [vmin0 vmin0];
riga0i = interp1(y0,riga0,yi); rigam1i = riga0i; % linea fittizia
riga1 = linea1vmin; riga1i=interp1(y1,riga1,yi); riga5 = linea5vmin; riga5i=interp1(y5,riga5,yi); riga10 = linea10vmin; riga10i=interp1(y10,riga10,yi); riga20 = linea20vmin; riga20i=interp1(y20,riga20,yi); riga40 = linea40vmin; riga40i=interp1(y40,riga40,yi); riga70 = linea70vmin; riga70i=interp1(y70,riga70,yi); riga110 = linea110vmin; riga110i=interp1(y110,riga110,yi);
riga200i=ones(1,241); % linea fittizia
% Figura contenente le misurazioni di velocità nell'intorno dell'ugello
xi=[-20,-1,0,1,5,10,20,40,70,110,200]; Zi = [allineam;rigam1i;riga0i;riga1i;riga5i;riga10i;riga20i;riga40i;riga70i;riga110i ;riga200i]; [Xi,Yi] = meshgrid(yi,xi); figure %colormap(jet) %(default)
surface(Xi,Yi,Zi,'EdgeColor','none'); colorbar
shading interp view(0,90)
title('Velocità minima')
% Disegno dell'ugello
% La superficie è inclinata di 15° rispetto all'asse del foro
hold on a3 = [-1.35,1.35]; b3 = [-1.35*sin(pi/12),1.35*sin(pi/12)]; line(a3,b3,'color','k') a4 = [-1.35,-1.35,-4,-4]; b4 = [-2,-1.35*sin(pi/12),-5*sin(pi/12),-2]; fill(a4,b4,[0.8 0.8 0.8]) a5 = [1.35,1.35,4,4]; b5 = [-2,1.35*sin(pi/12),5*sin(pi/12),-2]; fill(a5,b5,[0.8 0.8 0.8])
%axis equal % Scala correttamente gli assi x ed y
axis ([-15 10 -2 200 0 100]) % Tutta l'immagine %axis ([-6 6 -2 50 0 100]) % Zoom + stretto
hold off
%print V_minima_125_superf -f8 -djpeg %print V_minima_125_superf_r -f8 -djpeg
%=====================================================================================% % Oscillazione di velocità / Velocità media
%=====================================================================================% % ciascuna riga rappresenta una diversa distanza dall'ugello
% Interpolazione dei risultati per righe;
yi = -15:0.1:9; y0=[-1.35,1.35];
riga0 = [(vmax0-vmin0)/v0 (vmax0-vmin0)/v0]; riga0i = interp1(y0,riga0,yi);
rigam1i = riga0i; % linea fittizia
riga1 = (linea1vmax-linea1vmin)./linea1v; riga1i=interp1(y1,riga1,yi); riga5 = (linea5vmax-linea5vmin)./linea5v; riga5i=interp1(y5,riga5,yi); riga10 = (linea10vmax-linea10vmin)./linea10v; riga10i=interp1(y10,riga10,yi); riga20 = (linea20vmax-linea20vmin)./linea20v; riga20i=interp1(y20,riga20,yi); riga40 = (linea40vmax-linea40vmin)./linea40v; riga40i=interp1(y40,riga40,yi); riga70 = (linea70vmax-linea70vmin)./linea70v; riga70i=interp1(y70,riga70,yi); riga110 = (linea110vmax-linea110vmin)./linea110v; riga110i=interp1(y110,riga110,yi);
riga120i=riga110i; % linea fittizia
% Figura contenente le misurazioni di velocità nell'intorno dell'ugello
xi=[-1,0,1,5,10,20,40,70,110,120];
Zi = [rigam1i;riga0i;riga1i;riga5i;riga10i;riga20i;riga40i;riga70i;riga110i;riga120i]; [Xi,Yi] = meshgrid(yi,xi);
figure
%colormap(jet) %(default)
surface(Xi,Yi,Zi,'EdgeColor','none');
%colorbar
shading interp view(0,90)
title('Oscillazione di velocità / Velocità media')
% Disegno dell'ugello
% La superficie è inclinata di 15° rispetto all'asse del foro
hold on a3 = [-1.35,1.35]; b3 = [-1.35*sin(pi/12),1.35*sin(pi/12)]; line(a3,b3,'color','k') a4 = [-1.35,-1.35,-4,-4]; b4 = [-2,-1.35*sin(pi/12),-5*sin(pi/12),-2]; fill(a4,b4,[0.8 0.8 0.8]) a5 = [1.35,1.35,4,4]; b5 = [-2,1.35*sin(pi/12),5*sin(pi/12),-2]; fill(a5,b5,[0.8 0.8 0.8])
%axis equal % Scala correttamente gli assi x ed y
axis ([-15 10 -2 120 0 100]) % Tutta l'immagine %axis ([-6 6 -2 50 0 100]) % Zoom + stretto
hold off
%print V_ugello_4 -f4 -depsc2 -tiff
disp(' ') disp('NOTE:') disp(' ')
disp('- Salvando le figure con "export" non viene salvata la legenda (colorbar),') disp(' salvo direttamente con "print"')
disp('- I colori sono gli stessi per tutti i grafici')
disp('- Il grafico dell''ampiezza di oscillazione non è significativo,') disp(' l''effetto del rumore è dominante per le ampiezze più piccole') disp(' basta vedere il grafico per "pos10_2s" per verificarlo')
disp(' Deve necessariamente essere fatto con la fft')
Functions utilizzate:
calcolo dell’ampiezza
%=====================================================================================% % Calcola l’ampiezza della risposta mediante trasformata di Foureir % %=====================================================================================% function [U_med,U_max,U_min]=calcoli(y); calibrazione; y_off = y+offset; U = C0+C1.*y_off+C2.*(y_off.^2)+C3.*(y_off.^3)+C4.*(y_off.^4); numero_campioni = length(U); U_med = mean(U); U_osc = U-U_med; U_flutt = fft(U_osc)/(numero_campioni/2); U_flutt_max = abs(max(U_flutt)); U_max = U_med+U_flutt_max; U_min = U_med-U_flutt_max;
Calcolo Ampiezza e Fase
Calcola ampiezza e fase della risposta del sistema per le prove con segnale sinusoidale
%=====================================================================================% % Calcola il valore massimo e minimo della velocità al variare della frequenza % % mediando su 20 periodi e ne traccia i grafici % %=====================================================================================%
clc; clear all; close all; format compact
directory = pwd;
% functon utilizzate:
% - calcoli3 --> Calcola l'ampiezza mediando sul numero di cicli indicato % dalla variabile 'nummed'
% Calcola la fase
% - correzione_fase --> Corregge la fase % NOTA:
% E' necessario che la cartella contenente le funciton chiamate sia salvata % nel path di Matlab
%=====================================================================================% % Cambio directory per il caricamento dei dati % %=====================================================================================% %cd D:\Stefano\Acquisizioni\1m_1bar_12V % cd D:\Stefano\Acquisizioni\1e5m_1bar_12V %cd D:\Stefano\Acquisizioni\1e5m_750mbar_12V %cd D:\Stefano\Acquisizioni\1e5m_500mbar_12V %cd D:\Stefano\Acquisizioni\1e5m_250mbar_12V
%cd D:\Stefano\Acquisizioni\1e5m_500mbar_8V % fase corretta %cd D:\Stefano\Acquisizioni\1e5m_500mbar_4V % fase corretta %
%cd D:\Stefano\Acquisizioni\2m_1bar_12V % fase corretta %cd D:\Stefano\Acquisizioni\2m_750mbar_12V % fase corretta %cd D:\Stefano\Acquisizioni\2m_500mbar_12V
%cd D:\Stefano\Acquisizioni\2m_250mbar_12V % fase corretta %cd D:\Stefano\Acquisizioni\2m_500mbar_8V
%cd D:\Stefano\Acquisizioni\2m_500mbar_4V % fase errata!!!
%=====================================================================================% % Numero di cicli su cui mediare
%=====================================================================================%
nummed = 100;
% Inizializzazione delle variabili
freq_v = []; U_med_v = []; U_max_v = []; U_min_v = []; fase_v = []; %=====================================================================================% % Calcoli %=====================================================================================% disp(' ') disp('W o r k i n g . . .') %=====================================================================================% % Calcolo ampiezza e fase
%=====================================================================================% for freq=1:500
nomefile = ['fr',num2str(freq),'Hz.txt']; if exist (nomefile)==2
nummedold = nummed;
nummed = min ([nummed 2*freq-1]); fid = fopen(nomefile,'r');
% Lettura file
dati = fscanf(fid,'%e',[2 inf]); % [2 inf] è la dim del file
E = dati(1,:)'; y = dati(2,:)'; % Chiusura file fclose(fid); % Calcoli [U_med1,U_max1,s_max1,U_min1,s_min1,fase_i] = calcoli3_b(E,y,freq,nummed); % Aggiornamento delle matrici
freq_v = [freq_v freq]; U_med_v = [U_med_v U_med1]; U_max_v = [U_max_v U_max1]; U_min_v = [U_min_v U_min1];
fase_v = [fase_v fase_i]; nummed = nummedold; end end cd (directory); % Ampiezza dell'oscillazione ampiezza = U_max_v-U_min_v;
% Correzzione della fase (aggiunge o sottrae 2*pi)
[fase_c] = correzione_fase(fase_v); % clc % disp('Frequenza') % disp(freq_v) % disp('Velocità massima') % disp(U_max_v) % disp('Velocità media') % disp(U_med_v) % disp('Velocità minima') % disp(U_min_v)
% disp('Ampiezza oscillazione velocità') % disp(ampiezza) % disp('Fase') % disp(fase_v) % disp('Fase corretta') % disp(fase_c) %=====================================================================================% % Grafico delle velocità media, massima e minima
%=====================================================================================%
figure
plot(freq_v,U_max_v,freq_v,U_med_v,freq_v,U_min_v); grid title('Velocità misurata con anemometro [m/s]')
xlim([0 500]);% ylim([0 100])
legend('Velocità massima','Velocità media','Velocità minima') xlabel('f [Hz]'); ylabel('U [m/s]')
%=====================================================================================% % Grafico del valore picco-picco
%=====================================================================================%
figure
plot(freq_v,ampiezza); grid
title('Ampiezza dell''oscillazione di velocità [m/s]') xlim([0 500]);
xlabel('f [Hz]'); ylabel('U [m/s]')
%=====================================================================================% % Grafico della fase
%=====================================================================================%
figure
plot(freq_v,fase_c); grid
title('Fase tra comando e risposta') xlim([0 500]);% ylim([0 100])
xlabel('f [Hz]'); ylabel('Fase [rad]')
% figure
% plot(freq_v,fase_c,'*'); grid
% title('Fase tra comando e risposta') % xlim([0 500]);% ylim([0 100])
% xlabel('f [Hz]'); ylabel('Fase [rad]')
%=====================================================================================% % Grafico ampiezza e fase
%=====================================================================================%
figure subplot(211)
plot(freq_v,ampiezza); grid
title('Ampiezza dell''oscillazione di velocità [m/s]') xlim([0 500]);
%xlabel('f [Hz]');
subplot(212)
plot(freq_v,fase_c); grid
title('Fase tra comando e risposta') xlim([0 500]);% ylim([0 100])
xlabel('f [Hz]'); ylabel('Fase [rad]')
%=====================================================================================% % Tabella riassuntiva
%=====================================================================================%
disp(' ')
disp('Tabella riassuntiva:'); disp(' ')
disp('Frequenza Velocità Velocità Velocità oscillazione Fase'); disp(' massima media minima velocità');
disp(' ')
tabella = [freq_v' U_max_v' U_med_v' U_min_v' ampiezza' fase_c']; results = [num2str(tabella)];
disp(results) disp(' ')
%=====================================================================================% % Salvataggio dei risultati
%=====================================================================================% %save 1m_1bar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c
%
save 1e5m_1bar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c
%save 1e5m_750mbar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 1e5m_500mbar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 1e5m_250mbar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 1e5m_500mbar_8V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 1e5m_500mbar_4V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %
%save 2m_1bar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 2m_750mbar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 2m_500mbar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 2m_250mbar_12V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 2m_500mbar_8V freq_v U_max_v U_med_v U_min_v ampiezza fase_c %save 2m_500mbar_4V freq_v U_max_v U_med_v U_min_v ampiezza fase_c
Functions utilizzate:
calcoli3
function [U_med,U_max,s_max,U_min,s_min,fase]=calcoli(E,y,freq,nummed); calibrazione; y_off = y+offset; U = C0+C1.*y_off+C2.*(y_off.^2)+C3.*(y_off.^3)+C4.*(y_off.^4); %=====================================================================================% % Ampiezza (media di "nummed" cicli)%=====================================================================================%
numcamp = round(5000/freq); % Numero di campioni in un ciclo
media = []; massimo = []; minimo = []; for i=1:nummed parte = U(i*numcamp:(i+1)*numcamp); parte_med = mean(parte); parte_max = max(parte); parte_min = min(parte); media = [media parte_med]; massimo = [massimo parte_max]; minimo = [minimo parte_min]; % Grafico dei dati
%figure %plot(parte);grid end U_med = mean(media); U_max = mean(massimo); U_min = mean(minimo); U_0 = U-U_med; s_max=0; s_min=0; %=====================================================================================% % Ritardo %=====================================================================================% it1=2; it1=100;
while not(U_0(it1+2)>0 & U_0(it1+1)>0 & U_0(it1)<0 & U_0(it1-1)<0)
% disp(['U_0(i) = ',num2str(U_0(it1))]) % disp(['U_0(i+1) = ',num2str(U_0(it1+1))]) % disp(' ') it1=it1+1; end it2=2;
while not(E(it2+2)>=0 & E(it2+1)>=0 & E(it2)<=0 & E(it2-1)<=0)
% disp(['E(i) = ',num2str(E(it2))]) % disp(['E(i+1) = ',num2str(E(it2+1))]) % disp(' ')
it2=it2+1;
end
% while not(E(it2+2)>0 & E(it2+1)>0 & E(it2)<0 & E(it2-1)<0 & it2<10001) % it2=it2+1 % end ritardo = (it2-it1)/5000; % [s] %=====================================================================================% % Fase %=====================================================================================%
fase = 2*pi*freq*ritardo-pi; % [rad]
return
disp(['Velocità massima, media e minima mediando su ',num2str(nummed),' cicli']) disp(['Velocità media = ',num2str(U_med),' m/s'])
disp(['Velocità massima = ',num2str(U_max),' m/s']) disp(['Velocità minima = ',num2str(U_min),' m/s']) disp(' ')
Correzione_fase
% Correzzione della fase (aggiunge o sottrae 2*pi)
function [fase_c] = correzione_fase(fase_v);
% La fase ad un Hz viene letta in modo errato; correggo con la fase della valvola % Uguale per tutte e tre le lunghezze
fase_v(1) = -0.1376; % Fase della valvola ad 1 Hz fase_c = unwrap(fase_v); for i=1:4 if fase_c(i+1)>fase_c(i) for j=(i+1):length(fase_v) fase_c(j)=fase_c(j)-2*pi; end end end
Reti neurali:
Modello NNARX
%=====================================================================================% % "Neural Network Based System Identification" % % utilizzo un modello "nnarx" % %=====================================================================================% % Il metodo "NNARX" è utilizzato per predire la risposta (velocità) del sistema % % per un condotto di lunghezza 1 m e pressione dell'aria 500 mbar % % - Il training del network è stato effettuato con le risposte ottenute % % sollecitato il sistema con segnale N-Samples-Constant (N = 5). % % - La validazione è stata effettuata sia con un segnale analogo a quello di training % % che con segnale sinusoidale alle frequenze di 120 e 180 Hz. % % - E' stata effettuata anche una pura simulazione, senza utilizzare i valori % % misurati delle uscite precedenti per predire le successive. % %=====================================================================================%
clc; clear all; close all directory = pwd;
%=====================================================================================% % Caricamento di due set di dati % %=====================================================================================% % Due ingressi e due uscite
% un set per il training ed uno per la validazione
num_camp = 500; % numero di campioni da utilizzare per il training e la validazione % CARICAMENTO DATI
cd D:\Stefano\Acquisizioni\NSC5_1m % Cambio directory
load m1_mbar500.txt E = m1_mbar500(:,1)'; y = m1_mbar500(:,2)'; calibrazione; y_off = y+offset; U = C0+C1.*y_off+C2.*(y_off.^2)+C3.*(y_off.^3)+C4.*(y_off.^4); cd D:\Stefano\Acquisizioni\1m_500mbar_12V load fr180Hz.txt E_sin1 = fr180Hz(:,2)'; y_sin1 = fr180Hz(:,3)'; load fr120Hz.txt E_sin2 = fr120Hz(:,2)'; y_sin2 = fr120Hz(:,3)'; calibrazione; y_sin1_off = y_sin1+offset; y_sin2_off = y_sin2+offset; U_sin1 = C0+C1.*y_sin1_off+C2.*(y_sin1_off.^2)+C3.*(y_sin1_off.^3)+C4.*(y_sin1_off.^4); U_sin2 = C0+C1.*y_sin2_off+C2.*(y_sin2_off.^2)+C3.*(y_sin2_off.^3)+C4.*(y_sin2_off.^4);
cd (directory); % Ripristino la directory di lavoro
% Set di dati per il training (NSC)
E1 = E(1:num_camp); U1 = U(1:num_camp);
% Set di dati per la verifica (NSC)
E2 = E(3001:3000+num_camp); U2 = U(3001:3000+num_camp);
% Set di dati per la verifica (sinusoidale)
E31 = E_sin1(1:num_camp); U31 = U_sin1(1:num_camp); E32 = E_sin2(1:num_camp); U32 = U_sin2(1:num_camp);
U_mean = mean(U);
%=====================================================================================% % Grafico dei dati utilizzati per il training % %=====================================================================================%
subplot(211),plot(E1) title('Input sequence')
%xlim([0 200]); ylim([-6 6])
subplot(212),plot(U1) title('Output sequence')
%xlim([0 200])
subplot(111)
%=====================================================================================% % Scalatura di training e test set con valor medio nullo e varianza 1 % %=====================================================================================% [E1s,uscales] = dscale(E1); [U1s,yscales] = dscale(U1); E2s = dscale(E2,uscales); U2s = dscale(U2,yscales); %figure %i=1:num_camp; %subplot(211),plot(i,E1,'b',i,E1s,'r') %title('Ingresso scalato') %subplot(212),plot(i,U1,'b',i,U1s,'r') %title('Uscita scalata') %=====================================================================================% % Determinazione dell'ordine del sistema % %=====================================================================================% % Investigo gli ordini da 1 a 8
%close all
%OrderIndices = lipschit(E1s,U1s,1:8,1:8); % OrderIndices = lipschit(E2s,U2s,1:8,1:8); % l'ordine migliore è 3!
%=====================================================================================% % Prova di un modello lineare % %=====================================================================================% %th = oe([U1' E1'],[3 5 18]);
%present(th);
%figure, compare([U2' E2'],th,1); %figure, resid([U2' E2'],th); % non adeguato
%return
%=====================================================================================% % Selezione della struttura del modello % %=====================================================================================% % Utilizzo un modello NNARX con 6 hidden hyperbolic tangent units
NetDef = ['HHHHHH';'L---'];
na = 4; % numero di uscite precedenti utilizzate
nb = 5; % numero di ingressi utilizzati
%nc = ; % numero di errori di predizione utilizzati % (necessario solo per alcuni modelli)
nk = 18; % non utilizzo gli ultimi nk ingressi
NN = [na nb nk];
%=====================================================================================% % Training della rete neurale % %=====================================================================================%
trparms = settrain;
trparms = settrain(trparms,'maxiter',500,'D',1e-3,'skip',100);
%trparms = settrain(trparms,'maxiter',300,'critmin',0,'critterm',0,... % 'gradterm',0,'paramterm',0,'D',1e-3,'skip',20);
% [W1,W2,critvec,iteration,lambda]=nnarx(NetDef,NN,W1,W2,trparms,Y,U)
[W1,W2,NSSEvec]=nnarx(NetDef,NN,[],[],trparms,U1s,E1s); %(pesi iniziali casuali)
%load pesi %(utilizzo valori fissati come valori di partenza) %[W1,W2,NSSEvec]=nnarx(NetDef,NN,W1,W2,trparms,U1s,E1s);
% Validazione con il training set e con il test set % %=====================================================================================%
[w1,w2] = wrescale('nnarx',W1,W2,uscales,yscales,NN); % Rescale the weights
save('pesi_nnarx_1m.mat','W1','W2','w1','w2','NSSEvec') [yhat,NSSE] = nnvalid('nnarx',NetDef,NN,w1,w2,U1,E1); [yhat,NSSE] = nnvalid('nnarx',NetDef,NN,w1,w2,U2,E2); [yhat,NSSE] = nnvalid('nnarx',NetDef,NN,w1,w2,U31,E31); [yhat,NSSE] = nnvalid('nnarx',NetDef,NN,w1,w2,U32,E32);
%=====================================================================================% % Pure simulation of the model % %=====================================================================================% % Simulazione della risposta ad un segnale NSC
% analogo a quello utilizzato per il training
Ysim = nnsimul('nnarx',NetDef,NN,w1,w2,U2,E2); title('Pure Simulation')
legend('output (solid)','one-step-ahead prediction (dashed)')
% Simulazione della risposta ad un segnale sinusoidale con frequenza f = 180 Hz
Ysim = nnsimul('nnarx',NetDef,NN,w1,w2,U31,E31); title('Pure Simulation: f = 180 Hz')
legend('output (solid)','one-step-ahead prediction (dashed)')
% Simulazione della risposta ad un segnale sinusoidale con frequenza f = 120 Hz
Ysim = nnsimul('nnarx',NetDef,NN,w1,w2,U32,E32); title('Pure Simulation: f = 120 Hz')
legend('output (solid)','one-step-ahead prediction (dashed)')
%=====================================================================================% % Salvataggio dei grafici % %=====================================================================================% %print nnarx1 -f1 -depsc2 -tiff
%print nnarx2 -f2 -depsc2 -tiff %print nnarx3 -f3 -depsc2 -tiff %print nnarx4 -f4 -depsc2 -tiff %print nnarx5 -f5 -depsc2 -tiff %print nnarx6 -f6 -depsc2 -tiff %print nnarx7 -f7 -depsc2 -tiff %return
%=====================================================================================% % Pruning % %=====================================================================================%
disp(' ')
reply = input('Effettuo il Pruning? S/N [S]: ','s');
if reply=='N' return elseif reply=='n' return end close all
% Dopo l'eliminazione di ciascun peso rieseguo il training della rete % (con un massimo di 50 iterazioni)
prparms = [50 0];
[thd,trv,fpev,tev,deff,pv] = ...
nnprune('nnarx',NetDef,W1,W2,E1s,U1s,NN,trparms,prparms,E2s,U2s);
% Il minimo si ha per n_w=index:
[mintev,index] = min(tev(pv)); numeropesi=pv(index); % L'errore corrispondente è: % training error trainingerror = trv(numeropesi); % FPE finalpredictionerror = fpev(numeropesi); % test error testerror = tev(numeropesi); figure [W1,W2] = netstruc(NetDef,thd,index); trparms = settrain(trparms,'D',0); [W1,W2,NSSEvec]=nnarx(NetDef,NN,W1,W2,trparms,U1s,E1s);
%=====================================================================================% % Validazione del network finale % %=====================================================================================%
[w1,w2] = wrescale('nnarx',W1,W2,uscales,yscales,NN);
[yhat,NSSE] = nnvalid('nnarx',NetDef,NN,w1,w2,U1,E1); % training set
[yhat,NSSE] = nnvalid('nnarx',NetDef,NN,w1,w2,U2,E2); % test set %figure
%plot(y2(3:num_camp)), hold on %plot(yhat,'m--'), hold off
%title('Output (solid) and one-step ahead prediction (dashed)')
disp(' ')
disp('**********************************************************************') disp(['Nel modello finale sono stati utilizzati ',num2str(numeropesi),' pesi']) disp(['training error ',num2str(trainingerror)])
disp(['FPE ',num2str(finalpredictionerror)]) disp(['test error ',num2str(testerror)])
disp('**********************************************************************') save('pesi_nnarx_1m_prun.mat','W1','W2','w1','w2','NSSEvec','index')
%=====================================================================================% % Salvataggio dei grafici % %=====================================================================================% %print nnarx9 -f1 -depsc2 -tiff
%print nnarx10 -f2 -depsc2 -tiff %print nnarx11 -f3 -depsc2 -tiff %print nnarx12 -f4 -depsc2 -tiff %print nnarx13 -f5 -depsc2 -tiff %print nnarx14 -f6 -depsc2 -tiff %print nnarx15 -f7 -depsc2 -tiff
Modello NNARX con diverse portate
analogo al precedente tranne:
%=====================================================================================% % "Neural Network Based System Identification Toolobox" % % utilizzo un modello "NNARX" % %=====================================================================================% % Il matodo "NNARX" è utilizzato per predire la risposta (tensione) del sistema % % per pressione dell'aria di 500 mbar, allenando il sistema con le risposte % % per pressione di 250 e 750 mbar. % % La lunghezza del condotto è 1 m. % %=====================================================================================%
clc; clear all; close all directory = pwd;
%=====================================================================================% % Caricamento di due set di dati % %=====================================================================================% % Due ingressi e due uscite
% un set per il training ed uno per la validazione
num_camp = 500; % numero di campioni da utilizzare per il training e la validazione % CARICAMENTO DATI cd C:\WINDOWS\Desktop\Tesi\Acquisizioni\NSC5_1m %cd D:\Stefano\Acquisizioni\NSC5_1m load m1_mbar250.txt Ea = m1_mbar250(:,1)'; ya = m1_mbar250(:,2)'; calibrazione; ya_off = ya+offset; Ua = C0+C1.*ya_off+C2.*(ya_off.^2)+C3.*(ya_off.^3)+C4.*(ya_off.^4); load m1_mbar500.txt Eb = m1_mbar500(:,1)';
yb = m1_mbar500(:,2)'; calibrazione; yb_off = yb+offset; Ub = C0+C1.*yb_off+C2.*(yb_off.^2)+C3.*(yb_off.^3)+C4.*(yb_off.^4); load m1_mbar750.txt Ec = m1_mbar750(:,1)'; yc = m1_mbar750(:,2)'; calibrazione; yc_off = yc+offset; Uc = C0+C1.*yc_off+C2.*(yc_off.^2)+C3.*(yc_off.^3)+C4.*(yc_off.^4); cd (directory); E1(2,(1:500)) = 250; E1(2,(501:1000)) = 750; E1(1,:) = [Ea(1:num_camp),Ec(1001:1000+num_camp)]; U1 = [Ua(1:num_camp),Uc(1001:1000+num_camp)]; E2(2,(1:1000)) = 500; E2(1,:) = [Eb(1001:2000)]; U2(1,:) = [Ub(1001:2000)];
…
%=====================================================================================% % Selezione della struttura del modello % %=====================================================================================% % utilizzo un modello nnarx con 10 hidden hyperbolic tangent unitsNetDef = ['HHHHH';'L----'];
na = 3; % numero di uscite precedenti utilizzate
nb = [5,1]; % numero di ingressi utilizzati
%nc = ; % numero di errori di predizione utilizzati
% (necessario solo per alcuni modelli)
nk = [18,0]; % non utilizzo gli ultimi nk ingressi
NN = [na nb nk];
Modello NNARMAX
analogo al precedente tranne:
cd D:\Stefano\Acquisizioni\1e5m_500mbar_12V
…
%=====================================================================================% % Selezione della struttura del modello % %=====================================================================================% % utilizzo un modello nnarmax1 con 5 hidden hyperbolic tangent units
NetDef = ['HHHHH';'L----'];
na = 2; % numero di uscite precedenti utilizzate
nb = 2; % numero di ingressi utilizzati
nc = 2; % numero di errori di predizione utilizzati
nk = 28; % non utilizzo gli ultimi nk ingressi
NN = [na nb nc nk];
%=====================================================================================% % Training della rete neurale % %=====================================================================================%
trparms = settrain;
%trparms = settrain(trparms,'maxiter',500,'D',1e-3,'skip',10);
trparms = settrain(trparms,'maxiter',500,'D',1,'skip',10);
%[W1,W2,NSSEvec]=nnarmax1(NetDef,NN,[],[],[],trparms,U1s,E1s); %(pesi iniziali casuali)
%load pesi %(utilizzo valori fissati come valori di partenza) %[W1,W2,NSSEvec]=nnarmax1(NetDef,NN,W1,W2,trparms,U1s,E1s);
%=====================================================================================% % Validazione con il training set e con il test set % %=====================================================================================%
[w1,w2] = wrescale('nnarmax1',W1,W2,uscales,yscales,NN); % Rescale the weights
save('pesi_nnarmax1_1e5m.mat','W1','W2','w1','w2')
[yhat,NSSE] = nnvalid('nnarmax1',NetDef,NN,w1,w2,Chat,U1,E1); [yhat,NSSE] = nnvalid('nnarmax1',NetDef,NN,w1,w2,Chat,U2,E2); [yhat,NSSE] = nnvalid('nnarmax1',NetDef,NN,w1,w2,Chat,U31,E31); [yhat,NSSE] = nnvalid('nnarmax1',NetDef,NN,w1,w2,Chat,U32,E32);
Modello NNOE
%=====================================================================================% % "Neural Network Based System Identification Toolobox" % % utilizzo un modello "nnoe" % %=====================================================================================% % Il metodo "NNOE" è utilizzato per predire la risposta (velocità) del sistema % % per un condotto di lunghezza 1m e pressione dell'aria 500 mbar % % Tale metodo di predizione non utilizza i valori misurati delle uscite precedenti % % per predire le successive. % % - Il training del network è stato effettuato con le risposte ottenute % % sollecitato il sistema con segnale N-Samples-Constant (N = 5). % % - La validazione è stata effettuata sia con un segnale analogo a quello di training % % che con segnale sinusoidale. % %=====================================================================================%
clc; clear all; close all
%=====================================================================================% % Caricamento di due set di dati % %=====================================================================================% % Due ingressi e due uscite
% un set per il training ed uno per la validazione
num_camp = 1000; % numero di campioni da utilizzare per il training e la validazione
% CARICAMENTO DATI
cd C:\WINDOWS\Desktop\Tesi\Acquisizioni\scarti\PRBS_1m_old
%cd C:\WINDOWS\Desktop\Tesi\Acquisizioni\NSC5_1m % con questi dati non trova % un modello adeguato load m1_mbar500.txt E = m1_mbar500(:,1)'; y = m1_mbar500(:,2)'; calibrazione; y_off = y+offset; U = C0+C1.*y_off+C2.*(y_off.^2)+C3.*(y_off.^3)+C4.*(y_off.^4); cd C:\WINDOWS\Desktop\Tesi\Acquisizioni\1m_500mbar_12V load fr180Hz.txt E_sin1 = fr180Hz(:,2)'; y_sin1 = fr180Hz(:,3)'; load fr120Hz.txt E_sin2 = fr120Hz(:,2)'; y_sin2 = fr120Hz(:,3)'; calibrazione; y_sin_off1 = y_sin1+offset; U_sin1 = C0+C1.*y_sin_off1+C2.*(y_sin_off1.^2)+C3.*(y_sin_off1.^3)+C4.*(y_sin_off1.^4); y_sin_off2 = y_sin2+offset; U_sin2 = C0+C1.*y_sin_off2+C2.*(y_sin_off2.^2)+C3.*(y_sin_off2.^3)+C4.*(y_sin_off2.^4); cd C:\WINDOWS\Desktop\Tesi\Matlab\Reti_neurali
% Set di dati per il training (NSC)
U1 = U(1:num_camp);
% Set di dati per la verifica (NSC)
E2 = E(3001:3000+num_camp); U2 = U(3001:3000+num_camp);
% Set di dati per la verifica (sinusoidale)
E31 = E_sin1(1:num_camp); U31 = U_sin1(1:num_camp); E32 = E_sin2(1:num_camp); U32 = U_sin2(1:num_camp);
%U_mean = mean(U);
%disp(['Velocità media = ',num2str(U_mean),' m/s'])
%=====================================================================================% % Grafico dei dati utilizzati per il training % %=====================================================================================%
subplot(211),plot(E1) title('Input sequence') subplot(212),plot(U1) title('Output sequence') subplot(111)
%=====================================================================================% % Scalatura di training e test set con valor medio nullo e varianza 1 % %=====================================================================================% [E1s,uscales] = dscale(E1); [U1s,yscales] = dscale(U1); E2s = dscale(E2,uscales); U2s = dscale(U2,yscales); %figure %i=1:num_camp; %subplot(211),plot(i,E1,'b',i,E1s,'r') %title('Ingresso scalato') %subplot(212),plot(i,U1,'b',i,U1s,'r') %title('Uscita scalata') %=====================================================================================% % Determinazione dell'ordine del sistema % %=====================================================================================% % Investigo gli ordini da 1 a 8
%close all %OrderIndices = lipschit(E1s,U1s,1:8,1:8); %OrderIndices = lipschit(E2s,U2s,1:8,1:8); % l'ordine migliore è 3! %return %=====================================================================================% % Prova di un modello lineare % %=====================================================================================% %th = oe([U1' E1'],[3 5 18]);
%present(th);
%figure, compare([U2' E2'],th,1); %figure, resid([U2' E2'],th); % non adeguato
%return
%=====================================================================================% % Selezione della struttura del modello % %=====================================================================================% % utilizzo un modello nnoe con 6 hidden hyperbolic tangent units
NetDef = ['HHHHHH';'L---'];
na = 2; % numero di uscite precedenti utilizzate
nb = 4; % numero di ingressi utilizzati
%nc = ; % numero di errori di predizione utilizzati % (necessario solo per alcuni modelli)
nk = 18; % non utilizzo gli ultimi nk ingressi
NN = [na nb nk];
%=====================================================================================% % Training della rete neurale %
%=====================================================================================%
trparms = settrain;
trparms = settrain(trparms,'maxiter',300,'D',1e-3,'skip',10);
%trparms = settrain(trparms,'maxiter',300,'critmin',0,'critterm',0,... % 'gradterm',0,'paramterm',0,'D',1e-1,'skip',20); % [W1,W2,critvec,iteration,lambda]=nnoe(NetDef,NN,W1,W2,trparms,Y,U) [W1,W2,NSSEvec]=nnoe(NetDef,NN,[],[],trparms,U1s,E1s); %load pesi_nnoe_OK %[W1,W2,NSSEvec]=nnoe(NetDef,NN,W1,W2,trparms,U1s,E1s); %=====================================================================================% % Validazione con il training set e con il test set % %=====================================================================================%
[w1,w2] = wrescale('nnoe',W1,W2,uscales,yscales,NN); % Rescale the weights
save('pesi_nnoe.mat','W1','W2','w1','w2','NSSEvec') [yhat,NSSE] = nnvalid('nnoe',NetDef,NN,w1,w2,U1,E1); [yhat,NSSE] = nnvalid('nnoe',NetDef,NN,w1,w2,U2,E2); [yhat,NSSE] = nnvalid('nnoe',NetDef,NN,w1,w2,U31,E31); [yhat,NSSE] = nnvalid('nnoe',NetDef,NN,w1,w2,U32,E32);
%=====================================================================================% % Pure simulation of the model % %=====================================================================================% % Poiché il modello nnoe non fa uso delle uscite precedenti,
% non c'è alcuna differenza tra Validazione e Simulazione %Ysim = nnsimul('nnoe',NetDef,NN,w1,w2,U2,E2);
%title('Pure Simulation: output (solid) and one-step ahead prediction (dashed)')
%=====================================================================================% % Salvataggio dei grafici % %=====================================================================================% %print nnoe1 -f1 -depsc2 -tiff
%print nnoe2 -f2 -depsc2 -tiff %print nnoe3 -f3 -depsc2 -tiff %print nnoe4 -f4 -depsc2 -tiff %print nnoe5 -f5 -depsc2 -tiff %print nnoe6 -f6 -depsc2 -tiff %print nnoe7 -f7 -depsc2 -tiff