関数を使うと、処理をまとめて再利用できます。シミュレーションコードを整理し、可読性を高めるために重要です。
def 関数名(引数1, 引数2):
"""関数の説明(docstring)"""
# 処理
return 戻り値def add(a, b):
"""2つの数を足す"""
return a + b
result = add(3, 5)
print(result) # 8def 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 * APythonでは複数の値をタプルで返せます。
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