• Non ci sono risultati.

Appendice G.Programmi matlab

N/A
N/A
Protected

Academic year: 2021

Condividi "Appendice G.Programmi matlab"

Copied!
72
0
0

Testo completo

(1)

Appendice G.Programmi matlab

G.1.

Dati chimici e termofisici

Le seguenti funzioni definiscono i dati termofisici e chimici dei propellenti e dei prodotti di

combustione. Il significato dei simboli è chiaro e le unità di misura sono riportate all’interno delle

funzioni.

function [R,T_0,p_0,g_0,M_C2H6,M_O2,M_H2O2,M_H2O,M_CO2,M_CO,... h0_C2H6,h0_O2,h0_CO2,h0_CO,h0_H202,h0_H2O_l,h0_H2O_g,... s0_C2H6,s0_O2,s0_H2O,s0_CO2,s0_CO,s0_H202,... cp_O2,cp_CO2,cp_CO,cp_C2H6,cp_H2O2,cp_H2O_l,cp_H2O_g,... h_O2,h_CO2,h_CO,h_C2H6,h_H2O_g,... s_O2,s_H2O,s_CO2,s_CO,s_C2H6]=dati_termochimici global R T_0 p_0 g_0

global M_C2H6 M_O2 M_CO2 M_CO M_H2O2 M_H2O

global h0_C2H6 h0_O2 h0_CO2 h0_CO h0_H202 h0_H2O_l h0_H2O_g global s0_C2H6 s0_O2 s0_H2O s0_CO2 s0_CO s0_H202

global cp_O2 cp_CO2 cp_CO cp_C2H6 cp_H2O2 cp_H2O_l cp_H2O_g global h_O2 h_CO2 h_CO h_C2H6 h_H2O_g

global s_O2 s_H2O s_CO2 s_CO s_C2H6 R=8.3143; %[J/(mol*K)] T_0=298.15; %[K] p_0=101300; %[Pa] g_0=9.81; %[m/s^2] %---M_C2H6=30.07/1000; %[kg/mol] M_O2=15.9994*2/1000; %[kg/mol] M_CO2=44.01/1000; %[kg/mol] M_CO=28.01/1000; %[kg/mol] M_H2O2=34/1000; %[kg/mol] M_H2O=18.01528/1000; %[kg/mol] %---h0_C2H6=-84*1000; %[J/mol] h0_O2=0; %[J/mol] h0_CO2=-393.5*1000; %[J/mol]

(2)

h0_CO=-110.5*1000; %[J/mol] h0_H202=-187.8*1000; %[J/mol] h0_H2O_l=-285.8*1000; %[J/mol] h0_H2O_g=-241.8*1000; %[J/mol] %---s0_C2H6=229.2; %[J/(mol*K)] s0_O2=205.2; %[J/(mol*K)] s0_CO2=213.8; %[J/(mol*K)] s0_CO=197.7; %[J/(mol*K)] s0_H202=109.6; %[J/(mol*K)] s0_H20_g=188.8; %[J/(mol*K)] %---cp_H2O_l=75.3; %[J/(mol*K)] cp_H2O2=89.1; %[J/(mol*K)]

%---%Le seguenti espressioni sono valide nell'intervallo di temperatura T_0<T<3500

%---% capacità termiche molari [J/(mol*K)] syms T cp_O2=37.432+0.020102*(T/100)^1.5-178.57*(T/100)^-1.5+236.88*(T/100)^-2; cp_CO2=-3.7357+30.529*(T/100)^0.5-4.1034*(T/100)+0.024198*(T/100)^2; cp_CO=69.145-0.70463*(T/100)^0.75-200.77*(T/100)^-0.5+176.76*(T/100)^-0.75; cp_C2H6=6.895+17.26*(T/100)-0.6402*(T/100)^2+0.00728*(T/100)^3; cp_H2O_g=143.05-183.54*(T/100)^0.25+82.751*(T/100)^0.5-3.6989*(T/100); %---h_O2=h0_O2+int(cp_O2)-subs(int(cp_O2),T_0); %[J/mol] h_CO2=h0_CO2+int(cp_CO2)-subs(int(cp_CO2),T_0); %[J/mol] h_CO=h0_CO+int(cp_CO)-subs(int(cp_CO),T_0); %[J/mol] h_C2H6=h0_C2H6+int(cp_C2H6)-subs(int(cp_C2H6),T_0); %[J/mol] h_H2O_g=h0_H2O_g+int(cp_H2O_g)-subs(int(cp_H2O_g),T_0); %[J/mol] %---s_O2=int(cp_O2/T); %[J/(mol*K)] s_H2O=int(cp_H2O_g/T); %[J/(mol*K)] s_CO2=int(cp_CO2/T); %[J/(mol*K)] s_CO=int(cp_CO/T); %[J/(mol*K)] s_C2H6=int(cp_C2H6/T); %[J/(mol*K)] %---function out=etano(par,varargin)

% Dati termofisici del'etano

%---% % Inputs: par required input [string]

% accepted values 'p' 'rhoL' 'rhoV' 'vL' 'vV' 'hL' 'hV' 'r' 'sL' 'sV' 'VdW' 'cp' 'all' % Outputs: p Pressure [kPa ]

% rho Density [kg/m3 ] % v Specific Volume [m^3/kg ] % h Entalpy [kJ/kg ] % r Heat of Calorization [kJ/kg ] % s Entropy [kJ/(kg*K)]

% il pedice "L" o "V" indica rispettivamente lo stato di liquido o di vapore nella zona di vapor saturo %

% i dati sono in funzione della temperatura [K] nell'intervallo [223.15K , Tc=305.25K] %---%

(3)

%---dati del vapor saturo dell'etano presi da: Tabelle Termodinamiche di Kuzman Raznjevic---% T=[223.15:5:303.15,304.15,305.25]; p=[55.1722 65.7438 77.7569 91.2901 106.5002 123.3677 142.2945 163.0846 185.9341 211.0391 238.4977 268.6041 301.5545 337.6430 377.4580 421.4898 470.7192 481.5065 493.2745]*10; rhoL=[499.3 492.1 485 477.8 470 461.5 452.6 443.5 433.9 423 411.7 399.5 386.5 369.5 350.2 326 286 271 213]; rhoV=[10.17 12.05 14.19 16.63 19.41 22.54 26.11 30.16 34.73 39.97 45.98 53.19 62 73.21 87.49 106.7 142 156 213]; vL=1./rhoL; vV=1./rhoV; hL=[272.477 285.33 298.519 312.168 326.277 340.471 355.376 370.909 386.316 402.226 418.68 435.804 454.058 473.569 494.88 518.535 553.034 565.218 610.226]; hV=[698.191 702.084 705.643 708.951 711.965 714.645 716.948 718.874 720.381 721.428 721.972 720.841 718.246 712.593 705.099 693.502 668.674 658.584 610.226]; r=hV-hL; sL=[3.6149 3.6706 3.7267 3.7836 3.8406 3.8992 3.9549 4.0135 4.0708 4.1286 4.1868 4.2463 4.3082 4.3769 4.4422 4.5180 4.6273 4.6662 4.8123]; sV=[5.5224 5.4973 5.4730 5.4495 5.4269 5.4068 5.3830 5.3612 5.3403 5.3189 5.2971 5.2712 5.2415 5.2025 5.1594 5.1050 5.0003 4.9605 4.8123]; Mat=[T;p;rhoL;rhoV;hL;hV;sL;sV] Mat=Mat';

