2017年2月5日日曜日

比較的高いところまでの気圧とか

 なんとなく成層圏とかあのあたりの気圧が欲しい気分だったので計算してみた。


 縦軸が高度(km)、横軸は上が気圧(hPa)、下が気温(degC)で、赤が気圧、青が気温。

 ググって出て来るグラフに近いので、そんなに大きくは外してないと思う。本来はグラフは85kmあたりで終わりなのだが、このグラフではそれ以上も続いてる。

 値は国際標準大気の米wikipediaページを使った
 International Standard Atmosphere - Wikipedia
 ちなみに日本語ページと英語ページでは微妙に値が違う。今回はだいたいそれっぽい値だったら良いというスタンスなので気にしない。

 参考までに、C#のソースコード。気圧の計算は以下のページの式をそのまま使った。
 目的地の気温と気圧を計算 - 高精度計算サイト
 レイヤの計算がかなり冗長なのであまりにも大量に呼ぶ場合は最適化したほうが良いかも。

static void CalcSeaLevelPresAndTemp(double TargetAltMeter, out double TargetTempDeg, out double TargetPresHPa)
{
    int[] BaseAlt = { -610, 11000, 20000, 32000, 47000, 51000, 71000, 84852 };
    float[] BaseTemp = { +19.0f, -56.5f, -56.5f, -44.5f, -2.5f, -2.5f, -58.5f, -86.28f };
    float[] BasePres = { 1089.0f, 226.32f, 54.749f, 8.6802f, 1.1091f, 0.66939f, 0.39564f, 0.003734f };
    float[] TempLapseRate = { -6.5f, +0.0f, +1.0f, +2.8f, +0.0f, -2.8f, -2.0f, +0.0f };

    int Layer =
        TargetAltMeter >= BaseAlt[7] ? 7 :
        TargetAltMeter >= BaseAlt[6] ? 6 :
        TargetAltMeter >= BaseAlt[5] ? 5 :
        TargetAltMeter >= BaseAlt[4] ? 4 :
        TargetAltMeter >= BaseAlt[3] ? 3 :
        TargetAltMeter >= BaseAlt[2] ? 2 :
        TargetAltMeter >= BaseAlt[1] ? 1 : 0;

    double deltaAlt = TargetAltMeter - BaseAlt[Layer];
    double T = deltaAlt / 1000 * TempLapseRate[Layer] + BaseTemp[Layer];
    double P = BasePres[Layer] * Math.Pow(1 - ((0.0065 * deltaAlt) / (T + 0.0065 * deltaAlt + 273.15)), 5.257);

    TargetTempDeg = T;
    TargetPresHPa = P;
}

 うぃきぺのグラフだと高度85kmを上回ったあたりで切れてるので、レイヤ>=7で例外を投げるとかした方がいいかも。


 ちなみに理科年表のグラフによると、密度は高度100kmあたりまで対数でほぼ線形の減少となり、気温は100kmを超えたあたりで一気に加熱されている。高度400km以上は1000degKで変化せず、という感じらしい。宇宙の「気温」はだいたい摂氏700度くらいということなので、めっちゃ熱いはずなのだが、宇宙はかなり寒い印象があると思う。そもそも空気密度が限りなく低いので、熱伝導で加熱されることはなく、放射でのみ加熱・冷却されるから、気温の影響は無視できる程度なんであろう。


 ということで、なんとなくそれっぽい気圧とか高度を求める話でした。

0 件のコメント:

コメントを投稿