AI로 러닝(Learn) 내일을 향해 러닝(Running)

원당컴퓨터학원에서 배우는 AI, 세상을 향해 달리다

학생부종합전형

비탄성 충돌, 운동량은 왜 보존될까?Python으로 직접 증명하기

원당컴1 2026. 5. 12. 18:07
📐 물리 × 코딩 융합 탐구
비탄성 충돌, 운동량은 왜 보존될까?
Python으로 직접 증명하기
에너지가 줄어들면 운동량도 줄어야 하지 않을까?
이 의문에서 출발해 충돌 시뮬레이션을 코딩으로 탐구합니다.
🎯 컴퓨터공학 진로 탐구 🔬 물리 + Python 융합 📚 세특 활용 가능
QUESTION
🤔 이런 의문에서 시작했습니다
"비탄성 충돌에서 소리에너지가 발생하고 역학적 에너지가 보존되지 않는데, 왜 운동량은 보존되는 걸까요? 운동에너지가 줄면 속력이 줄고, 그러면 운동량도 줄어야 하지 않나요?"
굉장히 날카로운 질문입니다. 이 의문의 핵심은 운동에너지와 운동량이 서로 다른 물리량이라는 점을 아직 구분하지 못한 데서 옵니다. 두 공식을 비교해보면 차이가 바로 보입니다.
운동에너지 (Kinetic Energy)
E = ½mv²
속력의 제곱에 비례
운동량 (Momentum)
p = mv
속력에 선형 비례
속력 v가 절반으로 줄면, 운동에너지는 1/4배가 되지만 운동량은 1/2배가 됩니다. 두 물체 사이에서 에너지가 소리나 열로 변환되더라도, 외부에서 힘이 가해지지 않는 한 두 물체의 운동량 합은 바뀌지 않습니다.
구분 보존 조건 비탄성 충돌 탄성 충돌
운동량 외력 = 0 ✅ 보존 ✅ 보존
역학적 에너지 비보존력 = 0 ❌ 비보존 ✅ 보존
CODING LAB 01
🐍 Python으로 충돌 시뮬레이션 구현하기
말로만 이해하는 것보다 직접 코드로 구현하면 훨씬 명확해집니다. 아래 코드는 두 물체가 비탄성 충돌할 때 충돌 전후의 운동량 합과 운동에너지 합을 계산해 비교합니다.
collision_basic.py
# 비탄성 충돌 시뮬레이션 - 운동량과 에너지 비교 def inelastic_collision(m1, v1, m2, v2, e): """ m1, m2 : 질량 (kg) v1, v2 : 충돌 전 속도 (m/s) e : 반발계수 (0=완전비탄성, 1=완전탄성) """ # 충돌 후 속도 계산 v1_after = (m1*v1 + m2*v2 + m2*e*(v2 - v1)) / (m1 + m2) v2_after = (m1*v1 + m2*v2 + m1*e*(v1 - v2)) / (m1 + m2) # 운동량 계산 p_before = m1*v1 + m2*v2 p_after = m1*v1_after + m2*v2_after # 운동에너지 계산 ke_before = 0.5*m1*v1**2 + 0.5*m2*v2**2 ke_after = 0.5*m1*v1_after**2 + 0.5*m2*v2_after**2 return { "v1_after" : round(v1_after, 4), "v2_after" : round(v2_after, 4), "p_before" : round(p_before, 4), "p_after" : round(p_after, 4), "ke_before": round(ke_before, 4), "ke_after" : round(ke_after, 4), "ke_loss" : round(ke_before - ke_after, 4) } # 완전 비탄성 충돌 (반발계수 e=0) result = inelastic_collision( m1=2.0, v1=5.0, # 2kg, 5m/s m2=3.0, v2=-1.0, # 3kg, -1m/s (반대 방향) e=0.0 # 완전 비탄성 ) print(f"충돌 후 물체1 속도: {result['v1_after']} m/s") print(f"충돌 후 물체2 속도: {result['v2_after']} m/s") print(f"운동량(전): {result['p_before']} kg·m/s") print(f"운동량(후): {result['p_after']} kg·m/s ← 동일!") print(f"에너지(전): {result['ke_before']} J") print(f"에너지(후): {result['ke_after']} J") print(f"에너지 손실: {result['ke_loss']} J ← 소리·열로 변환!")
# 실행 결과 (Output)
충돌 후 물체1 속도: 1.4 m/s
충돌 후 물체2 속도: 1.4 m/s

운동량(전): 7.0 kg·m/s
운동량(후): 7.0 kg·m/s   ← 동일! ✅

