こんにちは、Tech Samuraiです!
ドローンやボート、あるいはロケットの設計まで、流体力学が関わる多くの場面で重要となる物理量、それが「空気密度」です。空気密度は、温度、気圧、湿度によって常に変化するため、正確なシミュレーションには都度計算が必要になります。
今回のプロジェクトでは、これら3つのパラメータから、物理公式に基づいて**空気密度を精密に計算するPythonツール**を開発します。さらに、
- 計算ロジックを再利用可能な**「モジュール」**として分離する、プロフェッショナルな設計手法
- 完成したコードを**Gitでバージョン管理**するまでの、一連のワークフロー
についても探検します。さあ、物理の世界をPythonでモデル化しましょう!
ステップ1:プロジェクトの設計とRyeによる環境準備
まず、プロジェクト全体の構成を設計します。今回は、計算ロジックと実行プログラムを分離します。
air_density_calculator.py
: 空気密度を計算する関数を格納する「部品(モジュール)」ファイル。main.py
: 上記のモジュールをインポートし、実際に関数を使って計算を実行する「本体」ファイル。
この構成により、将来別のプロジェクトで空気密度計算が必要になったとき、air_density_calculator.py
をコピーするだけで、簡単に機能を再利用できます。
Ryeによる環境準備
それでは、Ryeを使って、このプロジェクト用のクリーンな環境を準備します。
# 1. プロジェクト用のフォルダを作成し、そこに移動します
mkdir air_density_project
cd air_density_project
# 2. Ryeプロジェクトを初期化します
rye init
# 3. このプロジェクトで使うPythonのバージョンを固定します
rye pin 3.11 # お好みのバージョンに
# 4. 環境を同期させます
rye sync
これだけで、プロジェクト専用の仮想環境の準備が整いました。
ステップ2:空気密度計算モジュールの作成
次に、計算ロジックの心臓部である`air_density_calculator.py`を作成します。
# air_density_calculator.py
import math
def calculate_air_density(temperature_c: float, pressure_hpa: float, relative_humidity_percent: float) -> float:
"""
温度、気圧、相対湿度から空気密度を計算します。
国際単位系(SI)に基づいた物理公式を使用しています。
Args:
temperature_c (float): 摂氏温度 (°C)
pressure_hpa (float): ヘクトパスカル単位の気圧 (hPa)
relative_humidity_percent (float): パーセント単位の相対湿度 (%)
Returns:
float: 空気密度 (kg/m^3)
"""
# --- 1. 定数の定義 ---
R_d = 287.058 # 乾燥空気の気体定数 (J/(kg・K))
R_v = 461.495 # 水蒸気の気体定数 (J/(kg・K))
# --- 2. 単位換算 ---
temp_k = temperature_c + 273.15
pressure_pa = pressure_hpa * 100
relative_humidity = relative_humidity_percent / 100.0
# --- 3. 水蒸気圧の計算 (August-Roche-Magnus近似式) ---
saturated_vapor_pressure_pa = 610.94 * math.exp((17.625 * temperature_c) / (temperature_c + 243.04))
vapor_pressure_pa = relative_humidity * saturated_vapor_pressure_pa
# --- 4. 乾燥空気の分圧の計算 (ドルトンの法則) ---
dry_air_pressure_pa = pressure_pa - vapor_pressure_pa
# --- 5. 空気密度の計算 (理想気体の状態方程式) ---
air_density = (dry_air_pressure_pa / (R_d * temp_k)) + (vapor_pressure_pa / (R_v * temp_k))
return air_density
if __name__ == '__main__':
# このファイルが直接実行された場合のテストコード
test_temp_c = 25.0
test_pressure_hpa = 1013.25
test_humidity_percent = 50.0
density = calculate_air_density(test_temp_c, test_pressure_hpa, test_humidity_percent)
print("--- 空気密度計算モジュールのテスト実行 ---")
print(f"入力: 温度={test_temp_c}°C, 気圧={test_pressure_hpa}hPa, 湿度={test_humidity_percent}%")
print(f"計算された空気密度: {density:.4f} kg/m^3")
ステップ3:メインスクリプトの作成
次に、作成したモジュールをインポートして利用する`main.py`を作成します。
# main.py
# air_density_calculator.py ファイルから calculate_air_density 関数をインポート
from air_density_calculator import calculate_air_density
def main():
"""メインの処理を行う関数"""
print(">>> 空気密度計算プログラム <<<")
# 例1: 暑い夏の日の条件
temp1 = 30.0
pressure1 = 1005.0
humidity1 = 70.0
air_density1 = calculate_air_density(temp1, pressure1, humidity1)
print("\n--- 計算結果 (夏の日) ---")
print(f"入力値: 温度={temp1}°C, 気圧={pressure1}hPa, 湿度={humidity1}%")
print(f"空気密度: {air_density1:.4f} kg/m^3")
# 例2: 寒い冬の日の条件
temp2 = 5.0
pressure2 = 1020.0
humidity2 = 40.0
air_density2 = calculate_air_density(temp2, pressure2, humidity2)
print("\n--- 計算結果 (冬の日) ---")
print(f"入力値: 温度={temp2}°C, 気圧={pressure2}hPa, 湿度={humidity2}%")
print(f"空気密度: {air_density2:.4f} kg/m^3")
if __name__ == "__main__":
main()
ターミナルでrye run python main.py
を実行すると、夏と冬の条件での空気密度の違いが計算・表示されます。
ステップ4:Gitによるソースコード管理
コードが完成したので、Gitを使ってバージョン管理を始めましょう。Ryeは`rye init`の時点で、自動的に`git init`を実行してくれています。
Gitの初期設定や詳しいワークフローについては、以前の記事「RyeプロジェクトにおけるGitの初めの一歩」で詳しく解説していますので、そちらも参考にしてください。
ここでは、このプロジェクトの最初のコミットを完了させます。
# 1. .gitignoreファイルを作成し、Ryeが管理するフォルダなどを管理対象外にする
echo ".venv/" > .gitignore
echo "__pycache__/" >> .gitignore
echo ".rye/" >> .gitignore
# 2. 全てのファイルをステージング
git add .
# 3. 最初のコミット
git commit -m "Initial commit: 空気密度計算ツールの基本機能を実装"
# 4. ログを確認
git log --oneline
これで、プロジェクトの最初のセーブポイントが作成されました。今後、機能追加や修正を行うたびに、git add .
とgit commit
を繰り返していくことで、安全に開発を進めることができます。
まとめ
今回は、物理公式に基づいた空気密度計算ツールを、Pythonで実装しました。このプロジェクトを通して、
- 計算ロジックを独立した**モジュール**として分離する、再利用性の高い設計方法。
- **Rye**を使った、モダンでクリーンなプロジェクト環境の準備。
- 完成したプロジェクトを**Gitでバージョン管理**する、開発の基本的なワークフロー。
といった、プログラミングにおける非常に重要な概念を探検しました。ぜひ、あなたの身の回りの物理現象を、Pythonでモデル化する楽しさを体験してみてください!
コメント