%---dati per il calcolo di vapore soprassaturo tramite equazione di Van der Waals---% R=8.31; %[J/(mol*K] Costante universale dei gas M=30.07; %[gr/mol] peso molare dell'etano Rm=R/M; %[kJ/(kg*K)]

Tc=T(end); %[K] temperatura critica pc=p(end); %[kPa] temperatura critica vc=vV(end); %[m^3/kg] temperatura critica

VdW(1)=27/64*Rm^2*Tc^2/pc; %[kPa*m^6/kg^2] coefficente a di Van der Waals VdW(2)=1/8*Rm*Tc/pc; %[m^3/kg] covolume coefficente b di Van der Waals

Mat2=[Tc;pc;vc;VdW(1);VdW(2)];

%---calore specifico cv(T,p) preso da tabelle di CRC Handbook of chemistry and Physics---% Tcv=[95 100:25:400 450 500 600]; %[K]

Cv(2,:)=[47.2 47.1 45 43.4 42.7 34.5 36.5 38.9 41.6 44.5 47.6 50.7 54 57.2 63.6 69.7 80.9]; %[J/(mol*K)] p=0.1 MPa Cv(3,:)=[47.3 47.2 45 43.4 42.7 42.9 43.8 41.6 43.2 45.5 48.3 51.3 54.4 57.5 63.8 69.9 81]; %[J/(mol*K)] p=1 MPa Cv(4,:)=[47.4 47.4 45.5 43.9 43.3 43.5 44.3 45.8 47.9 50.8 54.7 58.8 60 61.4 65.8 71.2 81.8]; %[J/(mol*K)] p=10 MPa cv=Cv/M; %[kJ/(kg*K)]

cv(1,:)=Tcv; %la prima riga rappresenta la temperatura

%---calore specifico cp(T,p) preso dalla tabella 1 appendice II del Peterson---% A=6.895;

B=17.26; C=-0.6402; D=0.00728;

%Valide per l'intervallo di temperatura T = [300 3500] K %le costanti sono i coefficenti della seguente relazione:

%cp0=A+B*theta+C*theta^2+D*theta^3 con theta=T/100 %---% if isempty(varargin) switch par case 'T' out=T; case 'p' out=p; case 'rhoL'

(4)

out=rhoL; case 'rhoV' out=rhoV; case 'vL' out=vL; case 'vV' out=vV; case 'hL' out=hL; case 'hV' out=hV; case 'r' out=r; case 'sL' out=sL; case 'sV' out=sV; case 'VdW' out=VdW; case 'cv' out=cp; case 'all'

out={T p rhoL rhoV vL vV hL hV r sL sV VdW cv Mat}; otherwise error('input errato') end else if varargin{1}=='interpola' n=varargin{2}; out=Polychange('1',polyfit(T,etano(par),n),'T'); else error('input errato'); end end function [M,cp,rho,tf]=perossido(conc) M_H2O=18.016; M_H2O2=34.016; x=conc*M_H2O/(M_H2O2*(1-conc)+conc*M_H2O); M=x*M_H2O2+(1-x)*M_H2O; CP=[1 0.94276 0.9 0.86 0.82069 0.78759 0.75655 0.72621 0.69172 0.65724 0.628]; %[kcal/(kg*K)] cp=interp1([0:0.1:1],CP*4.184,conc); %[kJ/(kg*K)] Rho=[1 1.0329 1.0686 1.1114 1.1443 1.1871 1.2386 1.2829 1.3386 1.3957 1.4543]; %[kg/dm^3] rho=interp1([0:0.1:1],Rho*10^3,conc); %[kg/m^3] Tf=[273.1500 270.8100 268.2000 265.0500 261.2700 256.9500 252.4500... 245.7000 239.8500 234.9900 231.0300 228.9600 228.7800 234.3600... 241.0200 247.0500 253.3500 259.2000 264.6000 268.6500 272.4300]; %[K] tf=interp1([0:0.05:1],Tf,conc);

(5)

La seguente funzione calcola l’impulso specifico e il coefficiente di spinta per l’endoreattore

sulla base della concentrazione del perossido di idrogeno, il rapporto di miscelamento, il rapporto di

espansione dell’ugello e della pressione in camera, con pressione esterna nulla.

function [I_sp,C_tau,T05,p6]=I_sp(phi,conc,A6_A5_star,p5)

% inputs:

% phi [--] Rapporto di miscelamento % conc [--] Concentrazione in peso HP % A6_A5_star [--] Rapporto di espansione ugello % p5 [atm] Pressione in camera di CC % ouputs:

% I_sp [s] Impulso specifico % C_tau [--] Coefficiente di spinta % T05 [--] Temperatura in camera di CC % p6 [atm] Pressione in uscita ugello

T1=300; Mach5=0.1;

global R T_0 p_0 g_0

global M_C2H6 M_O2 M_CO2 M_CO M_H2O2 M_H2O

global h0_C2H6 h0_O2 h0_CO2 h0_CO h0_H202 h0_H2O_l h0_H2O_g global s0_C2H6 s0_O2 s0_H2O s0_CO2 s0_CO s0_H202

global cp_O2 cp_CO2 cp_CO cp_C2H6 cp_H2O2 cp_H2O_l cp_H2O_g global h_O2 h_CO2 h_CO h_C2H6 h_H2O_g

global s_O2 s_H2O s_CO2 s_CO s_C2H6

[R,T_0,p_0,g_0,M_C2H6,M_O2,M_H2O2,M_H2O,M_CO2,M_CO,... h0_C2H6,h0_O2,h0_CO2,h0_CO,h0_H202,h0_H2O_l,h0_H2O_g,... s0_C2H6,s0_O2,s0_H2O,s0_CO2,s0_CO,s0_H202,... cp_O2,cp_CO2,cp_CO,cp_C2H6,cp_H2O2,cp_H2O_l,cp_H2O_g,... h_O2,h_CO2,h_CO,h_C2H6,h_H2O_g,... s_O2,s_H2O,s_CO2,s_CO,s_C2H6]=dati_termochimici v_H2O_l=1/10^6; v_H2O2=1/(1.4*10^6); Pa2bar=1/1e5; bar2Pa=1/Pa2bar; [R,T_0,p_0,g_0,M_C2H6,M_O2,M_H2O2,M_H2O,M_CO2,M_CO,... h0_C2H6,h0_O2,h0_CO2,h0_CO,h0_H2O2,h0_H2O_l,h0_H2O_g,... s0_C2H6,s0_O2,s0_H2O,s0_CO2,s0_CO,s0_H202,... cp_O2,cp_CO2,cp_CO,cp_C2H6,cp_H2O2,cp_H2O_l,cp_H2O_g,... h_O2,h_CO2,h_CO,h_C2H6,h_H2O_g,... s_O2,s_H2O,s_CO2,s_CO,s_C2H6]=dati_termochimici; dati_etano=etano('all'); p1=1000*interp1(dati_etano{1},dati_etano{2},T1); %[Pa]

p_chamber=15; % Lasciare cosi!!!! [M,cp,rho_ox,tf]=perossido(conc); rho_H2O=1000; g0=9.8; m_punto=1; m_punto_ox=m_punto*phi/(1+phi); m_punto_f=m_punto/(1+phi); n1_H2O2=m_punto_ox*conc/M_H2O2; n1_H2O=m_punto_ox*(1-conc)/M_H2O; n2_O2=1/2*n1_H2O2;

(6)

n2_H2O=n1_H2O+n1_H2O2; n1_C2H6=m_punto_f/M_C2H6; n3_C2H6=n1_C2H6; n3_H2O=n2_H2O; n3_O2=n2_O2;

%---%---CALCOLO DELLE TEMPERATURE TOTALI ATTRAVERSO IL MOTORE---

%---%---Dissociazione del Perossido---% entalpie molari in ingresso (stato 01)

h01_H2O2=h0_H2O2+cp_H2O2*(T1-T_0)+v_H2O2*(p1-p_0); h01_H2O_l=h0_H2O_l+cp_H2O_l*(T1-T_0)+v_H2O_l*(p1-p_0); h01=n1_H2O2*h01_H2O2+n1_H2O*h01_H2O_l;

% entalpie molari in uscita (funzione di T) h0=n2_O2*h_O2+n2_H2O*h_H2O_g;

% bilancio entalpico

T02=subs(fzero(inline(char(h01-h0)),[300 3500]));

%---Miscelamneto adiabatico---% entalpie molari in ingresso (stato 02)

h0in=n2_O2*subs(h_O2,T02)+n2_H2O*subs(h_H2O_g,T02)+n1_C2H6*subs(h_C2H6,T1); % entalpie molari in uscita (funzione di T0)

h0=n2_O2*h_O2+n2_H2O*h_H2O_g+n1_C2H6*h_C2H6; % bilancio entalpico T03=subs(fzero(inline(char(h0in-h0)),[300,3500])); [T05,n5_C2H6,n5_H2O,n5_CO2,n5_CO,n5_O2]=chamber(m_punto_f,m_punto_ox,T1,T02,p_chamber,conc,T03); cp5_O2=subs(cp_O2,T05); cp5_CO2=subs(cp_CO2,T05); cp5_CO=subs(cp_CO,T05); cp5_C2H6=subs(cp_C2H6,T05); cp5_H2O=subs(cp_H2O_g,T05); cp5=sum([n5_C2H6*cp5_C2H6,n5_H2O*cp5_H2O,n5_CO2*cp5_CO2,n5_CO*cp5_CO,n5_O2*cp5_O2])/sum([ n5_C2H6,n5_H2O,n5_CO2,n5_CO,n5_O2]); gamma5=cp5/(cp5-R); M5=sum([n5_C2H6*M_C2H6,n5_H2O*M_H2O,n5_CO2*M_CO2,n5_CO*M_CO,n5_O2*M_O2])/sum([n5_C2 H6,n5_H2O,n5_CO2,n5_CO,n5_O2]); R5=R/M5; c_star=sqrt(1/gamma5*((gamma5+1)/2)^((gamma5+1)/(gamma5-1))*R5*T05); syms Mach6; f=A6_A5_star-1/Mach6*(1+(gamma5-1)/2*Mach6^2)^((gamma5+1)/(gamma5-1)/2); Mach6=subs(fzero(inline((char(f))),[1,10000])); T5=T05/(1+(gamma5-1)/2*Mach5^2); T6=T05/(1+(gamma5-1)/2*Mach6^2); p6_p5=((1+(gamma5-1)/2*Mach5^2)/(1+(gamma5-1)/2*Mach6^2))^(gamma5/(gamma5-1)); p6=p5*p6_p5; rho6=p6/R5/T6; u6=Mach6*sqrt(gamma5*R5*T6); p05=p5*(1+(gamma5-1)/2*Mach5^2)^(1/(gamma5-1)); p_amb=0; C_tau=sqrt(2*gamma5^2/(gamma5-1)*(2/(gamma5+1))^((gamma5+1)/(gamma5-1))*(1-(p6/p05)^((gamma5-1)/gamma5)))+... (p6-p_amb)*A6_A5_star/p05; I_sp=C_tau*c_star/g0; end

(7)

G.3.

Programmi relativi al Capitolo 3

La seguente funzione e quelle ad essa correlate ( le due successive) , eseguono l’integrazione

del modello termodinamico del serbatoio con rapporto di miscelamento costante.

function [mL,mO,mV,P,T,mfin,moin]=Prestazione(phi,Ti,Itot,Isp)

% Inputs:

% phi [--] Rapporto M_fuel/M_oxidizer % Ti [°K] Temperatura iniziale serbatoio % Itot [N s] Impulso totale

% Isp [s] Impulso specifico % Outputs:

% mL [kg] Massa di etano liquido nel serbatoio % mO [kg] Massa di HP nel serbatoio

% mV [kg] Massa di etano vapore nel serbatoio % P [Pa] Pressione del serbatoio

% T [°K] Temperatura del serbatoio % mfin [kg] Massa di etano iniziale % moin [kg] Massa di HP iniziale

g0=9.81; %[m/s^2] accelerazione gravitazionale a livello del mare mtot=Itot/(Isp*g0); %[kg] massa totale di propellenti da imbarcare mLi=mtot/(1+1/phi); %[kg]

mVi=0; %[kg] si ipotizza presenza di sola fase liquida all'inizio mOi=mLi/phi; %[kg] si ipotizza che siano in rapporto fisso...

[QV,dhL_su_dT,dhV_su_dT,dhO_su_dT,dp_su_dT,p,vV,vL,vO,dvL_su_dT,dvV_su_dT,CvV,CpO,RV,aVid,bV]=Propri eta_Termodinamiche2(Ti); rhoO=1/vO; Vol=mLi*vL+mOi*vO; moin=mOi; mvin=mVi; mfin=mLi; Tf=240; Tf2=Tf;

options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]); [T,Y] = ode45(@rigid,[Ti Tf],[mfin moin 0],options,phi,Vol); mL=Y(:,1); mO=Y(:,2); mV=Y(:,3); soluzione=find(mL>0); sol=soluzione(end); mL=mL(1:sol); mO=mO(1:sol); mV=mV(1:sol); T=T(1:sol); P_sat=Pressione(T);

options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-5]); Tstar=T(end);

(8)