에너지(전): 26.5 J
에너지(후): 9.8 J
에너지 손실: 16.7 J    ← 소리·열로 변환 🔥
운동량은 전후 동일하게 7.0 kg·m/s로 보존되지만, 운동에너지는 26.5J → 9.8J로 줄어 16.7J이 소리와 열로 변환된 것을 코드 결과로 직접 확인할 수 있습니다.
CODING LAB 02
📊 반발계수에 따른 에너지 손실 비교
반발계수(e)를 0~1 사이로 바꾸면서 에너지 손실이 어떻게 달라지는지 분석합니다. 이는 Unity·Unreal 게임 엔진에서 물체의 물리 재질(Physic Material)을 설정하는 원리와 동일합니다.
restitution_analysis.py
import numpy as np # 반발계수 0.0 ~ 1.0 구간 분석 e_values = np.linspace(0, 1, 6) m1, v1, m2, v2 = 2.0, 5.0, 3.0, -1.0 ke_before = 0.5*m1*v1**2 + 0.5*m2*v2**2 print(f"{'반발계수':^8} {'운동량 보존':^12} {'에너지 손실':^12} {'손실률'}") print("-" * 48) for e in e_values: res = inelastic_collision(m1, v1, m2, v2, e) ok = abs(res['p_before'] - res['p_after']) < 0.0001 rate = res['ke_loss'] / ke_before * 100 print(f" e={e:.1f} {'✅ 보존' if ok else '❌'} {res['ke_loss']:>7.2f} J {rate:>5.1f}%")
# 실행 결과 (Output)
반발계수   운동량 보존   에너지 손실   손실률
------------------------------------------------
  e=0.0     ✅ 보존     16.70 J    63.0%
  e=0.2     ✅ 보존     15.03 J    56.7%
  e=0.5     ✅ 보존     10.43 J    39.4%
  e=0.8     ✅ 보존      4.18 J    15.8%
  e=1.0     ✅ 보존      0.00 J     0.0%

# 반발계수와 무관하게 운동량은 항상 보존!
# 에너지 손실은 e=0 최대 → e=1 에서 0
반발계수가 0이든 1이든 운동량은 항상 보존됩니다. 이는 Unity·Unreal에서 bounciness 값을 바꿔도 물리 시뮬레이션의 운동량 계산은 동일한 공식을 쓰는 이유와 같습니다.
DEEP DIVE
🔬 더 나아간 탐구 활동 아이디어
EXPLORE 01
수치 적분 오차와 에너지 보존
시간 간격(dt)에 따라 에너지 오차가 달라지는 현상을 탐구합니다. 오일러 방법과 심플렉틱 적분법을 비교하며 알고리즘 선택이 물리적 정확도에 미치는 영향을 분석합니다.
EXPLORE 02
머신러닝으로 충돌 결과 예측
충돌 시뮬레이션 데이터를 직접 생성하고 sklearn 선형회귀 모델을 학습합니다. 운동량 보존 법칙의 선형성 덕분에 단순 모델로도 높은 정확도를 달성할 수 있음을 확인합니다.
EXPLORE 03
Unity 게임 엔진 물리 분석
Unity의 Rigidbody와 Physic Material을 실험하며 반발계수 변화에 따른 에너지 손실을 측정합니다. 실제 게임 개발에서 물리 법칙이 어떻게 구현되는지 직접 확인합니다.
EXPLORE 04
자율주행 충돌 시뮬레이션 연결
자율주행 차량의 안전 알고리즘에서 충돌 예측이 어떻게 활용되는지 탐구합니다. 운동량 보존을 이용한 충돌 후 궤적 예측 알고리즘을 간단히 구현해 봅니다.
SETECH STORY
📝 세특 스토리라인 제안
🎯 물리 + 정보 세특 연결 흐름
  • 물리 수업에서 "에너지가 줄면 운동량도 줄어야 하지 않나?" 라는 의문 발견
  • 두 보존 법칙의 성립 조건 차이를 수식으로 직접 비교 분석
  • Python으로 충돌 시뮬레이션 구현, 수치로 운동량 보존 확인
  • 반발계수 변화에 따른 에너지 손실 패턴을 코드로 시각화
  • 게임 엔진의 물리 처리 원리와 연결하여 컴공 진로 탐구로 확장
  • "물리 법칙을 정확히 구현하는 것이 컴퓨터공학의 핵심 과제임을 깨달음"
이 탐구는 물리 세특 · 정보 세특 · 진로 활동을 하나의 스토리로 엮을 수 있는 주제입니다.
의문 → 탐구 → 구현 → 확장의 흐름이 완성됩니다.
#비탄성충돌 #운동량보존 #물리시뮬레이션 #Python코딩 #컴퓨터공학 #세특주제 #학생부종합전형 #탐구활동 #게임물리엔진 #원당컴퓨터학원 #코딩학원 #검단신도시 #당하동
사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기
📌 원당컴퓨터학원 | 인천 서구 당하동 장원프라자 502호
📞 032-565-5497
🌐 홈페이지: www.wondangcom.com
💬 카카오 문의: 카카오톡 상담
원당컴퓨터학원
wondangcom.com
홈페이지 바로가기 →