• Non ci sono risultati.

Appendice A: Schemi Labview

N/A
N/A
Protected

Academic year: 2021

Condividi "Appendice A: Schemi Labview"

Copied!
30
0
0

Testo completo

(1)

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

(2)
(3)
(4)
(5)

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 2

2

2

4

4

d

Qm

= ⋅ ⋅

α ε

π

⋅ ⋅∆ = ⋅ ⋅ ⋅

ρ

P

α ε

π

β

D

⋅ ⋅∆

ρ

P

dove:

4

1

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

D

C

=

+

β

β

+

β

⋅

(

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

(6)
(7)

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

0

a

= 1 Coefficiente dipendente da

maxmin

Qv

Qv

V = 2120 cm

3

Volume 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

5

Pa Pressione assoluta a monte della flangia

ñ = 2.67 kg/m

3

Densità

Qm

Qv

ρ

=

= 2.03· 10

-3

m

3

/s Portata volumetrica media

0

V f

p

H

Qv P

⋅ ⋅∆

=

=0.671 Numero di Hodgson:

0 0

0.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

(8)

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 k

a

x t

a

π

f t

b

π

f t

=

=

+

⋅ ⋅ + ⋅

⋅ ⋅

dove:

=

T

x

t

dt

T

a

0 0

(

)

2

(

)

0

2

( ) cos 2

T k k

a

x t

f t dt

T

π

=

⋅ ⋅

k = 0, 1, 2, ...

(

)

0

2

( ) sin 2

T k k

b

x t

f t dt

T

π

=

⋅ ⋅

k = 1, 2, 3, ...

k

k

f

T

=

k = 1, 2, 3, ...

La trasformata di Fourier X(f) di una generica funzione x(t) è data da:

2

( )

( )

j f t

X f

+∞

x t e

− ⋅ ⋅ ⋅π

dt

−∞

=

-

∞ < f < ∞

Se è noto X(f), x(t) può essere ricavato dall’ antitrasformata di Fourier:

2

( )

( )

j f t

x t

+∞

X f e

⋅ ⋅ ⋅π

df

−∞

=

-

∞ < t < ∞

(9)

+∞ ∞ −

<

dt

t

x

(

)

2

Sia 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 T

2

(

)

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 T

2

)

(

lim

)

(

2

1

lim

)

(

)

(

2 2 2 2

Si definisce la densità spettrale di potenza di x(t):

=

∞ →

T

X

p

T T

2

)

(

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.

(10)

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

(11)

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];

(12)

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

%=====================================================================================% %=====================================================================================%

(13)

% 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;

(14)

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);

(15)

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)

(16)

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

(17)

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];

(18)

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]');

(19)

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

(20)

%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

(21)

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);

(22)

%=====================================================================================% % 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);

(23)

% 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);

(24)

%=====================================================================================% % 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)';

(25)

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 units

NetDef = ['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)

(26)

%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)

(27)

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 %

(28)

%=====================================================================================%

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

(29)

Appendice F:

Pesi delle reti neurali

NNARX 1 metro

W1

0.29823 -0.76902 0.74425 -0.02602 -0.16133 -0.01691 0.050666 -0.01034 0.067055 -0.29265

6.9624 -9.8718 3.3647 -0.15861 -0.27832 4.1432 -3.9703 -0.78576 0.51561

3.551

0.31933 0.38177 0.25959 -0.6126

-0.191 -0.14056 0.0137 0.13095 -0.12114 -0.04112

-0.96473 4.3309 -3.8687 0.48322 0.89508 1.4094 -1.6395 0.42987 -0.21976 2.6733

0.08221 0.51022 -0.63572 0.12297 0.14885 0.057291 -0.04097 -0.01603 -0.02879 -0.39658

4.8946 -3.9947 -1.7471 -0.94329 1.1497

-0.404 0.13193 -2.0244 1.1156 0.57432

W2

2.5155 -0.22513 0.83563 0.43381 2.9849 0.20629 1.5314

NNARX 1.5 metri

W1

0.292708 -0.1055 0.271473 0.01432 0.043573 -0.01443 0.010887 0.004206 0.157082 0.512569

-0.52775 1.12948 -0.90788 0.208033 -0.32541 -0.03795 -0.53458 1.41757 -1.19677 0.28869

-5.14612 -2.69176 1.3347 2.33327 1.21454 4.82133 -2.72323 4.16018 5.9105 -2.64864

3.68793 10.1491 -7.32776 -1.80313 4.28289 -1.86526 3.17768 -0.74722 -6.02602 -0.19892

1.07408 -1.73162 -1.63018 0.247803 0.19502 0.138555 -0.10298 -1.00173 0.682559 2.46113

-0.31404 0.070184 0.316433 0.228091 0.021525 -0.00898 -0.10184 0.559057 -0.16444 -0.06703

W2

2.6881 0.6029 -0.11265 -0.15099 -0.37445 -1.4761 -1.1526

NNARX 2 metri

W1

