Skip to content

Latest commit

 

History

History
161 lines (122 loc) · 3.97 KB

File metadata and controls

161 lines (122 loc) · 3.97 KB

オブジェクト指向 - クラスの基礎

オブジェクト指向プログラミング(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")

クラスの利点

  1. データと処理のカプセル化: 関連するデータと処理が一箇所にまとまる
  2. 再利用性: 複数のロケットを簡単に作成できる
  3. 拡張性: 新しい機能を追加しやすい
# 複数のロケットを比較
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

次章: ライブラリ化 - モジュールとパッケージ