Skip to content

Latest commit

 

History

History
174 lines (132 loc) · 3.41 KB

File metadata and controls

174 lines (132 loc) · 3.41 KB

関数化 - コードの整理

関数を使うと、処理をまとめて再利用できます。シミュレーションコードを整理し、可読性を高めるために重要です。

関数の基本

def 関数名(引数1, 引数2):
    """関数の説明(docstring)"""
    # 処理
    return 戻り値

簡単な例

def add(a, b):
    """2つの数を足す"""
    return a + b

result = add(3, 5)
print(result)  # 8

物理計算の関数化

重力加速度による落下

def calc_freefall_height(h0, t, g=9.8):
    """
    自由落下の高度を計算する

    Parameters
    ----------
    h0 : float
        初期高度 [m]
    t : float or array
        時刻 [s]
    g : float, optional
        重力加速度 [m/s^2], デフォルトは9.8

    Returns
    -------
    float or array
        高度 [m]
    """
    return h0 - 0.5 * g * t**2

使用例:

import numpy as np

t = np.linspace(0, 4, 100)
h = calc_freefall_height(100, t)

空気抵抗の計算

def calc_drag_force(v, rho, Cd, A):
    """
    空気抵抗(抗力)を計算する

    Parameters
    ----------
    v : float
        速度 [m/s]
    rho : float
        空気密度 [kg/m^3]
    Cd : float
        抗力係数 [-]
    A : float
        代表面積 [m^2]

    Returns
    -------
    float
        抗力 [N]
    """
    return 0.5 * rho * v**2 * Cd * A

複数の戻り値

Pythonでは複数の値をタプルで返せます。

def calc_motion(h0, v0, t, g=9.8):
    """
    等加速度運動の高度と速度を計算する

    Returns
    -------
    tuple
        (高度, 速度)
    """
    h = h0 + v0 * t - 0.5 * g * t**2
    v = v0 - g * t
    return h, v

# 使用例
height, velocity = calc_motion(100, 50, 2.0)
print(f"高度: {height} m, 速度: {velocity} m/s")

デフォルト引数

省略可能な引数にデフォルト値を設定できます。

def calc_kinetic_energy(m, v, g=9.8, h=0):
    """
    運動エネルギーと位置エネルギーの和を計算する

    h を省略すると運動エネルギーのみ計算
    """
    Ek = 0.5 * m * v**2
    Ep = m * g * h
    return Ek + Ep

# 運動エネルギーのみ
E1 = calc_kinetic_energy(1.0, 10.0)

# 全力学的エネルギー
E2 = calc_kinetic_energy(1.0, 10.0, h=50)

関数の組み合わせ

小さな関数を組み合わせて複雑な処理を行います。

import numpy as np

def calc_acceleration(thrust, mass, drag, g=9.8):
    """加速度を計算"""
    return (thrust - drag) / mass - g

def calc_drag(v, rho=1.225, Cd=0.5, A=0.01):
    """空気抵抗を計算"""
    return 0.5 * rho * v**2 * Cd * A

def simulate_step(h, v, thrust, mass, dt):
    """1ステップのシミュレーション"""
    drag = calc_drag(v)
    a = calc_acceleration(thrust, mass, drag)

    # オイラー法で更新
    v_new = v + a * dt
    h_new = h + v * dt

    return h_new, v_new

# シミュレーションループ
h, v = 0.0, 0.0
thrust, mass = 100.0, 1.0
dt = 0.01

for i in range(100):
    h, v = simulate_step(h, v, thrust, mass, dt)
    print(f"t={i*dt:.2f}s: h={h:.2f}m, v={v:.2f}m/s")

実行してみよう

scripts/01_python/04_functions_example.py を実行してください:

python scripts/01_python/04_functions_example.py

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