オブジェクト指向プログラミング(OOP)を使うと、データと処理をまとめて扱えます。ロケットを「物体」として表現するのに適しています。
クラスは「設計図」、インスタンスは「実体」です。
class Rocket:
"""ロケットを表すクラス"""
pass
# インスタンスの作成
my_rocket = Rocket()インスタンスが持つデータを属性と呼びます。
class Rocket:
def __init__(self, name, mass):
"""コンストラクタ(初期化メソッド)"""
self.name = name # ロケット名
self.mass = mass # 質量 [kg]
# インスタンスの作成
rocket = Rocket("Alpha", 10.0)
print(rocket.name) # Alpha
print(rocket.mass) # 10.0__init__ はインスタンス作成時に自動で呼ばれます。self はインスタンス自身を指します。
クラス内で定義する関数をメソッドと呼びます。
class Rocket:
def __init__(self, name, mass, thrust):
self.name = name
self.mass = mass # 質量 [kg]
self.thrust = thrust # 推力 [N]
def calc_acceleration(self, g=9.8):
"""加速度を計算"""
return self.thrust / self.mass - g
def info(self):
"""情報を表示"""
print(f"ロケット: {self.name}")
print(f"質量: {self.mass} kg")
print(f"推力: {self.thrust} N")
# 使用例
rocket = Rocket("Alpha", 10.0, 150.0)
rocket.info()
a = rocket.calc_acceleration()
print(f"加速度: {a:.2f} m/s^2")import numpy as np
class Rocket:
"""1次元ロケットシミュレーション用クラス"""
def __init__(self, mass, thrust, Cd=0.5, A=0.01):
"""
Parameters
----------
mass : float
質量 [kg]
thrust : float
推力 [N]
Cd : float
抗力係数
A : float
代表面積 [m^2]
"""
self.mass = mass
self.thrust = thrust
self.Cd = Cd
self.A = A
# 状態変数
self.h = 0.0 # 高度 [m]
self.v = 0.0 # 速度 [m/s]
self.t = 0.0 # 時刻 [s]
def calc_drag(self, rho=1.225):
"""空気抵抗を計算"""
return 0.5 * rho * self.v**2 * self.Cd * self.A
def calc_acceleration(self, g=9.8):
"""加速度を計算"""
drag = self.calc_drag()
return (self.thrust - drag) / self.mass - g
def update(self, dt):
"""状態を更新(オイラー法)"""
a = self.calc_acceleration()
self.v += a * dt
self.h += self.v * dt
self.t += dt
def get_state(self):
"""現在の状態を返す"""
return self.t, self.h, self.v# ロケットの作成
rocket = Rocket(mass=1.0, thrust=50.0)
# シミュレーション
dt = 0.01
results = []
while rocket.t < 10.0 and rocket.h >= 0:
results.append(rocket.get_state())
rocket.update(dt)
# 結果の確認
import numpy as np
results = np.array(results)
print(f"最高高度: {results[:, 1].max():.1f} m")- データと処理のカプセル化: 関連するデータと処理が一箇所にまとまる
- 再利用性: 複数のロケットを簡単に作成できる
- 拡張性: 新しい機能を追加しやすい
# 複数のロケットを比較
rocket1 = Rocket(mass=1.0, thrust=50.0)
rocket2 = Rocket(mass=1.0, thrust=100.0)
# それぞれシミュレーション...scripts/01_python/05_oop_example.py を実行してください:
python scripts/01_python/05_oop_example.py