에듀테크 프로젝트 대시보드
정적분과 넓이 — 리만 합
곡선 아래 넓이를 어떻게 구할까? 잘게 쪼갠 직사각형들의 넓이를 더한 뒤, 분할을 무한히 촘촘하게 만드는 것 — 그것이 정적분이다. (미적분1 · 적분)
곡선 y = f(x) 아래 넓이는 초등학교에서 배운 "가로 × 세로" 공식으로는 안 구해진다. 대신 구간을 잘게 나눠 직사각형으로 근사하고, 그 근사를 점점 정밀하게 만든다. 아래 위젯에서 분할 수 n 을 키우면 직사각형들의 합(리만 합)이 진짜 정적분 값으로 수렴하는 과정을 눈으로 볼 수 있다.
함수를 고르고, 적분 구간 [a, b] 와 분할 수 n 을 조절해 보자. 캔버스 아래쪽의 ▲ 삼각형 핸들을 좌우로 끌어도 구간이 바뀐다. 왼쪽끝 / 오른쪽끝 / 중점 중 어느 높이로 직사각형을 세울지도 골라볼 수 있다.
위 그래프: 같은 함수·구간·표본점 방식에서 n 을 1 → 200 으로 키울 때 절대 오차 |Sₙ − 정적분| (세로축 로그). 빨간 점이 지금 슬라이더의 n 위치다. n 이 커질수록 오차가 0 으로 내려간다.
구간 [a, b] 를 n 등분하면 각 조각의 폭은 Δx = (b − a) / n 이다. k 번째 조각에서 표본점 xₖ* 를 하나 잡아 높이 f(xₖ*) 인 직사각형을 세우고 전부 더한 것이 리만 합이다.
표본점을 조각의 왼쪽끝으로 잡으면 왼쪽 리만 합, 오른쪽끝이면 오른쪽 리만 합, 가운데면 중점 리만 합이다. 위젯에서 확인했듯 같은 n 이라도 중점 방식이 보통 오차가 훨씬 작다. 하지만 n → ∞ 로 보내면 세 방식 모두 같은 값에 수렴한다. 이 극한을 정적분이라 하고 이렇게 쓴다.
기호 ∫ 는 "합(Sum)"의 S 를 늘인 것이고, dx 는 무한히 얇아진 Δx 를 뜻한다. 즉 정적분은 "무한히 많은, 무한히 얇은 직사각형 넓이의 합"이다.
| 표본점 방식 | xₖ* (k = 1 … n) | 특징 |
|---|---|---|
| 왼쪽끝 | a + (k−1)Δx | 증가함수면 항상 과소평가 |
| 오른쪽끝 | a + kΔx | 증가함수면 항상 과대평가 |
| 중점 | a + (k−½)Δx | 위아래 오차가 상쇄돼 수렴이 빠름 |
극한을 매번 계산할 수는 없다. 다행히 미적분의 기본정리가 지름길을 준다. f 의 부정적분(원시함수) F 를 하나 찾으면 (즉 F ′(x) = f(x)), 정적분은 양 끝값의 뺄셈으로 끝난다.
위젯의 "실제 정적분" 값은 바로 이 공식으로 계산한 것이다. 선택할 수 있는 네 함수의 원시함수는 다음과 같다.
| f(x) | 원시함수 F(x) |
|---|---|
| x² | x³ / 3 |
| sin x + 1 | −cos x + x |
| √x | (2/3) x3/2 |
| x³ − x + 1 | x⁴/4 − x²/2 + x |
정적분은 f(x) < 0 인 구간에서 음수를 더한다. 위젯에서 f(x) = x³ − x + 1 을 골라 구간을 [-2, 1] 쯤으로 놓으면, 축 아래로 내려간 빨간 직사각형들이 보인다. 이 부분은 정적분 값을 깎아내린다.
그래서 "곡선과 x축 사이의 실제 넓이"를 원한다면 음수 구간을 뒤집어야 한다.
예를 들어 ∫02π sin x dx = 0 이다 (위로 볼록한 부분과 아래로 볼록한 부분이 정확히 상쇄). 하지만 그 곡선과 x축이 실제로 감싸는 넓이는 ∫02π |sin x| dx = 4 로 0 이 아니다. 정적분은 "부호가 있는 넓이"라는 점을 늘 기억하자.
def riemann(f, a, b, n, mode="mid"): dx = (b - a) / n total = 0.0 for k in range(n): xl, xr = a + k*dx, a + (k+1)*dx xs = xl if mode == "left" else xr if mode == "right" else (xl + xr) / 2 total += f(xs) * dx # f(xs) 가 음수면 음수가 더해진다 return total print(riemann(lambda x: x*x, 0, 2, 10)) # ≈ 2.66 (정답 8/3 = 2.667) print(riemann(lambda x: x*x, 0, 2, 2000)) # ≈ 2.6667 — n 을 키우면 수렴