海拔与氧气含量

来自Jack's Lab
跳转到: 导航, 搜索

目录

1 原理

氧气含量是为单位体积大气内氧气的质量,即为大气中氧气的密度。


据气体热力学方程: PV = nRT (P 为压强,V 为体积,R 为常数,T 为热力学温度,n 为物质的摩尔量,n = m/M (m 为气体质量,M为气体的摩尔质量),则:密度 m/V = PO2(M/(RT))


即在温度一定的情形下,大气中氧气的密度是与大气中氧气的分压成正比的(线性)


据「道尔顿定律」:混合气体中各成份气体的分压,与其体积百分率成正比,各成份气体分压总合等于混合气体的总压。


然,不管海拔如何,氧气体积的比例在大气中是一定的(约为 21%,20.947%),则氧气分压总是大气压的 0.21 倍。


因此大气中氧气的密度与所在海拔的大气压成正比:m/V = 0.20947P(M/(RT))

M = 32 g/mol
R = 8.31431 J/K/mol
T = (273.15 + t) K

m/V = 0.8062 P/(273.15 + t),注意出来的密度单位为 g/m3


而气压与海拔的关系,实际应用中,多采用编制好的标准大气表


注:气温 0 度,标准大气压下,空气平均分子量 29,摩尔体积 22.4 L/mol


2 标准大气表

Standard Atmosphere Table

航空领域对气压与海拔的关系,最为关心。以国际民航组织 (ICAO) 编制的 ICAO Standard Atmosphere Table 使用最为广泛

其他标准表,如 International Standard Atmosphere (ISA) , U.S. Standard Atmosphere 大同小异


Alt-1.jpg


3 计算

则在标准大气下氧气含量为:

octave:29> 0.8062*101325/288.15
0000 = 283.49

octave:30> 0.8062*89874.57/281.65
1000 = 257.26

octave:31> 0.8062*79495.215511/275.15
2000 = 232.92

octave:32> 0.8062*70108.54467/268.65
3000 = 210.39

octave:33> 0.8062*61640.2353/262.15
4000 = 189.56

octave:34> 0.8062*54019.912104/255.65
5000 = 170.35

octave:35> 0.8062*47181.027568/249.15
6000 = 152.67

octave:36> 0.8062*41060.743191/242.65
7000 = 136.42

octave:37> 0.8062*35599.811423/236.15
8000 = 121.54

octave:38> 0.8062*30742.45842/229.65
9000 = 107.92


可近似为:

1000 时氧含量为平原地区的 91%

2000 时氧含量为平原地区的 82%

3000 时氧含量为平原地区的 74%

4000 时氧含量为平原地区的 67%

5000 时氧含量为平原地区的 60%

6000 时氧含量为平原地区的 54%

7000 时氧含量为平原地区的 48%

8000 时氧含量为平原地区的 42%

9000 时氧含量为平原地区的 38%


至于下面这个图,大气压的变化查表查得不错,可惜计算氧气含量时把 T = 273.15 + t 直接近似为 T = 273.15,忽略了温度对氧气含量的影响,造成了较大的误差,如 5000 时氧气含量为平原地区的 53%


Alt-2.jpg


4 Generate Table

#include <stdio.h>
#include <math.h>

const double air_mol_m = 28.9644 / 1000;
const double air_density_std = 1.225;
const double pressure_std = 101325;
const double temperature_std = 288.15;

const double gravity = 9.80665;
const double temp_grad = -0.0065;
const double R_gas = 8.31432;

double calc_atmos(double h)
{
	double c = - gravity * air_mol_m / R_gas / temp_grad;
	double b = (temperature_std + temp_grad * h)/temperature_std;
	return pressure_std * pow(b, c);
}

int main()
{
	int h = 0;
	for(; h < 10000; h += 1000)
		printf("altitude %d:\t\t\t %f\n", h, calc_atmos(h));

	return 0;
}


1976 standard atmosphere:

This is a copy of the computer program that I used to get accurate values for the pressure at the boundaries
of the layers of the 1976 standard atmosphere. The pressure at the top of a layer is computed from the equation
of hydrostatic equilibrium using the pressure at the bottom of the layer and the temperature throughout the
layer. There are two different forms of the hydrostatic equation, depending upon whether the temperature
gradient through the layer is zero or not.

PROGRAM PressureValues;                                  { \atmos\press.pas }
(* ----------------------------------------------------------------------- *)
(* PURPOSE - Compute the pressure ratio at the altitudes that are the      *)
(*    boundaries between layers of the 1976 Standard Atmosphere            *)
(* AUTHOR  - Ralph L. Carmichael, Public Domain Aeronautical Software      *)
(* NOTES - The type EXTENDED used in these calculations may not be         *)
(*    familiar to everyone. It was included in Turbo Pascal by Borland to  *)
(*    let us use the same 80-bit floating format that is used by the       *)
(*    Intel 8087 processor (and its descendents). The 80-bit numbers will  *)
(*    have even greater accuracy than double precision (IEEE 64 bit).      *)
(* REVISION HISTORY                                                        *)
(*   DATE  VERS PERSON  STATEMENT OF CHANGES                               *)
(* 10Aug95  1.0   RLC   Original coding                                    *)
(*  3Nov95  1.1   RLC   Added column headers                               *)
(* 21Nov96  1.2   RLC   Writes to a file (easier for Delphi)               *)
(* ----------------------------------------------------------------------- *)
  CONST
    GREETING  = 'Press - compute pressure at layer boundaries (1976 std)';
    AUTHOR    = 'Ralph L. Carmichael, Public Domain Aeronautical Software';
    VERSION   = '1.2 (21Nov96)';
    FINALMESS = 'Normal termination of press, version ' + VERSION;

PROCEDURE ComputePressures(VAR f : TEXT);
  CONST
    GRAVITY : EXTENDED = 9.80665;                       { accel. of gravity }
    MOL_WT  : EXTENDED = 28.9644;                 { molecular weight of air }
    R_GAS   : EXTENDED = 8.31432;                            { gas constant }
  VAR
    GMR     : EXTENDED;    { hydrostatic constant used in calc. of pressure }
    s : EXTENDED;                               { density/sea-level density }
    tgrad : EXTENDED;                              { dT/dh in a given layer }
    t0,t11,t20,t32,t47,t51,t71,t85 : EXTENDED;               { temperatures }
    p0,p11,p20,p32,p47,p51,p71,p85 : EXTENDED; { pressure/sea-level pressure}
                                        { note that the t's are dimensional }
                                          { but the p's are non-dimensional }
BEGIN
  GMR := GRAVITY * MOL_WT / R_GAS;
  WriteLn(f, 'Hydrostatic constant = ', GMR:20:12);
  WriteLn(f);
  WriteLn(f, ' km      temp           pressure            density');

  t0:=288.15;
  p0:=1.0;
  s:=1.0;
  WriteLn(f, '  0', t0:12:5, p0:20:13, s:20:13);

  tgrad:=-6.5;
  t11:=t0+tgrad*11.0;
  p11:=p0*Exp(Ln(t0/t11)*GMR/tgrad);
  s:=p11*t0/t11;
  WriteLn(f, ' 11', t11:12:5, p11:20:13, s:20:13);

  tgrad:=0.0;
  t20:=t11;
  p20:=p11*Exp(-GMR*9.0/t11);                   { special form when tgrad=0 }
  s:=p20*t0/t20;
  WriteLn(f, ' 20', t20:12:5, p20:20:13, s:20:13);

  tgrad:=1.0;
  t32:=t20+tgrad*12.0;
  p32:=p20*Exp(Ln(t20/t32)*GMR/tgrad);
  s:=p32*t0/t32;
  WriteLn(f, ' 32', t32:12:5, p32:20:13, s:20:13);

  tgrad:=2.8;
  t47:=t32+tgrad*15.0;
  p47:=p32*Exp(Ln(t32/t47)*GMR/tgrad);
  s:=p47*t0/t47;
  WriteLn(f, ' 47', t47:12:5, p47:20:13, s:20:13);

  tgrad:=0.0;
  t51:=t47;
  p51:=p47*Exp(-GMR*4.0/t47);                   { special form when tgrad=0 }
  s:=p51*t0/t51;
  WriteLn(f, ' 51', t51:12:5, p51:20:13, s:20:13);

  tgrad:=-2.8;
  t71:=t51+tgrad*20.0;
  p71:=p51*Exp(Ln(t51/t71)*GMR/tgrad);
  s:=p71*t0/t71;
  WriteLn(f, ' 71', t71:12:5, p71:20:13, s:20:13);

  tgrad:=-2.0;
  t85:=t71+tgrad*13.852; 
  p85:=p71*Exp(Ln(t71/t85)*GMR/tgrad);
  s:=p85*t0/t85;
  WriteLn(f, ' 85', t85:12:5, p85:20:13, s:20:13);
END;   (* ------------------------------ End of Procedure ComputePressures *)

(* ======================================================================= *)
  VAR
    ff : TEXT;
BEGIN                                           (* Start of Program Press. *)
  Assign(ff, 'press.out');
  Rewrite(ff);
  WriteLn(ff, 'Executing ', ParamStr(0));
  WriteLn(ff, GREETING);
  WriteLn(ff, AUTHOR);
  WriteLn(ff, 'Version ', VERSION);

  ComputePressures(ff);
  WriteLn(ff, FINALMESS);
  Close(ff);
END.  (* ------------------------------------------- End of Program Press. *)


When executed, the program produces the following output:


Executing C:\RALPH\PRESS.EXE
Press - compute pressure at layer boundaries (1976 std)
Ralph L. Carmichael, Public Domain Aeronautical Software
Version 1.2 (21Nov96)
Hydrostatic constant =      34.163194736310

 km      temp           pressure            density
  0   288.15000     1.0000000000000     1.0000000000000
 11   216.65000     0.2233611050922     0.2970759401445
 20   216.65000     0.0540329501078     0.0718651953546
 32   228.65000     0.0085666783593     0.0107959255160
 47   270.65000     0.0010945601338     0.0011653334659
 51   270.65000     0.0006606353133     0.0007033514337
 71   214.65000     0.0000390468337     0.0000524171681
 85   186.94600     0.0000036850095     0.0000056799049
Normal termination of press, version 1.2 (21Nov96)


5 参考





















个人工具
名字空间

变换
操作
导航
工具箱