[QV,dhL_su_dT,dhV_su_dT,dhO_su_dT,dp_su_dT,p,vV,vL,vO,dvL_su_dT,dvV_su_dT,CvV,CpO,RV,aVid,bV]=Propri eta_Termodinamiche2(Tstar); aV=(RV*Tstar/(vVstar-bV)-P_sat(end))*vVstar^2; [T2,Y2] = ode45(@rigid2,[T(end):-1*(T(end)-Tf2)/20:Tf2], [mO(end) mV(end)],NaN,phi,Vol,aV); mO2=Y2(:,1); mV2=Y2(:,2); p=Pressione2(T2,Vol,mO2,mV2,aV); soluzione=find(p>PRESSIONE_CAMERA); sol=soluzione(end); mO2=mO2(1:sol); mV2=mV2(1:sol); T2=T2(1:sol); % ***************************************************************** % ***************** RISULTATI ******************************* % ***************************************************************** mL=[mL;0*mV2]; mO=[mO;mO2]; mV=[mV;mV2]; P=[P_sat;p']; T=[T;T2]; clc;

function dydx = rigid(x,y,phi,V)

mL=y(1); mO=y(2); mV=y(3); [QV,dhL_su_dT,dhV_su_dT,dhO_su_dT,dp_su_dT,p,vV,vL,vO,dvL_su_dT,dvV_su_dT,CvV,CpO,RV,aV,bV]=Propriet a_Termodinamiche2(x); dmL_su_dT=mL/QV*dhL_su_dT+mV/QV*dhV_su_dT+mO/QV*dhO_su_dT-V/QV*dp_su_dT; dmO_su_dT=((vV-vL)*dmL_su_dT-mL*dvL_su_dT-mV*dvV_su_dT)/(phi*vV+vO); dmV_su_dT=-1*(phi*mL*dvL_su_dT+phi*mV*dvV_su_dT+ (phi*vL+vO)*dmL_su_dT)/(phi*vV+vO); dmL_su_dT=max([dmL_su_dT,0]); dmV_su_dT=min([dmV_su_dT,0]); dmO_su_dT=max([dmO_su_dT,0]);

dydx=[dmL_su_dT dmO_su_dT dmV_su_dT]';

function dydx = rigid2(x,y,phi,V,aV)

mO=y(1); mV=y(2); [QV,dhL_su_dT,dhV_su_dT,dhO_su_dT,dp_su_dT,p,vV,vL,vO,dvL_su_dT,dvV_su_dT,CvV,CpO,RV,aVid,bV]=Propri eta_Termodinamiche2(x); rhoO=1/vO; % vV=(V-mO/rhoO)/(phi*mO); aV=aVid; dmV_su_dT=-1*((mV*(CvV+RV*vV/(vV-bV))+mO*CpO-V*RV/(vV-bV))... /... ((mV*RV*x*bV/((vV-bV)^2)+V*(2*aV/vV^3-RV*x/((vV-bV)^2)))*((vV+vO/phi)/mV))... ); dmO_su_dT=dmV_su_dT/phi; dmV_su_dT=max([dmV_su_dT,0]); dmO_su_dT=max([dmO_su_dT,0]);

(9)

dydx=[dmO_su_dT dmV_su_dT]';

G.4.

Programmi relativi al Capitolo 4

Programmi principali

La seguente procedura è il programma principale relativo al Capitolo 4. Dati i valori di

specifica delle prestazioni, il programma esegue il dimensionamento del sistema di regolazione come

descritto nel Capitolo 4, quindi richiama le funzioni atte ad eseguire l’integrazione del modello

termodinamico del serbatoio con rapporto di miscelamento variabile.

Main.m

t0=cputime; dati=etano('all');

[M_H2O2,cpO,rhoO,Tf]=perossido(conc);

g0=9.81; %[m/s^2] accelerazione gravitazionale a livello del mare mtot=Itot/(Isp*g0); %[kg] massa totale di propellenti da imbarcare

SF=1; % un fattore SF>1 e' per avere un margine sul propellente mLid=SF*mtot/(1+phi_des); %[kg]

mVi=0; %[kg] si ipotizza presenza di sola fase liquida all'inizio mOi=mLid*phi_des; %[kg] si ipotizza che siano in rapporto fisso...

mLi=(1+alpha)*mLid; %[kg] si aggiunge del C2H6 per rimanere all'interno della curva dei vapor saturi dati_termochimici; [k_C2H6,k_H2O2,A_star]=design_parameters(T_C2H6_des,T_H2O2_des,p_des_chamber,p_amb,F_des,phi_des,conc); Tdat=dati{1}; vL=dati{5}; vV=dati{6}; vLi=interp1(Tdat,vL,Ti); vO=1/rhoO; V=mLi*vLi+mOi*vO; options=odeset('Events','on'); [T,Y,Tstar,Ystar,Yevent,phi_out,p_chamber_out,T_chamber_out,q_fuel_out,q_ox_out,c_star_out,C_F_out]=... ode45bis('odetank1',[Ti Tf],[mLim VimOi],options,V,conc,p_amb,k_C2H6,

k_H2O2,A_star,phi_des,p_des_chamber,2700); T_chamber_out(1)=T_chamber_out(2); p_chamber_out(1)=p_des_chamber; q_fuel_out(1)=q_fuel_out(2); q_ox_out(1)=q_ox_out(2); c_star_out(1)=c_star_out(2); C_F_out(1)=C_F_out(2); Temp=T; mL=Y(:,1); mV=Y(:,2); mO=Y(:,3); P=interp1(dati{1},dati{2},T)/1000; DELTA_t=-1*diff(mO)./q_ox_out(1:end-1); t=0; for i=2:length(DELTA_t)+1

(10)

t(i)=t(i-1)+DELTA_t(i-1); end

%---%--- SECONDA PARTE

%---R=8.31; %[J/(mol*K] Costante universale dei gas M_C2H6=30.07; %[gr/mol] peso molare dell'etano RV=R/M_C2H6; %[kJ/(kg*K)] VdW=dati{12}; aVid=VdW(1); bV=VdW(2); %---vVstar=interp1(Tdat,dati{6},Tstar); aV=(RV*Tstar/(vVstar-bV)-1000*P(end))*vVstar^2; k=abs(aV-aVid)/aVid; % ---[Tempo,Y,Tstar,Ystar,Yevent,phi_out2,p_chamber_out2,T_chamber_out2,q_fuel_out2,q_ox_out2,c_star_out2,C_F_out2 ]=...ode45bis('odetank2',[0 100],[Ystar(2) Ystar(3) Tstar],options,

V,conc,aV,p_amb,k_C2H6,k_H2O2,A_star,phi_out(end),p_chamber_out(end),T_chamber_out(end)); %---Immissione dati

Etano---dati=etano('all');

R=8.31; %[J/(mol*K)] Costante universale dei gas M=30.07; %[gr/mol] peso molare dell'etano RV=R/M; %[kJ/(kg*K)]

VdW=dati{12}; %costanti di Van der Waals bV=VdW(2);

vV=(V-Y(:,2)*vO)./(Y(:,1)); cv=dati{13};

cvV=interp1(cv(1,:),cv(3,:),Y(:,3));

p=1/1000*(RV*Y(:,3)./(vV-bV)-aV./(vV.*vV)); %[MPa]

La funzione che segue, date le portate dei propellenti, la temperatura iniziale degli stessi, la

pressione in camera, calcola la temperatura adiabatica di fiamma.

