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_0global 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]
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] %---%
%---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'
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);
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;
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
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);
[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]);
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
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
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
%---%---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 COaC 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
%---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
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);
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};
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};
% 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
[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
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;
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
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)];
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;
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;
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
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
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]
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
(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;
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...
+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
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...
+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;
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;
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
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
%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;
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 [--]