미적분 핵심 정리

미적분은 크게 변화율을 다루는 미분변화를 누적하는 적분으로 나눌 수 있다.

게임 개발에서는 미적분이 직접 공식으로 등장하는 경우도 있지만, 더 중요한 것은 시간에 따라 값이 어떻게 변하는지를 계산하는 것이다.

대표적으로

위치 -> 속도 -> 가속도

의 관계가 미분과 적분으로 연결된다.

게임 물리, 애니메이션, 카메라 움직임, 최적화, 머신러닝 등에서도 미적분이 사용된다.

함수

미적분의 출발점은 함수다.

함수는 입력값을 받아 출력값을 결정하는 관계다.

y = f(x)

예를 들어

f(x) = x²

라면

x = 2 -> f(2) = 4
x = 3 -> f(3) = 9

가 된다.

게임에서 시간 t를 입력으로 생각하면 함수로 움직임을 표현할 수 있다.

position = f(t)

시간에 따라 위치가 변하는 함수를 만들면 움직이는 오브젝트를 수학적으로 표현할 수 있다.

극한

극한(Limit)은 어떤 값에 가까워질 때 함수가 어떤 값에 접근하는지를 나타낸다.

lim x->a f(x)

핵심은 실제로 x가 a가 되는 순간보다 a에 가까워지는 과정을 보는 것이다.

미분의 정의도 결국 극한에서 나온다.

f'(x) = lim h->0 (f(x+h) - f(x)) / h

여기서 h를 계속 작게 만들면서 순간적인 변화율을 구한다.

연속

함수가 어떤 지점에서 끊어지지 않고 이어져 있다면 그 지점에서 연속이라고 한다.

직관적으로는 그래프를 펜을 떼지 않고 그릴 수 있는 경우라고 생각할 수 있다.

함수 f(x)x=a에서 연속이려면

lim x->a f(x) = f(a)

가 성립해야 한다.

게임에서는 연속적인 움직임이 중요하다.

위치가 프레임마다 갑자기 튀면 움직임이 부자연스럽다.

Frame 1 -> Position A
Frame 2 -> Position B
Frame 3 -> Position C

각 위치가 시간에 따라 자연스럽게 이어져야 한다.

미분

미분(Differentiation)은 함수의 순간적인 변화율을 구한다.

가장 직관적으로는 그래프의 한 점에서의 기울기다.

함수

f(x) = x²

를 미분하면

f'(x) = 2x

가 된다.

따라서

x = 3

에서 순간 변화율은

f'(3) = 6

이다.

변화율은 게임에서 매우 중요한 개념이다.

도함수

미분한 결과를 도함수(Derivative)라고 한다.

f(x) -> f'(x)

도함수는 원래 값이 얼마나 빠르게 변하고 있는지를 나타낸다.

대표적인 미분 공식은 다음과 같다.

d/dx(x^n) = nx^(n-1)

d/dx(sin x) = cos x

d/dx(cos x) = -sin x

d/dx(e^x) = e^x

d/dx(ln x) = 1/x

미분의 기본 법칙

합의 법칙

(f + g)' = f' + g'

상수배

(cf)' = cf'

곱의 법칙

(fg)' = f'g + fg'

몫의 법칙

(f/g)' = (f'g - fg') / g²

연쇄법칙

함수가 여러 함수로 겹쳐 있는 경우 사용한다.

y = f(g(x))

이면

dy/dx = f'(g(x))g'(x)

연쇄법칙은 머신러닝의 Backpropagation을 이해할 때 특히 중요하다.

속도와 가속도

게임 개발에서 미적분이 가장 직관적으로 사용되는 부분이다.

위치를

x(t)

라고 하면 속도는 위치의 미분이다.

v(t) = dx/dt

가속도는 속도의 미분이다.

a(t) = dv/dt

따라서

Position -> Velocity -> Acceleration

x(t) -> x'(t) -> x''(t)

의 관계가 된다.

반대로 적분하면

Acceleration -> Velocity -> Position

이 된다.

게임 물리와 미적분

물리학에서는

F = ma

라는 관계를 사용한다.

따라서

a = F/m

이고 가속도를 시간에 대해 적분하면 속도가 된다.

v(t) = ∫a(t)dt

속도를 다시 적분하면 위치가 된다.