function [T_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=

chamber(m_C2H6,m_H2O2,T_C2H6,T_H2O2,p,conc,k,T_miscela,T_guess)

% Inputs:

% m_C2H6 [kg s^-1] Portata di etano % m_H2O2 [kg s^-1] Portata di HP

% T_C2H6 [°K] Temperatura dell’etano in ingresso % T_H2O2 [°K] Temperatura dell’HP in ingresso % p [atm] Pressione in camera

% conc [--] Concentrazione in peso HP % K [--] Efficienza catalizzatore [0,1] %Outputs:

% T_chamber [°K] Temperatura in CC % n_C2H6 [moli] Moli di etano in CC % n_H2O [moli] Moli di H2O in CC % n_CO2 [moli] Moli di CO2 in CC % n_CO [moli] Moli di CO in CC % n_O2 [moli] Moli di O2 in CC

(11)

global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H2O h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 global R T_0

%---%---CALCOLO DELLE CONDIZIONI DI INGRESSO--- %---m_H2O=(1-conc)*m_H2O2+k*M_H2O/M_H2O2*conc*m_H2O2; %Calcolo delle m_O2=1/2*k*M_O2/M_H2O2*conc*m_H2O2; %portate in m_H2O2_res=(1-k)*M_H2O/M_H2O2*m_H2O2; %ingresso syms T

if nargin<8

%---entalpie di reazione dei singoli

Delta_hi_C2H6=m_C2H6/M_C2H6*(subs(h_C2H6,T/100)-subs(h_C2H6,T_C2H6/100)); Delta_hi_O2=m_O2/M_O2*(subs(h_O2,T/100)-subs(h_O2,T_H2O2/100));

Delta_hi_H2O=m_H2O/M_H2O*(subs(h_H2O,T/100)-subs(h_H2O,T_H2O2/100)); %da aggiungere Delta_hi_H2O2 per k<1 e quando sono disponibili dati su cp_H2O2 Delta_hi_tot=Delta_hi_C2H6+Delta_hi_O2+Delta_hi_H2O; %entalpia di reazione totale %---temperatura di miscelamento

T_miscela=f_zero(inline(char(Delta_hi_tot)),[300 3500]); end

%---Calore necessario a riportarsi in condizioni

standard---Q_C2H6=m_C2H6/M_C2H6*(subs(h_C2H6,T_0/100)-subs(h_C2H6,T_miscela/100)); Q_O2=m_O2/M_O2*(subs(h_O2,T_0/100)-subs(h_O2,T_miscela/100)); Q_H2O=m_H2O/M_H2O*(subs(h_H2O,T_0/100)-subs(h_H2O,T_miscela/100)); Q1=double(Q_C2H6+Q_O2+Q_H2O); %---moli di reagenti---a=m_C2H6/M_C2H6; b=m_O2/M_O2; c=m_H2O/M_H2O;

%---bilancio atomico degli elementi nella reazione---[n,i]=min([a b/(7/2)]);

if i==1 n_C2H6=0;

n_O2=b-(7/2)*n; %Valutazione delle moli di etano else %e ossigeno frai prodotti nelle ipotesi n_C2H6=m_C2H6/M_C2H6-n; %di completa combustione dell'etano

n_O2=0; % end

n_H2O=3*n+c; %

n_CO2=2*n; %derivanti dal bilancio atomico sugli elementi n_CO=0; %

%---inizializzazione della temperatura ipotizzata in camera---if nargin<9

T_chamber=1000; %nel caso non ci sia un'ipotesi sulla temperatura in camera else

T_chamber=T_guess;

[n_H2O,n_CO2,n_CO,n_O2]=dissociazione(T_chamber,a,b,c,p); end

(12)

%---%---CICLO PRINCIPALE--- %---epsilon=1000; %inizializzazione dell'errore count=0; %contatore dei passi d'iterazione while epsilon>1 & count<10^2 %si ritiene un errore di 10¢X accettabile %---calcolo delle entalpie di reazione e della temperatura in

camera---h0_prodotti=n_C2H6*h0_C2H6+n_H2O*h0_H2O+n_CO2*h0_CO2+n_CO*h0_CO+n_O2*h0_O2; h0_reagenti=a*h0_C2H6+b*h0_O2+c*h0_H2O; Delta_h0_reazione=double(h0_prodotti-h0_reagenti); Delta_h_C2H6=n_C2H6*(subs(h_C2H6,T/100)-subs(h_C2H6,T_0/100)); Delta_h_O2=n_O2*(subs(h_O2,T/100)-subs(h_O2,T_0/100)); Delta_h_H2O=n_H2O*(subs(h_H2O,T/100)-subs(h_H2O,T_0/100)); Delta_h_CO2=n_CO2*(subs(h_CO2,T/100)-subs(h_CO2,T_0/100)); Delta_h_CO=n_CO*(subs(h_CO,T/100)-subs(h_CO,T_0/100)); Delta_h_tot=Delta_h_C2H6+Delta_h_O2+Delta_h_H2O+Delta_h_CO2+Delta_h_CO; Ti=T_chamber;%variabile d'appoggio per il calcolo dell'errore

T_chamber=f_zero(inline(char(Delta_h_tot+(Q1+Delta_h0_reazione))),[300 3500]); %---calcolo delle moli all'equilibrio chimico---[n_H2O,n_CO2,n_CO,n_O2]=dissociazione(T_chamber,a,b,c,p);

count=count+1;

epsilon=abs(double(T_chamber-Ti)); end

La seguente funzione, data la temperature in camera e la pressione calcola l’equilibrio chimico

della reazione

2 2 2 2 6 2 2 H O 2 O 2 CO 2 CO

aC H

+

bO

+

cH O

n

H O

+

n O

+

n

CO

+

n CO

. function [n_H2O,n_CO2,n_CO,n_O2]=dissociazione(T,a,b,c,p) % Inputs: % T [°K] Temperatura in CC % P [atm] Pressione in CC

% a [moli] Moli di etano in ingresso in CC % b [moli] Moli di O2 in ingresso in CC % c [moli] Moli di H2O in ingresso in CC %Outputs:

% n_C2H6 [moli] Moli di etano all’equilibrio in CC % n_H2O [moli] Moli di H2O all’equilibrio in CC % n_CO2 [moli] Moli di CO2 all’equilibrio in CC % n_CO [moli] Moli di CO all’equilibrio in CC % n_O2 [moli] Moli di O2 all’equilibrio in CC

% Calcola l'equilibrio chimico della reazione:

% a*C2H6+b*O2+c*H2O=n_H2O*H2O+n_O2*O2+n_CO2*CO2+n_CO*CO % alla temperatura T e alla pressione p dati in ingtresso

global R

global M_C2H6 M_O2 M_H2O2 M_H2O

global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6

(13)

%---bilancio atomico degli elementi nella reazione---[n,i]=min([a b/(7/2)]);

if i==1

n_C2H6=0; %Valutazione delle moli di etano fra else % prodotti sotto l'ipotesi di n_C2H6=a-n; %completa combustione dell'etano end

syms n_CO;

n_CO2=2*a-2*n_C2H6-n_CO;

n_H2O=3*a+c-3*n_C2H6; %equazioni di bilancio sugli elementi n_O2=(2*b+c-n_H2O-2*n_CO2-n_CO)/2;

n_tot=n_C2H6+n_O2+n_H2O+n_CO2+n_CO; %moli totali presenti durante la reazione %---Valutazione della costante di equilibrio

K(T)---PHI_CO2=(h0_CO2+(subs(h_CO2,T/100)-subs(h_CO2,298.15/100))-... T*s0_CO2+(subs(s_CO2,T/100)-subs(s_CO2,298.15/100)))/(R*T); PHI_CO=(h0_CO+(subs(h_CO,T/100)-subs(h_CO,298.15/100))-... T*s0_CO+(subs(s_CO,T/100)-subs(s_CO,298.15/100)))/(R*T); PHI_O2=(h0_O2+(subs(h_O2,T/100)-subs(h_O2,298.15/100))-... T*s0_O2+(subs(s_O2,T/100)-subs(s_O2,298.15/100)))/(R*T); K_T=double(exp(-(PHI_CO+1/2*PHI_O2-PHI_CO2)));

%---Valutazione delle moli all'equilibrio

chimico---eqn_left=n_CO*n_O2^(1/2)/(n_CO2*n_tot^(1/2)); %Equazioni per l'equilibrio K=double(K_T*(p)^(-(1+1/2-1))); %Costante totale di equilibrio if K_T<10^-10

n_CO=0; %assenza di dissociazione else

n_CO=f_zero(inline(char(eqn_left-K)),[0.001 1.99*n]); %Risoluzione dell'eq.ne end

n_CO2=2*a-2*n_C2H6-n_CO; n_H2O=3*a+c-3*n_C2H6;

n_O2=(2*b+c-n_H2O-2*n_CO2-n_CO)/2;

Le seguenti funzioni definiscono il modello termodinamico per la prima fase di svuotamento

del serbatoio, con l’etano in condizione bifase.

function varargout = odetank1

(t,y,flag,V,conc,p_amb,k_fuel,k_ox,A_star,phi,p_prec,T_prec)

% File per l'integrazione delle equazioni che regolano % l'equilibrio in stato bi-fase del serbatoio

%

% Variabili aggiuntive:

% phi = rapporto di miscelamento: portata di H2O2 su portata di C2H6 % V = Volume totale serbatoio [m^3]

% conc = concentrazione del perossido di idrogeno come percentuale in peso

%---switch flag

case '' % Return dy/dt = f(t,y). [varargout{1:8}] = f(t,y,V,conc,p_amb,k_fuel,k_ox,A_star,phi,p_prec,T_prec);

case 'events' % Return [value,isterminal,direction]. [M,cp,rho,Tf]=perossido(conc);

[varargout{1:3}] = events(t,y,Tf); otherwise

(14)

end

function [phi,p_chamber,T_chamber,q_fuel,q_ox,c_star,C_F,dydt] = f(t,y,V,conc,p_amb,k_fuel,k_ox,A_star,phi,p_prec,T_prec)

% ---Immissione dati Etano---dati=etano('all'); T=dati{1}; p=dati{2}; %[kPa] hL=dati{7}; %[kJ/kg] hV=dati{8}; %[kJ/kg] vL=dati{5}; %[m^3/kg] vV=dati{6}; %[m^3/kg] Qv=hV-hL; %[kJ/kg] Qv=interp1(T,Qv,t); %[kJ/kg] T0=25+273.15; %[K] p0=100; %[kPa]

% ---Immissione dati Perossido di Idrogeno---[M_H2O2,cpO,rhoO]=perossido(conc);

vO=1/rhoO; %[m^3/kg]

h0=-258.8*M_H2O2/1000; %[kJ/kg]

hO=h0+cpO*(T-T0)+vO*(p-p0); %[kJ/kg] % ---Calcolo rapporto di

miscelamento---p_tank=interp1(T,p,t); if nargin<10 [p_chamber,T_chamber,phi,q_fuel,q_ox,c_star,C_F]= portate(p_tank/100,p_amb,8,conc,k_fuel,k_ox,A_star); else [p_chamber,T_chamber,phi,q_fuel,q_ox,c_star,C_F]= portate(p_tank/100,p_amb,8,conc,k_fuel,k_ox,A_star,p_prec,T_prec); end phi=1/phi;

% ---Equazioni che regolano l'equilibrio bi-fase nel

serbatoio---F(1)=y(1)/Qv*DYDX(T,hL,t)+y(2)/Qv*DYDX(T,hV,t)+y(3)/Qv*DYDX(T,hO,t)-V/Qv*DYDX(T,p,t); F(2)= -(phi*(y(1)*DYDX(T,vL,t)+y(2)*DYDX(T,vV,t))+(vO+phi*interp1(T,vL,t))*F(1))/(phi*interp1(T,vV,t)+vO); F(3)=((interp1(T,vV,t)-interp1(T,vL,t))*F(1)-y(1)*DYDX(T,vL,t)-y(2)*DYDX(T,vV,t))/(phi*interp1(T,vV,t)+vO); dydt = F(:); phi=1/phi;

function [value,isterminal,direction] = events(t,y,Tf)

% ---Condizioni di Termine---value = [y(1),y(3),t-Tf]; % condizioni su mL_C2H6 , m_H2O2 , T isterminal = [1,1,1];

direction = [0,0,0];

% ---function out=DYDX(X,Y,x0)

% ---Approssima la derivata linearmente---i=find((X-x0)==0);

(15)

i=1;

while i<length(X) if x0>X(i) & x0<X(i+1)

out=(Y(i+1)-Y(i))/(X(i+1)-X(i)); i=length(X)+1; end i=i+1; end else out=Y(i); end if x0>X(end) | x0<X(1)

error('valore esterno all''intervallo disponibile') end

Le seguenti funzioni definiscono il modello termodinamico per la seconda fase di svuotamento

del serbatoio, dove si è esaurita la fase liquida.

function varargout= odetank2

(t,y,flag,V,conc,aV,p_amb,k_fuel,k_ox,A_star,phi,p_prec,T_prec)

% File per l'integrazione delle equazioni che regolano % l'equilibrio per la presenza di solo etano in fase % vapore considerato come gas di Van der Waals %

% Variabili aggiuntive:

% phi = rapporto di miscelamento: portata di H2O2 su portata di C2H6 % V = Volume totale serbatoio [m^3]

% conc = concentrazione del perossido di idrogeno come percentuale in peso

%---switch flag

case '' % Return dy/dt = f(t,y).

[varargout{1:8}] = f(t,y,V,conc,aV,p_amb,k_fuel,k_ox,A_star,phi,p_prec,T_prec); case 'events' % Return [value,isterminal,direction]. [varargout{1:3}] = events(t,y);

otherwise

error(['Unknown flag ''' flag '''.']); end

function [phi,p_chamber,T_chamber,q_fuel,q_ox,c_star,C_F,dydt] = f(t,y,V,conc,aV,p_amb,k_fuel,k_ox,A_star,phi,p_prec,T_prec)

%---Immissione dati Perossido di Idrogeno---[M_H202,cpO,rhoO]=perossido(conc);

vO=1/rhoO;

%---Immissione dati Etano---dati=etano('all');

R=8.31; %[J/(mol*K)] Costante universale dei gas M=30.07; %[gr/mol] peso molare dell'etano RV=R/M; %[kJ/(kg*K)]

VdW=dati{12}; %costanti di Van der Waals bV=VdW(2);

vV=(V-y(2)*vO)/(y(1)); cv=dati{13};

(16)

p=1/1000*(RV*y(3)/(vV-bV)-aV/(vV*vV)); %[MPa]

%-Calcolo condizioni in CC

---p_tank=p; [p_chamber,T_chamber,phi,q_fuel,q_ox,c_star,C_F]=portate(p_tank*10,p_amb,8,conc,k_fuel,k_ox,A_star); phi=1/phi;

% ---Equazioni per la presenza di solo etano gassoso nel serbatoio---F(1)=-q_fuel; F(2)=-q_ox; F(3)=q_fuel/((y(1)*cvV+y(2)*cpO)/(2*aV/vV^2-RV*y(3)/(vV-bV))/(vV+vO/phi)); dydt = F(:); phi=1/phi; %---function [value,isterminal,direction] = events(t,y)

%---value = [y(1) y(2) y(3)]; % condizioni su mV_C2H6 , m_H2O2 isterminal = [1 1 1];

direction = [0 0 0];

La seguente funzione è la Ode45 che fa parte del pacchetto Matlab 6.5, si riporta in quanto si

sono fatte delle modifiche all’interno del programma. Le modifiche non sono sostanziali ma la loro

presenza è obbligatoria per permettere l’esecuzione di tutte le altre funzioni. Questa funzione esegue

l’integrazione vera e propria con un metodo di Runge-Kutta del quarto ordine.

function varargout = ode45bis(ode,tspan,y0,options,varargin)

stats = struct('nsteps',0,'nfailed',0,'nfevals',0,... 'npds',0,'ndecomps',0,'nsolves',0); % Check inputs if nargin < 4 options = []; if nargin < 3 y0 = []; if nargin < 2 tspan = []; if nargin < 1

error('Not enough input arguments. See ODE45.'); end

end end end

FcnHandlesUsed = isa(ode,'function_handle'); soloutRequested = (FcnHandlesUsed & (nargout==1)); % Set solver arguments

[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, args, ...

options, atol, rtol, threshold, normcontrol, normy, hmax, htry, htspan] ... = odearguments(FcnHandlesUsed,'ode45bis', ode, tspan, y0, options, ... soloutRequested, varargin); stats.nfevals = stats.nfevals + 1; phi=args{end-2}; p_chamber=args{end-1}; T_chamber=args{end}; % q_fuel=args{end-1}; % q_ox=args{end};

(17)

% Handle the output if nargout > 0 outfun = odeget(options,'OutputFcn',[],'fast'); else outfun = odeget(options,'OutputFcn',@odeplot,'fast'); end if isempty(outfun) haveoutfun = false; else haveoutfun = true; outputs = odeget(options,'OutputSel',1:neq,'fast'); if isa(outfun,'function_handle') outputArgs = [{''},varargin]; outputArgs1 = varargin;

else % With v5 syntax do not pass additional input arguments to outfun outputArgs = {}; outputArgs1 = {}; end end if soloutRequested refine = 1; else refine = odeget(options,'Refine',4,'fast'); end if ntspan > 2

outflag = 1; % output only at tspan points elseif refine <= 1

outflag = 2; % computed points, no refinement else

outflag = 3; % computed points, with refinement S = (1:refine-1)' / refine;

end

printstats = strcmp(odeget(options,'Stats','off','fast'),'on'); % Handle the event function

[haveeventfun,eventfun,eventargs,valt,teout,yeout,ieout] = ... odeevents(FcnHandlesUsed,ode,t0,y0,options,varargin); % Handle the mass matrix

[Mtype, Mfun, Margs, M] = odemass(FcnHandlesUsed,ode,t0,y0,options,varargin); if Mtype>0 % non-trivial mass matrix

Msingular = odeget(options,'MassSingular','no','fast'); if strcmp(Msingular,'maybe')

warning('MATLAB:ode45:MassSingularAssumedNo',['ODE45 assumes ' ... 'MassSingular is ''no''. See ODE15S or ODE23T.']);

elseif strcmp(Msingular,'yes')

error(['MassSingular cannot be ''yes'' for this solver. See ODE15S '... ' or ODE23T.']); end if Mtype == 1 [L,U] = lu(M); else L = []; U = []; end

(18)

[ode,args] = odemassexplicit(FcnHandlesUsed,Mtype,ode,args,Mfun,Margs,L,U); % Recompute f0, this time fun takes care about the mass matrix

f0 = feval(ode,t0,y0,args{:}); stats.nfevals = stats.nfevals + 1; end

t = t0; y = y0;

% Allocate memory if we're generating output. if nargout > 0

if ntspan > 2 % output only at tspan points tout = zeros(ntspan,1);

yout = zeros(ntspan,neq);

else % alloc in chunks

chunk = min(max(100,50*refine),floor((2^13)/neq)); tout = zeros(chunk,1); yout = zeros(chunk,neq); if soloutRequested f3d = zeros(chunk,neq,7); end end nout = 1; tout(nout) = t; yout(nout,:) = y.'; phi_out(nout)=phi; p_chamber_out(nout)=p_chamber; T_chamber_out(nout)=T_chamber; % q_fuel_out(nout)=q_fuel; % q_ox_out(nout)=q_ox; end

% Initialize method parameters. pow = 1/5; A = [1/5; 3/10; 4/5; 8/9; 1; 1]; B = [ 1/5 3/40 44/45 19372/6561 9017/3168 35/384 0 9/40 -56/15 -25360/2187 -355/33 0 0 0 32/9 64448/6561 46732/5247 500/1113 0 0 0 -212/729 49/176 125/192 0 0 0 0 -5103/18656 -2187/6784 0 0 0 0 0 11/84 0 0 0 0 0 0 ]; E = [71/57600; 0; -71/16695; 71/1920; -17253/339200; 22/525; -1/40]; f = zeros(neq,7); hmin = 16*eps*abs(t); if isempty(htry)

% Compute an initial step size h using y'(t). absh = min(hmax, htspan);

if normcontrol

rh = (norm(f0) / max(normy,threshold)) / (0.8 * rtol^pow); else

rh = norm(f0 ./ max(abs(y),threshold),inf) / (0.8 * rtol^pow); end

(19)

absh = 1 / rh; end

absh = max(absh, hmin); else

absh = min(hmax, max(hmin, htry)); end

f(:,1) = f0;

% Initialize the output function. if haveoutfun

feval(outfun,[t tfinal],y(outputs),'init',outputArgs1{:}); end

% THE MAIN LOOP done = false; while ~done

% By default, hmin is a small number such that t+hmin is only slightly % different than t. It might be 0 if t is 0.

hmin = 16*eps*abs(t);

absh = min(hmax, max(hmin, absh)); % couldn't limit absh until new hmin h = tdir * absh;

% Stretch the step if within 10% of tfinal-t. if 1.1*absh >= abs(tfinal - t)

h = tfinal - t; absh = abs(h); done = true; end

% LOOP FOR ADVANCING ONE STEP. nofailed = true; % no failed attempts while true hA = h * A; hB = h * B; [phi(2),p_chamber(2),T_chamber(2),q_fuel(2),q_ox(2),c_star(2),C_F(2),f(:,2)] = ... feval(ode,t+hA(1),y+f*hB(:,1),args{1:end-3},phi(end),p_chamber(end),T_chamber(end)); [phi(3),p_chamber(3),T_chamber(3),q_fuel(3),q_ox(3),c_star(3),C_F(3),f(:,3)] = ... feval(ode,t+hA(2),y+f*hB(:,2),args{1:end-3},phi(2),p_chamber(2),T_chamber(2)); [phi(4),p_chamber(4),T_chamber(4),q_fuel(4),q_ox(4),c_star(4),C_F(4),f(:,4)] = ... feval(ode,t+hA(3),y+f*hB(:,3),args{1:end-3},phi(3),p_chamber(3),T_chamber(3)); [phi(5),p_chamber(5),T_chamber(5),q_fuel(5),q_ox(5),c_star(5),C_F(5),f(:,5)] = ... feval(ode,t+hA(4),y+f*hB(:,4),args{1:end-3},phi(4),p_chamber(4),T_chamber(4)); [phi(6),p_chamber(6),T_chamber(6),q_fuel(6),q_ox(6),c_star(6),C_F(6),f(:,6)] = ... feval(ode,t+hA(5),y+f*hB(:,5),args{1:end-3},phi(5),p_chamber(5),T_chamber(5)); tnew = t + hA(6); if done

tnew = tfinal; % Hit end point exactly. end h = tnew - t; % Purify h. ynew = y + f*hB(:,6); [phi(7),p_chamber(7),T_chamber(7),q_fuel(7),q_ox(7),c_star(7),C_F(7),f(:,7)] = ... feval(ode,tnew,ynew,args{1:end-3},phi(6),p_chamber(6),T_chamber(6)); phi_new=phi; p_chamber_new=p_chamber; T_chamber_new=T_chamber; q_fuel_new=q_fuel; q_ox_new=q_ox;

(20)

c_star_new=c_star; C_F_new=C_F;

stats.nfevals = stats.nfevals + 6; % Estimate the error.

if normcontrol

normynew = norm(ynew);

err = absh * (norm(f * E) / max(max(normy,normynew),threshold)); else

err = absh * norm((f * E) ./ max(max(abs(y),abs(ynew)),threshold),inf); end

% Accept the solution only if the weighted error is no more than the % tolerance rtol. Estimate an h that will yield an error of rtol on % the next step or the next try at taking this step, as the case may be, % and use 0.8 of this value to avoid failures.

if err > rtol % Failed step stats.nfailed = stats.nfailed + 1; if absh <= hmin

warning('MATLAB:ode45:IntegrationTolNotMet',['Failure at t=%e. ' ... 'Unable to meet integration tolerances without reducing ' ... 'the step size below the smallest value allowed (%e) ' ... 'at time t.'],t,hmin);

if haveoutfun

feval(outfun,[],[],'done',outputArgs1{:}); end

if printstats % print cost statistics fprintf('%g successful steps\n', stats.nsteps); fprintf('%g failed attempts\n', stats.nfailed); fprintf('%g function evaluations\n', stats.nfevals); fprintf('%g partial derivatives\n', stats.npds); fprintf('%g LU decompositions\n', stats.ndecomps); fprintf('%g solutions of linear systems\n', stats.nsolves); end if nargout > 0 if soloutRequested sol.x = tout(1:nout).'; sol.y = yout(1:nout,:).'; sol.solver = 'ode45'; sol.idata.f3d = f3d(1:nout,:,:); if haveeventfun sol.xe = teout.'; sol.ye = yeout.'; sol.ie = ieout.'; end varargout{1} = sol; else varargout{1} = tout(1:nout); varargout{2} = yout(1:nout,:); if haveeventfun varargout{3} = teout; varargout{4} = yeout; varargout{5} = ieout; if ~FcnHandlesUsed

(21)

stats.npds; stats.ndecomps; stats.nsolves]; end

else

if ~FcnHandlesUsed

varargout{3} = [stats.nsteps; stats.nfailed; stats.nfevals; ... stats.npds; stats.ndecomps; stats.nsolves];

end end end end return; end if nofailed nofailed = false;

absh = max(hmin, absh * max(0.1, 0.8*(rtol/err)^pow)); else

absh = max(hmin, 0.5 * absh); end

h = tdir * absh; done = false;

else % Successful step break; end end stats.nsteps = stats.nsteps + 1; if haveeventfun [te,ye,ie,valt,stop] = ... odezero(@ntrp45,eventfun,eventargs,valt,t,y,tnew,ynew,t0,h,f); nte = length(te); if nte > 0 if soloutRequested | nargout > 2 teout = [teout; te];

yeout = [yeout; ye.']; ieout = [ieout; ie]; end

if stop % stop on a terminal event

if ~soloutRequested % preserve tnew,ynew when sol requested tnew = te(nte); ynew = ye(:,nte); end done = true; end end end if nargout > 0 oldnout = nout;

if outflag == 3 % computed points, with refinement nout = nout + refine;

if nout > length(tout)

tout = [tout; zeros(chunk,1)]; % requires chunk >= refine yout = [yout; zeros(chunk,neq)];

(22)

i = oldnout+1:nout-1; tout(i) = t + (tnew-t)*S; yout(i,:) = ntrp45(tout(i),t,y,[],[],h,f).'; tout(nout) = tnew; yout(nout,:) = ynew.'; % ******************************************************* % ******************* OUTPUT *********************** % ******************************************************* phi_out(i)=interp1(t+hA(1:5),phi(2:6)',tout(i),'linear','extrap'); phi_out(nout)=phi(7); p_chamber_out(i)=interp1(t+hA(1:5),p_chamber(2:6)',tout(i),'linear','extrap'); p_chamber_out(nout)=p_chamber(7); T_chamber_out(i)=interp1(t+hA(1:5),T_chamber(2:6)',tout(i),'linear','extrap'); T_chamber_out(nout)=T_chamber(7); q_fuel_out(i)=interp1(t+hA(1:5),q_fuel(2:6)',tout(i),'linear','extrap'); q_fuel_out(nout)=q_fuel(7); q_ox_out(i)=interp1(t+hA(1:5),q_ox(2:6)',tout(i),'linear','extrap'); q_ox_out(nout)=q_ox(7); c_star_out(i)=interp1(t+hA(1:5),c_star(2:6)',tout(i),'linear','extrap'); c_star_out(nout)=c_star(7); C_F_out(i)=interp1(t+hA(1:5),C_F(2:6)',tout(i),'linear','extrap'); C_F_out(nout)=C_F(7); % *********************************************************** elseif outflag == 2 % computed points, no refinement

nout = nout + 1; if nout > length(tout)

tout = [tout; zeros(chunk,1)]; yout = [yout; zeros(chunk,neq)]; if soloutRequested f3d = [f3d; zeros(chunk,neq,7)]; end end tout(nout) = tnew; yout(nout,:) = ynew.'; if soloutRequested f3d(nout,:,:) = f; end

elseif outflag == 1 % output only at tspan points while next <= ntspan

if tdir * (tnew - tspan(next)) < 0 if haveeventfun & done nout = nout + 1; tout(nout) = tnew; yout(nout,:) = ynew.'; end

break;

elseif tnew == tspan(next) nout = nout + 1; tout(nout) = tnew; yout(nout,:) = ynew.'; phi_out(nout)=phi_new; p_chamber_out(nout)=p_chamber_new; T_chamber_out(nout)=T_chamber_new;

(23)

q_fuel_out(nout)=q_fuel_new; q_ox_out(nout)=q_ox_new; C_F_out(nout)=C_F_new; c_star_out(nout)=c_star_new; next = next + 1; break; end

nout = nout + 1; % tout and yout are already allocated tout(nout) = tspan(next); yout(nout,:) = ntrp45(tspan(next),t,y,[],[],h,f).'; next = next + 1; end end if haveoutfun i = oldnout+1:nout;

if ~isempty(i) & (feval(outfun,tout(i),yout(i,outputs).',outputArgs{:}) == 1) feval(outfun,[],[],'done',outputArgs1{:}); if soloutRequested sol.x = tout(1:nout).'; sol.y = yout(1:nout,:).'; sol.solver = 'ode45'; sol.idata.f3d = f3d(1:nout,:,:); if haveeventfun sol.xe = teout.'; sol.ye = yeout.'; sol.ie = ieout.'; end varargout{1} = sol; else varargout{1} = tout(1:nout); varargout{2} = yout(1:nout,:); if haveeventfun varargout{3} = teout; varargout{4} = yeout; varargout{5} = ieout; if ~FcnHandlesUsed

varargout{6} = [stats.nsteps; stats.nfailed; stats.nfevals; ... stats.npds; stats.ndecomps; stats.nsolves];

end else

if ~FcnHandlesUsed

varargout{3} = [stats.nsteps; stats.nfailed; stats.nfevals; ... stats.npds; stats.ndecomps; stats.nsolves];

end end end return; end end elseif haveoutfun

if outflag == 3 % computed points, with refinement tinterp = t + (tnew-t)*S;

(24)

if feval(outfun,[tinterp; tnew],[yinterp(outputs,:),ynew(outputs)],outputArgs{:}) == 1 feval(outfun,[],[],'done',outputArgs1{:}); return; end elseif outflag == 2 if feval(outfun,tnew,ynew(outputs),outputArgs{:}) == 1 feval(outfun,[],[],'done',outputArgs1{:}); return; end

elseif outflag == 1 % output only at tspan points ninterp = 0;

while next <= ntspan

if tdir * (tnew - tspan(next)) < 0 if haveeventfun & done ninterp = ninterp + 1; tinterp(ninterp,1) = tnew; yinterp(:,ninterp) = ynew; end

break;

elseif tnew == tspan(next) ninterp = ninterp + 1; tinterp(ninterp,1) = tnew; yinterp(:,ninterp) = ynew; next = next + 1; break; end ninterp = ninterp + 1; tinterp(ninterp,1) = tspan(next); yinterp(:,ninterp) = ntrp45(tspan(next),t,y,[],[],h,f); next = next + 1; end if ninterp > 0 if feval(outfun,tinterp(1:ninterp),yinterp(outputs,1:ninterp),outputArgs{:}) == 1 feval(outfun,[],[],'done',outputArgs1{:}); return; end end end end

% If there were no failures compute a new h. if nofailed

% Note that absh may shrink by 0.8, and that err may be 0. temp = 1.25*(err/rtol)^pow;

if temp > 0.2 absh = absh / temp; else

absh = 5.0*absh; end

end

% Advance the integration one step. t = tnew;

y = ynew; if normcontrol

(25)

normy = normynew; end

f(:,1) = f(:,7); % Already evaluated feval(ode,tnew,ynew,args)

end

if haveoutfun

feval(outfun,[],[],'done',outputArgs1{:}); end

if printstats % print cost statistics fprintf('%g successful steps\n', stats.nsteps); fprintf('%g failed attempts\n', stats.nfailed); fprintf('%g function evaluations\n', stats.nfevals); fprintf('%g partial derivatives\n', stats.npds); fprintf('%g LU decompositions\n', stats.ndecomps); fprintf('%g solutions of linear systems\n', stats.nsolves); end if nargout > 0 if soloutRequested sol.x = tout(1:nout).'; sol.y = yout(1:nout,:).'; sol.solver = 'ode45'; sol.idata.f3d = f3d(1:nout,:,:); if haveeventfun sol.xe = teout.'; sol.ye = yeout.'; sol.ie = ieout.'; end varargout{1} = sol; else varargout{1} = tout(1:nout); varargout{2} = yout(1:nout,:); if haveeventfun varargout{3} = teout; varargout{4} = yeout; varargout{5} = ieout; varargout{6} = phi_out'; varargout{7} = p_chamber_out'; varargout{8} = T_chamber_out'; varargout{9} = q_fuel_out'; varargout{10} = q_ox_out'; varargout{11} = c_star_out'; varargout{12} = C_F_out'; if ~FcnHandlesUsed

varargout{13} = [stats.nsteps; stats.nfailed; stats.nfevals; ... stats.npds; stats.ndecomps; stats.nsolves];

end else

if ~FcnHandlesUsed

varargout{3} = [stats.nsteps; stats.nfailed; stats.nfevals; ... stats.npds; stats.ndecomps; stats.nsolves];

end end end

(26)

end

Regolazione sonica della portata di etano

La seguente funzione, calcola il valore delle costanti, come illustrato al Capitolo 4, che

regolano la portata dei propellenti in caso di regolazione sonica della portata di etano.

function [k_C2H6,k_H2O2,A_star]=design_parameters (T_C2H6,T_H2O2,p_des_chamber,p_amb,F_des,phi_des,conc)

% Inputs:

% T_C2H6 [°K] Temperatura dell’etano in ingresso % T_H2O2 [°K] Temperatura dell’HP in ingresso % p_des_chamber [atm] Pressione di design in camera % p_amb [atm] Pressione ambiente

% F_des [N] Spinta di design

% phi_des [--] Rapporto di miscelamento di design % conc [--] Concentrazione in peso HP %Outputs:

% k_C2H6 [m s] Parametro di portata del C2H6 % k_H2O2 [kg^1/2 m^1/2] Parametro di portata del H2O2 % A_star [m^2] Sezione di gola ugello

global R

global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 dati=etano('all'); p_tank=interp1(dati{1},dati{2},T_C2H6)/100; [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber (0.1,0.1*phi_des/conc,T_C2H6,T_H2O2,p_des_chamber,conc,1); n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot; M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/M_miscela; m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela; C_F=sqrt(2*gamma^2/(gamma-1)*(2/(gamma+1))^((gamma+1)/(gamma-1))... *(1-(p_amb/p_des_chamber)^((gamma-1)/gamma))); c_star=sqrt(1/gamma*((gamma+1)/2)^((gamma+1)/(gamma-1))*R/M_miscela*T0_chamber); %[m/s] q_tot=F_des/(C_F*c_star); %[kg/s]

(27)

q_C2H6=q_tot/(1+phi_des); %[kg/s] q_H2O2=q_tot-q_C2H6; %[kg/s] k_C2H6=q_C2H6/p_tank;

k_H2O2=q_H2O2/sqrt(p_tank-p_des_chamber); A_star=F_des/(101300*p_des_chamber*C_F);

La seguente funzione, dato il valore delle costanti, come illustrato al Capitolo 4, che regolano

la portata dei propellenti in caso di regolazione sonica della portata di etano, calcola la portata stessa

sulla base della conoscena della pressione del serbatoio e della pressione in camera.

function [p_chamber,T_chamber,phi,q_fuel,q_ox,c_star,C_F]=portate (p_tank,p_amb,phi,conc,k_fuel,k_ox,A_star,p_guess,T_guess)

% Inputs:

% p_tank [Pa] Pressione nel serbatoio % p_amb [Pa] Pressione ambiente % phi [--] Rapporto di miscelamento % conc [--] Concentrazione in peso HP % k_fuel [m s] Parametro di portata del C2H6 % k_ox [kg^1/2 m^1/2] Parametro di portata del H2O2 % A_star [m^2] Sezione di gola ugello %Outputs:

p_chamber [Pa] Pressione in CC T_chamber [°K] Temperatura in CC Phi [--] Rapporto di miscelamento q_fuel [kg s^-1] Portata di C2H6

q_ox [kg s^-1] Portata di HP c_star [m s^-1] Velocità caratteristica C_F [--] Coeff. Di spinta

global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 global R

T_C2H6=300; T_H2O2=973.15;

%---%---CALCOLO DELLE CONDIZIONI DI INGRESSO--- %---%---inizializzazione delle condizioni ipotizzate in camera---if nargin==7

p_chamber=10; %nel caso non ci sia un'ipotesi sulla pressione in camera else p_chamber=p_guess; end if nargin < 9 [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]= chamber(1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1); else

%Questo ramo da un risultato analogo al precedente, ma in un numero minore di cicli se T_guess ? vicino al risultato

(28)

(1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1,874,T_guess); end

%---calcolo delle frazioni molari---n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---calcolo delle propriet? della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/M_miscela; m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela; %---%---CICLO PRINCIPALE--- %---epsilon=100; %inizializzazione dell'errore

count=0; %contatore dei passi d'iterazione while epsilon>10^-1 & count<10^2

%---Calcolo delle caratteristiche del c_star=sqrt(1/gamma*((gamma+1)/2)^((gamma+1)/(gamma-1))

*R/M_miscela*T0_chamber); q_fuel=k_fuel*p_tank;

q_ox=k_ox*sqrt(p_tank-750e-6); q_tot=q_fuel+q_ox;

%---Calcolo della temperatura e della pressione in camera di combustione---p_i=p_chamber; %variabile d'appoggio per il calcolo dell'errore p_chamber=q_tot*c_star/A_star/101300;

[T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber (q_fuel,q_ox,300,973.15,p_chamber,0.85,1,874,T0_chamber);

%---Calcolo delle frazioni n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---Calcolo delle propriet? della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/(M_miscela); m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela;

phi=q_ox/q_fuel; %rapporto di miscelazione dovuto alle portate in ingresso count=count+1;

(29)

epsilon=abs(double(p_chamber-p_i)); %errore calcolato sulla pressione end

if count==10^2

warning('Uscita dal ciclo di P_chamber') end

T_chamber=T0_chamber;

C_F=sqrt(2*gamma^2/(gamma-1)*(2/(gamma+1))^((gamma+1)/(gamma-1))... *(1-(p_amb/p_chamber)^((gamma-1)/gamma)));

Regolazione subsonica della portata di etano

La seguente funzione, calcola il valore delle costanti, come illustrato al Capitolo 4, che

regolano la portata dei propellenti in caso di regolazione subsonica della portata di etano.

function [k_C2H6,k_H2O2,A_star]=design_parameters (T_C2H6,T_H2O2,p_des_chamber,p_amb,F_des,phi_des,conc)

% Inputs:

% T_C2H6 [°K] Temperatura dell’etano in ingresso % T_H2O2 [°K] Temperatura dell’HP in ingresso % p_des_chamber [atm] Pressione di design in camera % p_amb [atm] Pressione ambiente

% F_des [N] Spinta di design

% phi_des [--] Rapporto di miscelamento di design % conc [--] Concentrazione in peso HP %Outputs:

% k_C2H6 [kg^1/2 m^1/2] Parametro di portata del C2H6 % k_H2O2 [kg^1/2 m^1/2] Parametro di portata del H2O2 % A_star [m^2] Sezione di gola ugello

global R

global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 dati=etano('all'); p_tank=interp1(dati{1},dati{2},T_C2H6)/100; [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber (0.1,0.1*phi_des/conc,T_C2H6,T_H2O2,p_des_chamber,conc,1); n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot; M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/M_miscela; m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO...

(30)

+subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela; C_F=sqrt(2*gamma^2/(gamma-1)*(2/(gamma+1))^((gamma+1)/(gamma-1))... *(1-(p_amb/p_des_chamber)^((gamma-1)/gamma))); c_star=sqrt(1/gamma*((gamma+1)/2)^((gamma+1)/(gamma-1))*R/M_miscela*T0_chamber); %[m/s] q_tot=F_des/(C_F*c_star); %[kg/s] q_C2H6=q_tot/(1+phi_des); %[kg/s] q_H2O2=q_tot-q_C2H6; %[kg/s] k_C2H6=q_C2H6/sqrt(p_tank-p_des_chamber); k_H2O2=q_H2O2/sqrt(p_tank-p_des_chamber); A_star=F_des/(101300*p_des_chamber*C_F);

La seguente funzione, dato il valore delle costanti, come illustrato al Capitolo 4, che regolano

la portata dei propellenti in caso di regolazione subsonica della portata di etano, calcola la portata

stessa sulla base della conoscena della pressione del serbatoio e della pressione in camera.

function [p_chamber,T_chamber,phi,q_fuel,q_ox,c_star,C_F]=portate (p_tank,p_amb,phi,conc,k_fuel,k_ox,A_star,p_guess,T_guess)

% Inputs:

% p_tank [Pa] Pressione nel serbatoio % p_amb [Pa] Pressione ambiente % phi [--] Rapporto di miscelamento % conc [--] Concentrazione in peso HP % k_fuel [kg^1/2 m^1/2] Parametro di portata del C2H6 % k_ox [kg^1/2 m^1/2] Parametro di portata del H2O2 % A_star [m^2] Sezione di gola ugello %Outputs:

p_chamber [Pa] Pressione in CC T_chamber [°K] Temperatura in CC Phi [--] Rapporto di miscelamento q_fuel [kg s^-1] Portata di C2H6

q_ox [kg s^-1] Portata di HP c_star [m s^-1] Velocità caratteristica C_F [--] Coeff. Di spinta

global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 global R

T_C2H6=300; T_H2O2=973.15;

%---%---CALCOLO DELLE CONDIZIONI DI INGRESSO- %---%---inizializzazione delle condizioni ipotizzate in camera---if nargin==7

p_chamber=10; %nel caso non ci sia un'ipotesi sulla pressione in camera else

(31)

end

if nargin < 9 [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]= chamber(1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1); else

%Questo ramo da un risultato analogo al precedente, ma in un numero minore di cicli se T_guess ? vicino al risultato

[T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber

(1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1,874,T_guess); end

%---calcolo delle frazioni molari---n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---calcolo delle propriet? della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/M_miscela; m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela; %---%---CICLO PRINCIPALE--- %---epsilon=100; %inizializzazione dell'errore

count=0; %contatore dei passi d'iterazione C1=(k_fuel*(1+phi))^2/A_star^2;

while epsilon>10^-1 & count<10^2

%---Calcolo delle caratteristiche del c_star=sqrt(1/gamma*((gamma+1)/2)^((gamma+1)/(gamma-1))*

R/M_miscela*T0_chamber);

%---Calcolo della temperatura e della pressione in camera di p_i=p_chamber; %variabile d'appoggio per il calcolo dell'errore

p_chamber=(-C1*c_star^2/101300^2+sqrt((C1*c_star^2/101300^2)^2+4*C1*c_star^2/101300^2*p_tank))/2; [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber

(1,phi/conc,300,973.15,p_chamber,0.85,1,874,T0_chamber); %---Calcolo delle frazioni n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---Calcolo delle propriet? della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/(M_miscela);

m_miscela=n_tot*M_miscela;

cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO...

(32)

+subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela;

gamma=cp_miscela/cv_miscela; count=count+1;

epsilon=abs(double(p_chamber-p_i)); %errore calcolato sulla pressione end

if count==10^2

warning('Uscita dal ciclo di P_chamber') end T_chamber=T0_chamber; C_F=sqrt(2*gamma^2/(gamma-1)*(2/(gamma+1))^((gamma+1)/(gamma-1))... *(1-(p_amb/p_chamber)^((gamma-1)/gamma))); q_fuel=k_fuel*sqrt(p_tank-p_chamber); q_ox=(-c_star+sqrt(c_star^2+4*(101300*A_star/k_ox^2*(101300*p_tank*A_star-c_star*q_fuel))))/(2*101300*A_star/k_ox^2); q_tot=q_fuel+q_ox;

Regolazione sonica della portata di etano e utilizzo del venturi cavitante

La seguente funzione, calcola il valore delle costanti, come illustrato al Capitolo 4, che

regolano la portata dei propellenti in caso di regolazione sonica della portata di etano e dell’utilizzo di

un venturi cavitante sulla linea del perossido di idrogeno.

function [k_C2H6,k_H2O2,A_star]=design_parameters (T_C2H6,T_H2O2,p_des_chamber,p_amb,F_des,phi_des,conc)

% Inputs:

% T_C2H6 [°K] Temperatura dell’etano in ingresso % T_H2O2 [°K] Temperatura dell’HP in ingresso % p_des_chamber [atm] Pressione di design in camera % p_amb [atm] Pressione ambiente

% F_des [N] Spinta di design

% phi_des [--] Rapporto di miscelamento di design % conc [--] Concentrazione in peso HP %Outputs:

% k_C2H6 [m s] Parametro di portata del C2H6 % k_H2O2 [kg^1/2 m^1/2] Parametro di portata del H2O2 % A_star [m^2] Sezione di gola ugello

global R

global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 dati=etano('all'); p_tank=interp1(dati{1},dati{2},T_C2H6)/100; [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber (0.1,0.1*phi_des/conc,T_C2H6,T_H2O2,p_des_chamber,conc,1); n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot;

(33)

x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot; M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/M_miscela; m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela; C_F=sqrt(2*gamma^2/(gamma-1)*(2/(gamma+1))^((gamma+1)/(gamma-1))... *(1-(p_amb/p_des_chamber)^((gamma-1)/gamma))); c_star=sqrt(1/gamma*((gamma+1)/2)^((gamma+1)/(gamma-1))*R/M_miscela*T0_chamber); %[m/s] q_tot=F_des/(C_F*c_star); %[kg/s] q_C2H6=q_tot/(1+phi_des); %[kg/s] q_H2O2=q_tot-q_C2H6; %[kg/s] p_v=750e-6; %[Pa] k_C2H6=q_C2H6/p_tank; k_H2O2=q_H2O2/sqrt(p_tank-p_v); A_star=F_des/(101300*p_des_chamber*C_F); function [p_chamber,T_chamber,phi,q_fuel,q_ox,c_star,C_F]=portate (p_tank,p_amb,phi,conc,k_fuel,k_ox,A_star,p_guess,T_guess) global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 global R

T_C2H6=300; T_H2O2=973.15;

%---%---CALCOLO DELLE CONDIZIONI DI INGRESSO- %---%---inizializzazione delle condizioni ipotizzate in camera---if nargin==7

p_chamber=10; %nel caso non ci sia un'ipotesi sulla pressione in camera else p_chamber=p_guess; end if nargin < 9 [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber (1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1); else

%Questo ramo da un risultato analogo al precedente, ma in un numero minore di cicli se T_guess ? vicino al risultato [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=

chamber(1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1,874,T_guess); end

%---calcolo delle frazioni molari---n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O;

(34)

x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---calcolo delle propriet? della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/M_miscela; m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela; %---%---CICLO PRINCIPALE--- %---epsilon=100; %inizializzazione dell'errore

count=0; %contatore dei passi d'iterazione while epsilon>10^-1 & count<10^2

%---Calcolo delle caratteristiche del c_star=sqrt(1/gamma*((gamma+1)/2)^((gamma+1)/(gamma-1))* R/M_miscela*T0_chamber); % gamma % M_miscela % T0_chamber q_fuel=k_fuel*p_tank; q_ox=k_ox*sqrt(p_tank-750e-6); q_tot=q_fuel+q_ox;

%---Calcolo della temperatura e della pressione in camera di p_i=p_chamber; %variabile d'appoggio per il calcolo dell'errore p_chamber=q_tot*c_star/A_star/101300;

[T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber

(q_fuel,q_ox,300,973.15,p_chamber,0.85,1,874,T0_chamber); %---Calcolo delle frazioni n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---Calcolo delle propriet? della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/(M_miscela); m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela;

phi=q_ox/q_fuel; %rapporto di miscelazione dovuto alle portate in ingresso count=count+1;

epsilon=abs(double(p_chamber-p_i)); %errore calcolato sulla pressione end

(35)

if count==10^2

warning('Uscita dal ciclo di P_chamber') end

T_chamber=T0_chamber;

C_F=sqrt(2*gamma^2/(gamma-1)*(2/(gamma+1))^((gamma+1)/(gamma-1))... *(1-(p_amb/p_chamber)^((gamma-1)/gamma)));

La seguente funzione, dato il valore delle costanti, come illustrato al Capitolo 4, che regolano

la portata dei propellenti in caso di regolazione sonica della portata di etano e dell’utilizzo di un

venturi cavitante sulla linea del perossido di idrogeno, calcola il valore delle portate stesse sulla base

della conoscenza della pressione del serbatoio e della pressione in camera.

function [p_chamber,T_chamber,phi,q_fuel,q_ox,c_star,C_F]= portate(p_tank,p_amb,phi,conc,k_fuel,k_ox,A_star,p_guess,T_guess)

% Inputs:

% p_tank [Pa] Pressione nel serbatoio % p_amb [Pa] Pressione ambiente % phi [--] Rapporto di miscelamento % conc [--] Concentrazione in peso HP % k_fuel [m s] Parametro di portata del C2H6 % k_ox [kg^1/2 m^1/2] Parametro di portata del H2O2 % A_star [m^2] Sezione di gola ugello %Outputs:

p_chamber [Pa] Pressione in CC T_chamber [°K] Temperatura in CC Phi [--] Rapporto di miscelamento q_fuel [kg s^-1] Portata di C2H6

q_ox [kg s^-1] Portata di HP c_star [m s^-1] Velocità caratteristica C_F [--] Coeff. Di spinta

global M_C2H6 M_O2 M_H2O2 M_H2O M_CO2 M_CO global h0_C2H6 h0_O2 h0_H20 h0_CO2 h0_CO h0_H202 global s0_C2H6 s0_O2 s0_H20 s0_CO2 s0_CO s0_H202 global cp_O2 cp_H2O cp_CO2 cp_CO cp_C2H6 global h_O2 h_H2O h_CO2 h_CO h_C2H6 global s_O2 s_H2O s_CO2 s_CO s_C2H6 global R

T_C2H6=300; T_H2O2=973.15;

%---%---CALCOLO DELLE CONDIZIONI DI INGRESSO---

%---%---inizializzazione delle condizioni ipotizzate in camera---if nargin==7

p_chamber=10; %nel caso non ci sia un'ipotesi sulla pressione in camera else p_chamber=p_guess; end if nargin < 9 [T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber(1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1); else

(36)

%Questo ramo da un risultato analogo al precedente, ma in un numero minore di cicli se T_guess vicino al risultato

[T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber(1,phi/conc,T_C2H6,T_H2O2,p_chamber,conc,1,874 ,T_guess);

end

%---calcolo delle frazioni molari---n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---calcolo delle proprietà della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/M_miscela; m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela; %---%---CICLO PRINCIPALE--- %---epsilon=100; %inizializzazione dell'errore

count=0; %contatore dei passi d'iterazione while epsilon>10^-1 & count<10^2

%---Calcolo delle caratteristiche del

c_star=sqrt(1/gamma*((gamma+1)/2)^((gamma+1)/(gamma-1))*R/M_miscela*T0_chamber); q_fuel=k_fuel*p_tank;

q_ox=k_ox*sqrt(p_tank-750e-6); q_tot=q_fuel+q_ox;

%---Calcolo della temperatura e della pressione in camera di p_i=p_chamber; %variabile d'appoggio per il calcolo dell'errore

p_chamber=q_tot*c_star/A_star/101300;

[T0_chamber,n_C2H6,n_H2O,n_CO2,n_CO,n_O2]=chamber(q_fuel,q_ox,300,973.15,p_chamber,0.85,1,874,T0_c hamber);

%---Calcolo delle frazioni n_tot=n_C2H6+n_O2+n_CO2+n_CO+n_H2O; x_C2H6=n_C2H6/n_tot; x_H2O=n_H2O/n_tot; x_CO2=n_CO2/n_tot; x_CO=n_CO/n_tot; x_O2=n_O2/n_tot;

%---Calcolo delle proprietà della

miscela---M_miscela=(M_C2H6*x_C2H6+M_H2O*x_H2O+M_CO2*x_CO2+M_CO*x_CO+M_O2*x_O2); R_miscela=R/(M_miscela); m_miscela=n_tot*M_miscela; cp_miscela=(subs(cp_C2H6,T0_chamber/100)*n_C2H6+subs(cp_H2O,T0_chamber/100)*n_H2O... +subs(cp_CO2,T0_chamber/100)*n_CO2+subs(cp_CO,T0_chamber/100)*n_CO... +subs(cp_O2,T0_chamber/100)*n_O2)/m_miscela; cv_miscela=cp_miscela-R_miscela; gamma=cp_miscela/cv_miscela;

(37)

phi=q_ox/q_fuel; %rapporto di miscelazione dovuto alle portate in ingresso count=count+1;

epsilon=abs(double(p_chamber-p_i)); %errore calcolato sulla pressione end

if count==10^2

warning('Uscita dal ciclo di P_chamber') end

T_chamber=T0_chamber;

C_F=sqrt(2*gamma^2/(gamma-1)*(2/(gamma+1))^((gamma+1)/(gamma-1))... *(1-(p_amb/p_chamber)^((gamma-1)/gamma)));

G.5.

Programmi relativi ai Capitoli 5 e 6

Dimensionamento del propulsore

La seguente funzione dimensiona il propulsore come descritto al Capitolo 5 sulla base dei

valori di specifica delle grandezze definite nello stesso, La funzione restituisce la geometria del

motore e alcune grandezze utili all’analisi delle prestazioni delleo stesso quali numeri di Mach,

temperature, pressioni, ecc. nei vari tratti del propulsore.

function [m_punto_ox,m_punto_f,m_punto,I_sp,C_tau,c_star,p1,p0_ox_out_venturi, p01_I,p02,p02_f,p1_f,p03,p05,p2,p2_I,p2_f,p3,p4,p5,p_t,p6,T1,T2,T3,T4,T5,T_t,T05, u_ox,u2,u2_I,u2_f,u3_f,u3,u4,u5,u_t,u6,D_ox,D2,D3,D2_f,D3_f,D4,D_t,D6,rho3_f, rho2_I,Mach,Aree,Rapporti_aree,Gola,Gas_out,Pressioni_totali,Pressioni, Temperature,Velocita,Diametri,y_tangenza,alpha_tangenza,x_star,r_star, A_sonica_C2H6,A_venturi,DATI,RISULTATI,CATALIZZATORE,GEOMETRIA, VENTURI,INIEZIONE,UGELLO]=FVP(T1,G,D,A3_A4,A2_A_ox,N,Mach5,p6,p5, conc,phi,p_amb,F,L_cb_D_t,L_d_L_cb,L_L_d,L_L_cb,C_f,Delta_p_inettori_C2H6) % INPUTS % % T1 TEMPERATURA SERBATOIO [°K] % G BED LOADING [Kg m^-2 s^-1] % D DIAMETRO TUBO C2H6 [m]

% A3_A4 RAPPORTO DIAMETRO

STABILIZZATORE DI FIAMMA/ DIAM. CC [--] % A2_A_ox RAPPORTO DIAMETRO CATALIZZATORE / TUBO HP [--] % N NUMERO INIETTORI [--] % Mach5 NUMERO DI MACH IN USCITA CC [--] % p6 PRESSIONE IN USCITA UGELLO DI ESPANSIONE [Pa] % p5 PRESSIONE IN CC [atm] % conc CONCENTRAZIONE IN PESO HP [--] % phi RAPPORTO DI MISCELAMENTO [--] % p_amb PRESSIONE AMBIENTE [Pa] % F SPINTA [N] % L_cb_D_t RAPPORTO LUNGH. LETTO CATALITICO / DIAM. GOLA [--] % L_d_L_cb RAPPORTO LIQUIDI / GAS [--] % L_L_cb RAPPORTO LUNGH. TUBO C2H6/LUNGH. LETTO

CATALITICO [--] % C_f COEFF. DI ATTRITO UGELLO DI ESPANSIONE [--]

Riferimenti

Documenti correlati

Scrivere la funzione Matlab compute_inverse che prenda in input una matrice quadrata A di ordine N; dopo aver verificato che la matrice è invertibile,

Prova scritta di Analisi Matematica I del 25 giugno 2007 Ingegneria Edile

[r]

[r]

[r]

[r]

In tal caso, si ottiene un quoziente, che coincide con il valore del parametro D della rappresentazione nello spazio di stato, mentre il resto ` e una funzione di trasferimento con

APPENDICE B : Ricerca della funzione di trasferimento della