1. 개요
| 수치적분 Numerical Integration / Quadrature | |
|---|---|
| 목적 | 적분값의 근사 계산 |
| 기본 형태 | ∫f(x)dx ≈ Σ wi f(xi) |
| 대표 기법 | 사다리꼴, 심프슨, 가우스 구적 |
| 오차 차수 | 사다리꼴 O(h2) · 심프슨 O(h4) |
| 고차원 대안 | 몬테카를로 방법 |
| 주요 응용 | FEM, FVM |
못 푸는 적분은 없다. 정확히 못 풀 뿐이다.
수치적분(numerical integration), 또는 구적법(quadrature)은 해석적으로 풀리지 않거나 함수값만 알려진 적분 를 유한 개의 함수값에 가중치를 곱해 더하는 방식으로 근사 계산하는 기법이다. 일반적인 형태는
로, 노드(node) 를 어디에 찍고 가중치 를 어떻게 줄 것인가가 모든 방법론의 차이를 만든다.1 세상의 적분 대부분은 초등함수로 안 풀리기 때문에, 실무 수치해석에서 수치적분은 미분방정식 못지않게 자주 쓰이는 기본기다.
2. 뉴턴-코츠 공식들
노드를 등간격으로 찍고, 그 위에서 함수를 다항식으로 보간한 뒤 그 다항식을 적분하는 방식이 뉴턴-코츠(Newton–Cotes) 공식이다. 가장 낮은 차수부터 익숙한 얼굴들이 나온다.
- 사다리꼴 공식(trapezoidal rule): 두 점을 직선으로 이어 사다리꼴 넓이로 근사. 구간을 개로 쪼갠 복합 공식의 오차는 어떤 에 대해 , 즉 다. 단순함이 곧 미덕.
- 심프슨 공식(Simpson’s rule): 세 점을 2차 포물선으로 이어 근사. 복합 공식의 오차는 로 까지 좋아진다. 구간을 짝수 개로 나눠야(=노드 개수가 홀수) 3점 묶음이 딱 맞아떨어진다는 사소한 제약만 지키면 가성비가 훌륭해 국룰 취급.2
- 고차 뉴턴-코츠: 심프슨 3/8, 불(Boole) 공식 등으로 올라가지만, 등간격 고차 보간은 룽게 현상(Runge phenomenon)으로 진동하고 가중치에 음수가 섞인다. 닫힌 뉴턴-코츠에서 음의 가중치는 9점(8구간) 규칙에서 처음 나타나고 11점 이상에서는 사실상 상시화되는데, 음수 가중치는 반올림오차를 증폭시켜(부동소수점 연산의 자리수 손실) 수치적으로 위험하다. 그래서 실무에선 낮은 차수를 여러 구간으로 나눠(composite) 반복 적용하는 게 정석이다.
사다리꼴 값을 스텝을 반으로 줄이며 여러 번 구한 뒤 리처드슨 외삽법으로 고차항을 소거하는 롬베르크 적분(Romberg integration)도 같은 족보에서 나온다. 매끄러운 함수라면 몇 단계만으로 까지 올라간다.
2.1. 검산: 수렴 차수 확인
를 배정밀도에서 복합 공식으로 계산한 실제 오차다.
| 구간 수 | 사다리꼴 오차 | 오차비 | 심프슨 오차 | 오차비 |
|---|---|---|---|---|
| 4 | 1.04e-1 | — | 4.56e-3 | — |
| 8 | 2.58e-2 | 4.03 | 2.69e-4 | 16.9 |
| 16 | 6.43e-3 | 4.01 | 1.66e-5 | 16.2 |
스텝을 절반으로 줄일 때마다 사다리꼴 오차는 약 4배(), 심프슨 오차는 약 16배() 줄어든다. 위에 적은 오차식의 차수가 실측으로 확인되는 셈이며, 이런 관측 수렴 차수 확인은 코드 검증의 기본 동작이다. 참고로 같은 문제를 2점 가우스-르장드르로 풀면 함수값 2개로 오차 가 나온다. 함수값 5개를 쓴 4구간 사다리꼴(1.04e-1)보다 좋은 값이라, 점 개수당 효율의 차이가 다음 절의 주제다.
3. 가우스 구적법
노드를 등간격에 묶어 둘 이유가 없다면? 가우스 구적법(Gaussian quadrature)은 노드 위치까지 자유변수로 풀어, 같은 점 개수로 최대 차수의 다항식을 정확히 적분한다. 개의 점으로 차 다항식까지 오차 0으로 적분하는데, 이는 뉴턴-코츠가 따라올 수 없는 효율이다. 노드와 가중치가 각각 개씩 총 개의 자유도이므로 개 조건(의 정확 적분)을 맞출 수 있다는 셈이 그대로 차수가 된다.
비결은 노드를 직교다항식의 근에 배치하는 것이다. 가중함수 1이면 르장드르 다항식의 근이 되고, 가중함수에 따라 체비쇼프 다항식(가중 ), 라게르(반무한구간 ), 에르미트(무한구간 ) 계열로 갈라진다. 노드·가중치를 실제로 구하는 표준 알고리즘은 직교다항식의 3항 점화식으로 만든 대칭 삼중대각 야코비 행렬의 고유값 문제를 푸는 골루브-웰시(Golub–Welsch) 방법이다 — 고유값이 노드, 고유벡터 첫 성분의 제곱이 가중치가 된다.
검산은 손으로도 된다. 2점 가우스-르장드르는 , 이므로 를 계산하면 으로, 참값 과 마지막 자리까지 일치한다(3차 = 까지 정확하다는 주장 그대로).
유한요소법에서 요소 강성행렬을 적분할 때 쓰는 가우스 점(Gauss point)이 바로 이것이다.3 등간격 노드를 쓰면서도 가우스에 준하는 정확도를 내는 클렌쇼-커티스 구적(Clenshaw–Curtis, 체비쇼프 노드 + FFT로 가중치 계산)도 있는데, 트레페선은 대부분의 실전 함수에서 두 방법의 정확도 차이가 상수배에 불과하다는 것을 보였다.
4. 적응 구적
함수가 어떤 구간에선 밋밋하고 어떤 구간에선 요동친다면, 전 구간에 같은 촘촘함을 적용하는 건 낭비다. 적응 구적(adaptive quadrature)은 구간을 재귀적으로 반으로 쪼개면서, 쪼개기 전후의 추정값 차이(오차 추정)가 허용오차보다 크면 그 부분만 더 잘게 나눈다. 함수가 급변하는 곳에 계산 자원을 집중하는 셈이다.
오차 추정의 표준 도구가 가우스-크론로드(Gauss–Kronrod) 쌍이다. 점 가우스 규칙의 노드를 그대로 포함하면서 점을 더 끼워 넣어 고차 규칙을 만들고, 두 값의 차이를 오차 추정으로 쓴다. 노드를 재활용하므로 함수 평가를 낭비하지 않는다는 것이 핵심 이점. QUADPACK과 그 후손들(scipy.integrate.quad, GSL의 gsl_integration_qag)이 이 전략을 돌리며, 대표적으로 15점 크론로드 + 7점 가우스(G7–K15) 조합이 기본값으로 쓰인다. 사용자는 그냥 함수와 구간만 던지면 되지만, 뒤에서는 구간 분할 목록과 오차 예산을 관리하는 정교한 제어가 굴러가고 있다.
끝점 특이점( 꼴)이나 무한구간은 적응 분할만으로는 힘들다. 이때는 특이성을 가중함수로 흡수하는 가우스 규칙(야코비·라게르), 변수변환으로 특이점을 완화하는 방법, 또는 이중지수 변환(tanh–sinh, double-exponential) 구적을 쓴다. 적분값이 발산하는지 수렴하는지를 먼저 판단하는 것은 여전히 사람의 몫이다.
5. 다차원과 몬테카를로
1차원까진 위 방법들이 잘 먹힌다. 문제는 차원이 올라갈 때다. 격자 기반 구적법은 차원에서 노드 수가 로 폭증하는 차원의 저주(curse of dimensionality)에 걸린다. 10차원에서 축마다 노드 10개면 벌써 100억 점이다.
여기서 몬테카를로 방법이 판을 뒤집는다. 무작위 샘플로 적분을 추정하는 몬테카를로의 오차는 표본 수 에 대해 로, 차원과 무관하다. 저차원에선 가우스 구적에 처참히 지지만, 고차원에선 유일한 현실적 선택지가 된다. 오차 상수가 피적분함수의 분산이라 중요도 샘플링으로 분산을 깎는 것이 실전 기술이고, 저불일치 수열을 쓰는 준몬테카를로는 매끄러운 함수에서 까지 올라간다. 중간 차원(수십 차원)에서는 1차원 규칙을 스몰야크(Smolyak) 방식으로 성기게 텐서곱하는 **스파스 그리드**가 격자와 무작위의 절충으로 쓰인다.4
| 상황 | 추천 기법 |
|---|---|
| 매끄러운 저차원 함수 | 가우스 구적 |
| 함수값만 아는 등간격 데이터 | 심프슨 등 뉴턴-코츠 |
| 급변·불규칙 1차원 함수 | 적응 구적(가우스-크론로드) |
| 끝점 특이점·무한구간 | 가중 가우스 · 이중지수 변환 |
| 수십 차원 | 희소 격자 · 준몬테카를로 |
| 고차원 | 몬테카를로 계열 |
6. FEM/FVM에서의 역할
수치적분은 수치해석 교과서 안에만 사는 개념이 아니다. 유한요소법에서는 갤러킨 방법으로 유도된 약형식(weak form)의 요소 적분을 매번 가우스 구적으로 처리한다. 강성행렬과 질량행렬의 모든 항이 사실은 수치적분의 결과물이다.
적분점 수는 공짜로 고르는 값이 아니다. 8절점 육면체 요소의 완전적분은 방향마다 2점씩 점을 쓰는데, 이를 1점으로 줄이는 저감적분(reduced integration)은 계산을 8분의 1로 줄이고 전단 잠김(shear locking)을 완화하지만, 변형에너지를 만들지 않는 가짜 변형 모드(hourglass mode)를 부른다. 그래서 상용 코드는 저감적분에 인공 강성(hourglass control)을 얹어 판다 — “저감적분 + 모래시계 제어”가 명시적 동해석의 사실상 표준 조합인 이유다.
유한체적법에서도 검사체적 면을 지나는 플럭스를 면적분으로 계산하며, 여기에 구적 규칙이 들어간다. 2차 정확도 유한체적법이 면 중앙 1점 값을 면적에 곱하는 것으로 끝내는 것도 실은 중점 구적을 쓰는 것이고, 고차 정확도를 노리면 면마다 다점 구적이 필요해진다. 요컨대 전산유체역학이든 구조해석이든, 이산화된 방정식의 계수 하나하나에 수치적분이 조용히 깔려 있다. 눈에 안 띌 뿐, 안 쓰이는 곳이 없다.
7. 관련 문서
- 보간과 근사 · 직교다항식 · 르장드르 다항식 · 체비쇼프 다항식
- 몬테카를로 방법 · 준몬테카를로 · 차원의 저주
- 유한요소법 · 유한체적법 · 갤러킨 방법
- 룽게-쿠타법 · 리처드슨 외삽법 · 고유값 문제
- 절단오차 · 부동소수점 연산 · 검증 및 확인
- 전산유체역학 · 구조해석 · 수치해석
8. Footnotes
-
“구적(quadrature)“이라는 옛말은 원의 넓이를 같은 넓이의 정사각형으로 바꾸는 고대 기하학 문제에서 왔다. 넓이=적분을 구하는 일이 곧 quadrature였던 셈. 요즘도 수치적분 함수 이름에
quad가 붙는 이유다. ↩ -
심프슨 공식은 토머스 심프슨(1710~1761)이 대중화했지만 정작 케플러가 먼저 썼다(포도주 통의 부피를 재는 데 썼다고 해서 “케플러의 통 규칙”이라 부른다). 수학사에서 정리 이름이 발견자와 안 맞는 건 흔한 일이라, 놀랄 것도 없다. ↩
-
가우스 점 개수를 외우고 있으면 FEM 좀 해 본 티가 난다. 2차원 4절점 사각형 완전적분이 2×2 = 4점, 3차원 8절점 육면체가 2×2×2 = 8점, 20절점 육면체가 3×3×3 = 27점. 사면체는 텐서곱이 안 되므로 별도로 유도한 대칭 규칙표(1점·4점·5점 …)를 쓴다. ↩
-
몬테카를로의 는 축복이자 저주다. 차원과 무관해서 고차원에선 최고지만, 정밀도를 10배 올리려면 표본을 100배 늘려야 한다는 뜻이기도 하다. “정확도는 신에게, 계산은 GPU에게 맡긴다”가 괜히 나온 말이 아니다. ↩
이 문서의 주요 출처
- NIST Digital Library of Mathematical Functions §3.5 — Quadrature
- G. H. Golub & J. H. Welsch, "Calculation of Gauss Quadrature Rules", Math. Comp. 23 (1969) 221–230
- L. N. Trefethen, "Is Gauss Quadrature Better than Clenshaw–Curtis?", SIAM Review 50(1), 2008, 67–87
- GNU Scientific Library Reference Manual — Numerical Integration (QUADPACK, Gauss–Kronrod rules)
- SciPy Reference — scipy.integrate.quad (adaptive QUADPACK wrapper)
의견을 반영할게요. 감사합니다.