x(t) = ∫v(t)dt

전체 흐름은

Force -> Acceleration -> Velocity -> Position

이다.

게임 엔진에서 물리 시뮬레이션이 프레임 단위로 계산되는 것도 결국 이 관계를 수치적으로 근사하는 과정이다.

수치 적분

게임에서는 대부분 실제 연속적인 함수를 그대로 계산하지 않는다.

컴퓨터는 시간을 작은 구간으로 나눠서 근사한다.

가장 단순한 형태가 오일러 적분(Euler Integration)이다.

v(t + dt) = v(t) + a(t)dt

x(t + dt) = x(t) + v(t)dt

코드로 표현하면 대략 다음과 같다.

velocity += acceleration * deltaTime;
position += velocity * deltaTime;

여기서 deltaTime이 시간 간격이다.

따라서 게임에서

변화량 = 변화율 * 시간

이라는 관계는 매우 중요하다.

적분

적분(Integration)은 변화량을 누적하는 연산으로 볼 수 있다.

정적분은

∫[a,b] f(x) dx

형태로 표현한다.

그래프에서는 함수와 x축 사이의 부호를 가진 넓이로 해석할 수 있다.

게임에서는 시간에 따른 값을 누적할 때 적분의 개념이 사용된다.

예를 들어 속도가 계속 변한다면 위치는 속도를 시간에 대해 누적한 값이다.

Position = ∫Velocity dt

미적분의 기본정리

미분과 적분은 서로 반대되는 연산으로 연결된다.

함수 F(x)f(x)의 원시함수라면

F'(x) = f(x)

이고

∫ f(x)dx = F(x) + C

이다.

정적분에서는

∫[a,b] f(x)dx = F(b) - F(a)

가 된다.

이 관계를 미적분의 기본정리라고 한다.

핵심 구조는

미분 -> 변화율
적분 -> 누적량
미분 <-> 적분

이다.

부정적분

부정적분은 미분했을 때 원래 함수가 되는 함수를 찾는 과정이다.

예를 들어

∫2x dx = x² + C

이다.

+ C가 붙는지 이해하는 것도 중요하다.

상수는 미분하면 0이 되기 때문이다.

d/dx(x² + 3) = 2x
d/dx(x² + 100) = 2x

따라서 미분 결과만 보고 원래 함수를 찾으면 상수값은 알 수 없다.

정적분

정적분은 구간에서 누적된 양을 계산한다.

∫[a,b] f(x)dx

여기서 a, b는 적분 구간이다.

예를 들어 속도 함수가 있다면

∫[t1,t2] v(t)dt

를 이용해 해당 시간 동안의 이동량을 구할 수 있다.

Velocity -> Integral -> Displacement

가 된다.

미분과 그래프

도함수의 부호를 보면 함수의 증가와 감소를 판단할 수 있다.

f'(x) > 0 -> 증가
f'(x) < 0 -> 감소
f'(x) = 0 -> 극값 후보

예를 들어 함수의 기울기가

양수 -> 상승
0 -> 평평
음수 -> 하강

이라는 의미다.

극대와 극소

어떤 지점에서 함수가 주변보다 큰 값을 가지면 극대(Maximum), 작은 값을 가지면 극소(Minimum)라고 한다.

일반적으로

f'(x) = 0

인 지점에서 극값이 나타날 가능성이 있다.

하지만 f'(x)=0이라고 해서 반드시 극대나 극소인 것은 아니다.

대표적인 예가

f(x) = x³

이다.

x=0에서 미분값은 0이지만 극대나 극소는 아니다.

최적화

미분은 최적화 문제와 직접 연결된다.

어떤 함수의 최소값이나 최대값을 찾으려면 변화율을 분석할 수 있다.

목표 함수
-> 미분
-> 기울기 계산
-> 최소/최대 지점 탐색

머신러닝에서는 이 개념을 확장해서 손실 함수의 값을 줄이는 방향으로 파라미터를 업데이트한다.

Loss
-> Gradient
-> Parameter Update
-> Loss 감소

Gradient Descent가 대표적인 예다.

편미분

변수가 여러 개 있는 함수에서는 특정 변수 하나에 대해서만 미분할 수 있다.

예를 들어

f(x,y) = x² + 3y²

가 있다면

