극한과 미분: 함수의 git diff
한 점의 기울기 문제에서 극한이 탄생하고, 미분이 각 지점의 변화율을 새 함수로 만든다. 핵심 규칙 3개만 알면 나머지는 전부 조합이다.
극한과 미분: 함수의 git diff
Stage 2에서 일차함수의 기울기를 봤어. 두 점 사이의 변화율. 일차함수는 어디서든 기울기가 같으니까 문제없었어. 근데 f(x) = x² 같은 곡선에서 한 점의 기울기를 구하고 싶으면?
두 점이 있어야 기울기를 구하는데, 점 하나로는 Δx = 0이 되니까 0/0이 돼. 정의 불가.
극한: "한없이 가까이"
아이디어: B를 A에 한없이 가까이 보내면?
f(x) = x^2, point A at x = 3
B at x=4: slope = (16-9)/(4-3) = 7
B at x=3.5: slope = (12.25-9)/(0.5) = 6.5
B at x=3.1: slope = (9.61-9)/(0.1) = 6.1
B at x=3.01: slope = (9.0601-9)/(0.01) = 6.01
B at x=3.001: slope = 6.001
...
B -> A: slope -> 6
B를 A에 가까이 보낼수록 기울기가 6에 수렴해. B가 A에 "도달"하진 않지만, 기울기는 6에 한없이 가까워져.
이게 극한이야:
lim (f(3+h) - f(3)) / h = 6
h->0
극한은 "도달"이 아니라 "수렴"
h never equals 0 (we never divide by zero)
but the result gets arbitrarily close to 6
so we say the limit IS 6
function approachLimit(f, x) {
const results = [];
for (let h = 1; h > 1e-10; h /= 10) {
results.push((f(x + h) - f(x)) / h);
}
return results;
// [7, 6.5, 6.1, 6.01, 6.001, ...]
// converges to 6
}뉴턴/라이프니츠 vs 코시/바이어슈트라스
재밌는 역사가 있어:
1680s: Newton/Leibniz - "works, trust me bro"
used "infinitesimals" - logically shaky but correct results
1800s: Cauchy/Weierstrass - epsilon-delta definition
finally made limits rigorous
150년 동안 논리적 기반 없이 잘 돌아가는 도구를 먼저 쓰고, 나중에 기초를 깔은 거야. 프로덕션에 먼저 배포하고 테스트를 나중에 작성한 셈이지.
그리고 우리가 지금 쓰는 표기법(dy/dx, ∫)은 대부분 라이프니츠 거야. 뉴턴의 표기법은 거의 사라졌어. dy/dx라는 표기가 "y의 변화량 / x의 변화량"이라는 직관을 그대로 담고 있거든. 좋은 네이밍이 이긴 거야.
미분 = 각 지점의 기울기를 새 함수로
미분의 정의
f'(x) = lim (f(x+h) - f(x)) / h
h->0
"x에서 아주 조금(h) 움직였을 때, 출력이 얼마나 변하는가"
f(x) = x²로 직접 해보자:
극한식 세우기
f'(x) = lim ((x+h)² - x²) / h
전개
= lim (x² + 2xh + h² - x²) / h = lim (2xh + h²) / h
약분
= lim (2x + h)
h → 0
= 2x
x²의 미분은 2x. x = 3에서의 기울기는 2(3) = 6. 아까 극한으로 수렴했던 값과 일치하지.
미분 = git diff
f(x) = x^2 f'(x) = 2x
original function its slope at each point
(the source code) (the diff)
미분은 "각 지점에서의 기울기를 새로운 함수로 만든 것"이야. 원본이 아니라 변화량을 보는 거야.
Article 4에서 이차함수의 증가량이 1, 3, 5, 7이었고 "증가량의 증가량은 2, 2, 2"라고 했잖아. 이제 그 인터페이스가 구현된 거야:
f(x) = x^2 original function
f'(x) = 2x first derivative (rate of change)
f''(x) = 2 second derivative (rate of rate of change)
= constant! that's why it was 2, 2, 2
3가지 핵심 규칙만 알면 된다
미분 규칙이 많아 보이지만, 근본 원리는 하나야 -- "h→0으로 보내서 정리하면 이렇게 될 수밖에 없다."
1. 거듭제곱 규칙 (Power Rule)
f(x) = x^n → f'(x) = nx^(n-1)
x^2 → 2x
x^3 → 3x^2
x^4 → 4x^3
x^1 → 1 (일정한 기울기 = 일차함수)
x^0 → 0 (상수는 변화 없음)
2. 곱의 미분 (Product Rule)
(f × g)' = f'×g + f×g'
왜 f' × g'이 아닐까? 직사각형으로 생각하면 자명해:
think of a rectangle with sides f and g
area = f * g
g g+dg
+----------+----+
| | | <- f * dg (g grew, f stayed)
f | f * g | |
+----------+----+
| df * g | <- df * g (f grew, g stayed)
+----------+----+
df
total change ~ f*dg + df*g
(the tiny corner df*dg vanishes in the limit)
양쪽이 동시에 변하는 "꼬다리"(df × dg)는 극한에서 사라져.
3. 연쇄 법칙 (Chain Rule)
(f(g(x)))' = f'(g(x)) × g'(x)
이게 가장 중요하고, 직관도 명확해:
x --[g]--> g(x) --[f]--> f(g(x))
x changes by dx
g changes by g'(x) * dx (g's rate * input change)
f changes by f'(g) * (change in g)
= f'(g(x)) * g'(x) * dx
기어 비유가 가장 좋아:
gear A (g): 1 turn of input -> 3 turns output (g' = 3)
gear B (f): 1 turn of input -> 2 turns output (f' = 2)
chained: 1 turn of input -> 3 * 2 = 6 turns output
chain rule = multiplying the gear ratios
각 단계의 변화 배율을 곱하면 전체 변화 배율이 나와.
연쇄 법칙 = 역전파(Backpropagation)
연쇄 법칙이 머신러닝에서 역전파의 수학적 기반이야. 신경망이 학습할 때 "출력의 오차가 각 가중치에 얼마나 영향받는가"를 연쇄 법칙으로 계산하거든. 기어 비유 그대로 -- 여러 층의 변화 배율을 역방향으로 곱해나가는 거지.
3개 규칙으로 모든 미분 도출하기
Level 0 - from limit definition (must derive once):
(x^n)' = nx^(n-1)
(sin x)' = cos x
(cos x)' = -sin x
(e^x)' = e^x
Level 1 - derived from Level 0 + the three rules:
(tan x)' = sec^2(x) <- quotient = product + chain
(ln x)' = 1/x <- inverse function + chain
(a^x)' = a^x * ln(a) <- rewrite as e^(x*ln(a)) + chain
Level 2 - any combination:
(sin(x^2))' = cos(x^2)*2x <- chain rule
(x*ln(x))' = ln(x) + 1 <- product rule
(e^(sin x))' = e^(sin x)*cos(x) <- chain rule
Level 0의 기본 부품 몇 개만 극한으로 도출하고, 이후엔 전부 세 규칙의 조합이야. "소수의 primitive + 조합 규칙 = 모든 것"이라는 구조. 프로그래밍에서 소수의 기본 연산으로 모든 프로그램을 만드는 것과 같지.
반복 테마: 분해
몫의 미분도 외울 필요 없어. f/g = f × g⁻¹로 보고 곱의 미분 + 연쇄 법칙으로 도출하면 돼. 규칙을 줄이는 게 핵심이야.
다음 글 미리보기
미분의 역질문이 등장한다. "이 변화율의 원래 함수는?" -- 그게 적분이야. 미분이 git diff였다면, 적분은 reduce(). 그리고 이 둘이 정확한 역관계라는 게 미적분에서 가장 아름다운 정리야.