충돌 반응의 기본 원리

충돌 반응을 계산하기 위해서는 우선 충돌 이전과 이후의 물체의 속도, 질량, 충돌하는 물체의 표면 법선 등을 알아야 한다. 특히 여기서는 비탄성 충돌과 탄성 충돌의 두 가지 주요한 충돌 유형에 대해 논의할 것이다.

1. 탄성 충돌

탄성 충돌에서는 두 물체가 충돌하여도 총 운동 에너지가 보존된다. 이를 위해 두 물체의 충돌 전후 운동량과 에너지 보존 법칙을 이용하여 속도를 계산한다.

운동량 보존 법칙

두 물체 AB가 충돌한다고 가정한다. 이때 A의 질량과 속도를 각각 m_A\mathbf{v}_A, B의 질량과 속도를 각각 m_B\mathbf{v}_B라고 한다. 충돌 전과 후의 운동량 보존 법칙은 다음과 같이 표현된다:

m_A \mathbf{v}_A + m_B \mathbf{v}_B = m_A \mathbf{v}_A' + m_B \mathbf{v}_B'

여기서 \mathbf{v}_A'\mathbf{v}_B'는 충돌 후의 속도이다.

에너지 보존 법칙

탄성 충돌에서 운동 에너지도 보존되므로, 다음이 성립한다:

\frac{1}{2} m_A \mathbf{v}_A^2 + \frac{1}{2} m_B \mathbf{v}_B^2 = \frac{1}{2} m_A \mathbf{v}_A'^2 + \frac{1}{2} m_B \mathbf{v}_B'^2

2. 비탄성 충돌

비탄성 충돌에서는 일부 운동 에너지가 손실되고, 이는 변형이나 열로 전환된다. 가장 극단적인 경우는 완전 비탄성 충돌로 두 물체가 하나로 합쳐지며 이후 동일한 속도로 움직이다.

운동량 보존 법칙

비탄성 충돌에서도 운동량 보존 법칙이 적용되며, 이는 다음과 같다:

m_A \mathbf{v}_A + m_B \mathbf{v}_B = m_A \mathbf{v}_A' + m_B \mathbf{v}_B'

이때, 운동 에너지 보존 법칙은 적용되지 않는다.

코리오리 반응

충돌 반응 계산 후에는 코리오리 반응을 처리해야 할 수도 있다. 이는 회전 운동을 포함한 시스템에서 중요하다.

충돌 이해를 위한 예제 코드

충돌 반응을 코드로 구현함으로써 더 명확하게 이해할 수 있다. Python을 이용한 간단한 충돌 반응 예제를 살펴보겠다.

import numpy as np

m_A = 5.0  # 질량
v_A = np.array([2.0, 0.0])  # 속도

m_B = 3.0  # 질량
v_B = np.array([-1.0, 0.0])  # 속도

def elastic_collision(v_A, v_B, m_A, m_B):
    """
    두 물체의 탄성 충돌 속도를 계산하기 위한 함수.
    """
    v_A_prime = (v_A * (m_A - m_B) + 2 * m_B * v_B) / (m_A + m_B)
    v_B_prime = (v_B * (m_B - m_A) + 2 * m_A * v_A) / (m_A + m_B)
    return v_A_prime, v_B_prime

v_A_prime, v_B_prime = elastic_collision(v_A, v_B, m_A, m_B)

print("충돌 후 A의 속도:", v_A_prime)
print("충돌 후 B의 속도:", v_B_prime)

예제 설명

이 예제에서는 두 개의 물체 A와 B가 1차원 충돌을 하는 상황을 가정하였다. 물체의 초기 속도와 질량을 지정한 후, elastic_collision 함수는 두 물체의 충돌 이후의 속도를 계산한다. 결과를 확인하면 물체 A와 B의 충돌 후 속도가 각각 출력된다.

충돌 결과의 해석

충돌 후의 속도를 통해 두 물체의 충돌 반응을 이해할 수 있으며, 이는 특히 물리 시뮬레이션이나 게임 개발에 유용하다.

충돌 반응 시뮬레이션의 확장

위의 기본적인 1차원 탄성 충돌 예제를 바탕으로, 실제 응용에서는 더 복잡한 상황을 시뮬레이션해야 할 때가 많다. 예를 들어 2차원이나 3차원 공간에서의 충돌, 비탄성 충돌, 물체의 회전과 모멘트 등을 고려할 필요가 있다.

2차원 및 3차원 충돌

2차원 또는 3차원 충돌에서는 속도와 위치 벡터, 그리고 법선 벡터 등을 고려해야 한다. 이 경우 벡터 연산을 기반으로 충돌 반응을 계산한다.

def elastic_collision_2d(v_A, v_B, m_A, m_B, n):
    """
    2차원 벡터 충돌 반응 계산.
    n은 충돌 표면의 법선 벡터.
    """
    un = n / np.linalg.norm(n)  # 법선 벡터의 단위 벡터
    ut = np.array([-un[1], un[0]])  # 접선 벡터 (법선 벡터에 수직)

    v_A_n = np.dot(v_A, un)  # 법선 벡터의 속도 성분
    v_A_t = np.dot(v_A, ut)  # 접선 벡터의 속도 성분
    v_B_n = np.dot(v_B, un)  # 법선 벡터의 속도 성분
    v_B_t = np.dot(v_B, ut)  # 접선 벡터의 속도 성분

    # 법선 성분의 새로운 속도 (1차원 탄성 충돌 계산)
    v_A_n_prime = (v_A_n * (m_A - m_B) + 2 * m_B * v_B_n) / (m_A + m_B)
    v_B_n_prime = (v_B_n * (m_B - m_A) + 2 * m_A * v_A_n) / (m_A + m_B)

    # 새로운 속도의 법선 및 접선 성분 합
    v_A_prime = v_A_n_prime * un + v_A_t * ut
    v_B_prime = v_B_n_prime * un + v_B_t * ut

    return v_A_prime, v_B_prime

n = np.array([1.0, 1.0])  # 충돌 표면의 법선 벡터
v_A = np.array([2.0, 1.0])  # 속도 벡터
v_B = np.array([-1.0, -1.5])  # 속도 벡터

v_A_prime, v_B_prime = elastic_collision_2d(v_A, v_B, m_A, m_B, n)

print("충돌 후 A의 속도 (2D):", v_A_prime)
print("충돌 후 B의 속도 (2D):", v_B_prime)

이와 같이 Vector Algebra를 이용한 2차원 및 3차원 충돌 계산 확장을 통해 다양한 물리적 현상을 시뮬레이션 할 수 있다.