∂f/∂x = 2x

∂f/∂y = 6y

이다.

다른 변수는 상수처럼 취급한다.

게임에서 여러 변수에 의해 결정되는 값이나 머신러닝의 손실 함수처럼 입력이 여러 개인 경우 중요하다.

Gradient

다변수 함수의 각 편미분을 모은 벡터를 Gradient라고 한다.

∇f = (∂f/∂x, ∂f/∂y, ∂f/∂z)

Gradient는 함수가 가장 빠르게 증가하는 방향을 나타낸다.

반대로

-∇f

방향으로 이동하면 가장 빠르게 감소하는 방향을 찾을 수 있다.

그래서 Gradient Descent에서는

parameter = parameter - learningRate * gradient

형태의 업데이트를 사용한다.

2차 미분

한 번 미분한 함수를 다시 미분할 수 있다.

f(x)
-> f'(x)
-> f''(x)

2차 미분은 변화율 자체가 얼마나 변하는지를 나타낸다.

게임 물리에서는

Position
-> Velocity
-> Acceleration

관계와 연결된다.

x(t)
x'(t)
x''(t)

이다.

테일러 급수

복잡한 함수를 다항식으로 근사하는 방법이다.

대표적인 형태는

f(x) = f(a)
     + f'(a)(x-a)
     + f''(a)/2!(x-a)²
     + ...

이다.

핵심 아이디어는 어떤 함수의 특정 지점에서

값
-> 1차 변화율
-> 2차 변화율
-> 고차 변화율

을 이용해 함수의 형태를 근사하는 것이다.

게임이나 그래픽스에서 모든 함수를 직접 계산하기 부담스러운 경우 근사식을 사용하는 경우가 있다.

삼각함수와 미적분

게임 개발에서는 삼각함수와 미적분을 같이 사용하는 경우가 많다.

예를 들어 원운동은

x(t) = r cos(t)
y(t) = r sin(t)

으로 표현할 수 있다.

이를 미분하면

x'(t) = -r sin(t)
y'(t) =  r cos(t)

가 된다.

따라서 위치 함수에서 속도 함수를 얻을 수 있다.

Position -> Differentiate -> Velocity

게임에서 원형으로 움직이는 오브젝트, 궤적, 카메라 움직임 등을 수학적으로 표현할 때 사용할 수 있다.

보간과 함수

게임의 부드러운 움직임에도 함수가 사용된다.

단순한 선형 보간은

Lerp(a,b,t) = a + (b-a)t

이다.

여기에 시간 함수를 적용하면 다양한 움직임을 만들 수 있다.

t -> Easing Function -> Lerp -> Position

예를 들어

f(t) = 3t² - 2t³

같은 함수를 이용하면 시작과 끝에서 변화율을 낮춰 부드러운 움직임을 만들 수 있다.

미적분에서 핵심적으로 기억할 것

미적분의 핵심을 단순하게 정리하면 다음과 같다.

함수
-> 입력과 출력의 관계

극한
-> 특정 값에 가까워지는 과정

미분
-> 순간 변화율

도함수
-> 변화율을 나타내는 함수

적분
-> 변화량의 누적

편미분
-> 여러 변수 중 특정 변수의 변화율

Gradient
-> 여러 변수에 대한 변화율을 벡터로 표현

최적화
-> 최대/최소가 되는 지점 탐색

게임 개발 관점에서는 이것이 다음과 같이 연결된다.

Position -> Derivative -> Velocity -> Derivative -> Acceleration
Acceleration -> Integral -> Velocity -> Integral -> Position

그리고 실제 게임에서는 연속적인 수학식을 그대로 계산하기보다 작은 시간 간격으로 근사한다.

연속적인 수학 모델
-> 시간 간격으로 분할
-> 수치 계산
-> 게임 프레임에 적용

결국 미적분의 본질은 변화와 누적을 다루는 것이다.

게임에서 위치가 변하면 속도가 되고, 속도가 변하면 가속도가 된다. 반대로 가속도를 누적하면 속도가 되고, 속도를 누적하면 위치가 된다.

이 관계만 제대로 잡아도 게임 물리와 애니메이션에서 등장하는 많은 수식이 단순히 외워야 하는 공식이 아니라 하나의 연결된 구조로 보이기 시작한다.