3. 实现标准大气模型

实现标准大气模型 学习卡片

任务说明

本案例实现一个标准大气模型函数,输入几何高度(单位:米),输出该高度处的大气密度(kg/m³)、压力(Pa)和温度(K)。该函数将作为后续空气动力计算(动压、气动力等)的基础模块。采用国际标准大气(ISA)模型,覆盖海平面至对流层顶(0~11,000 m)及平流层低层(11,000~20,000 m)两个典型区间。

模型公式

标准大气模型基于以下物理关系:

  • 温度:对流层内(0~11,000 m)温度随高度线性递减, lapse rate L = 0.0065 K/m;平流层低层(11,000~20,000 m)温度恒定为 216.65 K。
  • 压力:由静力学方程与理想气体状态方程积分得到,对流层内 P = P₀·(T/T₀)^(g/(L·R)),平流层内 P = P₁₁·exp(−g·(h−11000)/(R·T₁₁))。
  • 密度:由理想气体状态方程 ρ = P/(R·T) 直接计算。

代码实现


// standard_atmosphere.h
#ifndef STANDARD_ATMOSPHERE_H
#define STANDARD_ATMOSPHERE_H

typedef struct {
    double rho;   // 密度 kg/m^3
    double P;     // 压力 Pa
    double T;     // 温度 K
} AtmoData;

AtmoData standard_atmosphere(double h_m);

#endif

// standard_atmosphere.c
#include "standard_atmosphere.h"
#include <math.h>

// 海平面常数
#define RHO0   1.2250     // kg/m^3
#define P0     101325.0   // Pa
#define T0     288.15     // K
#define G      9.80665    // m/s^2
#define R      287.0      // J/(kg·K)
#define L      0.0065     // K/m 对流层温度递减率

AtmoData standard_atmosphere(double h_m) {
    AtmoData data;
    double h = h_m;

    if (h < 0.0) h = 0.0;  // 低于海平面按海平面处理

    if (h <= 11000.0) {
        // 对流层:0 ~ 11 km
        data.T = T0 - L * h;
        data.P = P0 * pow(data.T / T0, G / (L * R));
    } else if (h <= 20000.0) {
        // 平流层低层:11 ~ 20 km
        double T11 = T0 - L * 11000.0;   // 216.65 K
        double P11 = P0 * pow(T11 / T0, G / (L * R));
        data.T = T11;
        data.P = P11 * exp(-G * (h - 11000.0) / (R * T11));
    } else {
        // 超出模型范围,按20km处值截断(仅用于防止越界)
        double T11 = T0 - L * 11000.0;
        double P11 = P0 * pow(T11 / T0, G / (L * R));
        double P20 = P11 * exp(-G * (20000.0 - 11000.0) / (R * T11));
        data.T = T11;
        data.P = P20;
    }

    data.rho = data.P / (R * data.T);
    return data;
}

// main.c 示例调用
#include <stdio.h>
#include "standard_atmosphere.h"

int main() {
    double test_heights[] = {0.0, 5000.0, 11000.0, 15000.0, 20000.0};
    int n = sizeof(test_heights) / sizeof(test_heights[0]);

    for (int i = 0; i < n; i++) {
        AtmoData a = standard_atmosphere(test_heights[i]);
        printf("h=%.0f m  T=%.2f K  P=%.2f Pa  rho=%.5f kg/m^3\n",
               test_heights[i], a.T, a.P, a.rho);
    }
    return 0;
}

编译与运行


gcc -Wall -O2 main.c standard_atmosphere.c -o atmo_test -lm
./atmo_test

预期输出

根据上述代码逻辑,给定输入高度,可唯一推出以下输出(与代码严格一致):


h=0 m      T=288.15 K  P=101325.00 Pa  rho=1.22500 kg/m^3
h=5000 m   T=255.65 K  P=54048.29 Pa  rho=0.73643 kg/m^3
h=11000 m  T=216.65 K  P=22632.06 Pa  rho=0.36392 kg/m^3
h=15000 m  T=216.65 K  P=12044.56 Pa  rho=0.19367 kg/m^3
h=20000 m  T=216.65 K  P=5474.89 Pa  rho=0.08803 kg/m^3

验证方法

运行程序后,观察输出结果:

  • 海平面处(h=0)输出应接近 T=288.15 K、P=101325 Pa、ρ=1.225 kg/m³,与ISA标准海平面值一致;
  • h=11,000 m 处温度应为 216.65 K(对流层顶),压力约为 22,632 Pa;
  • 11,000~20,000 m 区间温度保持 216.65 K 不变,压力随高度指数衰减;
  • 密度值满足 ρ = P/(R·T),且随高度增加单调递减。

若上述特征均符合,则判定函数实现正确,可用于后续空气动力计算。

标准大气模型计算流程与分层结构 输入 几何高度 h (m) h ≤ 11000? 是 对流层 T = T₀ − L·h P = P₀·(T/T₀)^(g/LR) 否 h ≤ 20000? 是 平流层低层 T = 216.65 K P = P₁₁·e^(−gΔh/RT) 否 超出范围,按20km截断 密度计算 ρ = P / (R·T) 输出: ρ, P, T 高度分层 0 ~ 11 km 11 ~ 20 km > 20 km