-0.14598 -0.13511 0.246209 -0.15731 -1.21891 1.51384 -0.20444 -0.05625 0.063996 -0.17869

-5.11615 11.6808 -7.20076 1.08558 -5.50671 -4.68899 -0.04101 2.06449 0.466668 4.03032

0.142779 0.410307 -0.40666 0.15082 1.50393 -2.05778 0.754318 -0.771 0.333813 0.115708

-4.24547 3.2959 -3.65435 3.62391 -0.10499 0.977461 -0.74202 0.724845 0.109554 -6.86863

0.473352 -0.11928 -0.00313 -0.06519 -0.03845 -0.02821 0.250071 -0.50508 0.286765 0.073836

-0.60017 1.00763 -0.05181 -0.29146 -1.14363 1.2689 -0.18312 -0.09269 -0.06063 -0.51934

W2

-2.6186 0.12054 -1.6696 -0.24762

2.5571 0.75437

-0.4114

(30)

NNARX 1 metro, diverse portate

W1

-0.74778 -0.2238 -0.74428 -0.3678 0.38538 -0.14209 -0.30521 -0.17631 1.6281 -0.85531

-1.727 -2.1962 2.4449 0.36171 -0.92929 -0.10318 0.046947 0.48058

1.323 -0.4597

-0.17743 -0.12405 -0.04814 -0.0529 0.050585 -0.09522 -0.03945 -0.11351 0.29038 0.31617

0.53215 0.11055 0.33911 0.16858 -0.17912 0.11167 0.16564 0.11869 -0.89765 -0.76736

-0.073 -0.05964 0.27591 0.075806 -0.07288 -0.02411 0.088984 -0.03699 -0.43094 0.008918

W2

-0.92685 -0.10868 4.2183 2.8428 -3.6434 -0.08006

NNARX 1.5 metri, misure di pressione

W1

1.3801 -2.7127 4.3501 -2.5743 -2.2699 -0.39138 -1.9645 1.6128 0.019381 0.87636

5.5723 -4.8481 3.7317 -2.8406 -1.4183 -1.4395

6.139 -1.0008 -4.4702 1.7747

-0.74948 0.19855 0.18471 -0.10128 -0.09314 -0.32679 -0.0571 -0.00552 -0.04498 0.02546

-0.11593 -0.10428 0.26741 -0.17187 -0.2391 -0.2438 -0.16095 0.00618 0.035124 -0.00246

-4.523 -0.34987

1.577 -0.24352 -8.6165 -1.2251 -2.8155 2.2557 -0.13999 -2.5176

W2

-0.1797 0.15709 -2.1053 2.7653 -0.15839 0.018222

NNARMAX 1.5 metri

W1

0.63869 -0.24857 -0.18833 -0.55211 -0.18774

0.69926 -0.22325 -0.57569 -0.15736 -0.05103

-0.07193 0.63489 -0.06304 0.10654 -0.79345

-0.44535 0.50287 0.24043 0.17706 -0.05307

0.50911 0.14649 -0.01009 0.013724 0.97729

W2

0.40634

-0.32 1.1935 -0.86153 1.2482

-0.15228

NNOE 1 metro

W1

1.0795 4.5909 8.5498 0.039927 6.4857 6.8452 -0.74371

-0.46681 0.35861 0.57586 -0.5267 -0.23243 0.23943 -0.36979

-0.10688 -0.20771 0.089823 0.13123 -0.24555 0.30076 1.0621

-0.97461 0.80494 0.56219 -0.81428 0.16585 -0.14265 -0.5867

0.37075 -0.11858 -0.19502 0.013019 0.41007 -0.42196 0.66123

6.1665 -4.9394 -1.3173 2.7166 0.30372 -0.40882 1.7686

W2

-0.05234

3.818

-2.189 -3.5971 3.8591 -0.47624 -0.62433

Riferimenti

Documenti correlati

In Figura 4.9 è riportato il block diagram di Tree.lvclass:Get Node.vi, VI della classe Tree: si può vedere come i vari parametri di ingresso siano collegati a CLFN e come il

He argues that it is far from certain that antitrust violations (including cartels, anticompetitive mergers, and abuses of dominance) systematically redirect wealth from the poor

Trentini, Claudia 2009, Essays on Human Capital Accumulation and Inequality European University Institute... Figure 1: Transition labor

all’innovazione. Questa infatti viene definita da Andrew Lo come “la chiave della sopravvivenza”, in contrapposizione con quanto esposto da Samuelson e Fama, i

Negli ultimi anni, il settore dell'industria alimentare cinese ha registrato un rapido sviluppo, con un tasso di crescita media annua superiore al 20%, pari al doppio

In Chapter III, the Authors will focus on the risks and trade-offs of the Commission’s choice to support the deployment of an all fibre network, while bearing in mind

Council of the European Union, Third round of Mutual Evaluations, ‘Exchange of information and intelligence between Europol and the Member States and among the Member

49 Meister Eckhart, ibidem... proprio dimostrare che lo stato di libertà corrisponde all'esperienza di unione con lo spirito. Conosciuto come il