스플라인과 곡선
5장의 결론은 "등간격 데이터에 고차 다항식을 쓰지 말라"였습니다. 그렇다면 점이 수백 개인 측정 데이터나 글자의 윤곽선은 무엇으로 이어야 할까요? 답은 낮은 차수의 다항식을 조각조각 이어 붙이고, 이음매에서 매끄러움을 맞추는 것입니다. 이 장은 가장 단순한 꺾은선에서 시작해, 오버슈트 없이 단조성을 지키는 PCHIP, 곡률까지 연속인 3차 스플라인과 그 삼중대각 선형계, 경계 조건의 선택, 스플라인이 "가장 덜 휜 곡선"이라는 정리를 다룹니다. 후반부는 함수의 그래프가 아닌 곡선, 곧 글꼴과 CAD와 애니메이션 경로를 그리는 베지에 곡선과 B-스플라인입니다.
- 조각별 선형 보간의 오차 를 유도하고, 차수를 올리는 대신 간격을 줄이는 전략을 설명한다.
- 조각별 3차 에르미트 보간에서 기울기를 고르는 방법(PCHIP)이 단조성을 지키는 이유를 안다.
- 3차 스플라인의 연속 조건에서 이차 도함수에 대한 삼중대각계를 유도하고 토머스 알고리즘으로 에 푼다.
- 자연·고정·not-a-knot 경계 조건의 차이와 수렴 차수( 대 )를 실험으로 확인한다.
- 자연 스플라인이 굽힘 에너지 를 최소로 하는 보간 함수임을 증명한다.
- 베지에 곡선을 드 카스텔조 알고리즘으로 계산하고, B-스플라인이 국소 제어를 주는 이유를 기저 함수의 받침으로 설명한다.
컴퓨터 이전의 조선소와 항공기 공장에서는 길고 얇은 나무 자를 스플라인이라 불렀습니다. 자를 바닥의 못이나 무거운 추 사이에 끼우면 자는 탄성 에너지가 가장 작은 모양으로 휘어 점들을 매끄럽게 잇습니다. 1946년 쇤베르크(Isaac Schoenberg)가 이 이름을 빌려 조각별 다항식 이론을 세웠고, 그 3차 스플라인이 실제로 "굽힘 에너지 최소" 성질을 가진다는 것이 이 장의 정리 6.8입니다.
1950년대 말~1960년대에 프랑스 자동차 회사의 두 엔지니어, 시트로엥의 드 카스텔조(Paul de Casteljau)와 르노의 베지에(Pierre Bézier)는 차체의 곡면을 도면 대신 숫자로 전달하는 방법을 각자 만들었습니다. 오늘날 이 글을 표시하는 글꼴의 윤곽선(TrueType은 2차, PostScript·CFF 글꼴은 3차 베지에), 벡터 그림, CSS 애니메이션의 cubic-bezier() 곡선, CAD의 NURBS가 모두 그 후손입니다.
고차 보간의 대안: 조각별 다항식
온도 센서가 1초마다 값을 기록해 50개의 점을 얻었습니다. 5장의 결과대로 49차 보간 다항식은 양 끝에서 폭발하고, 점 하나만 바꿔도 곡선 전체가 흔들립니다. 노드를 체비쇼프 점으로 옮길 수도 없습니다. 측정 시각은 이미 정해져 있으니까요.
해결책은 전체 구간을 노드로 나눈 각 작은 구간마다 낮은 차수의 다항식을 쓰는 것입니다. 노드 로 나누고 , 라 합시다. 가장 단순한 것은 이웃한 두 점을 직선으로 잇는 조각별 선형 보간(piecewise linear interpolation)입니다.
증명. 한 구간 에서 은 두 점의 1차 보간이므로 5장 정리 5.6에서 . 의 최댓값은 가운데에서 이다. ∎
다항식 보간과 결정적으로 다른 점은 오차가 에만 의존하고 차수가 고정이라는 것입니다. 을 늘리면 이므로 오차는 로 반드시 줄어듭니다. 룽게 현상이 없습니다. 또 한 점의 값을 바꾸면 이웃한 두 구간만 바뀝니다(국소성).
- , 이므로 한계 .
- 실제 최대 오차는 를 가운데에 둔 구간에서 생긴다. 노드가 이므로 가 노드이고, 최대는 (구간 의 가운데 근처)에서 이다.
- 한계와 거의 같다. 이 구간 안에서 거의 일정할 때 한계는 날카롭다. 오차 을 원하면 , 약 1100개 구간이 필요하다. 1차는 단순하지만 느리다. 더 높은 정확도는 구간 안의 다항식을 3차로 올려서 얻는다.
그런데 꺾은선은 노드에서 기울기가 끊깁니다. 자동차 차체나 로봇 궤적에서 기울기의 불연속은 반사광의 꺾임이나 가속도의 충격으로 나타납니다. 그래서 구간마다 3차 다항식을 쓰고 이음매에서 기울기()나 곡률()까지 맞춥니다. 아래 시뮬레이터에서 세 가지를 비교해 보세요. 3차 스플라인은 3절에서 유도합니다.
점을 끌어 비교하기: 다항식 vs 꺾은선 vs 3차 스플라인
조각별 3차 에르미트와 단조성(PCHIP)
열전대의 전압–온도 보정표는 단조 증가합니다. 그런데 보정점이 고르지 않게 놓여 있으면 매끄러운 보간 곡선이 데이터 사이에서 살짝 내려갔다가 올라갈 수 있습니다. 그러면 같은 전압에 온도 두 개가 대응해 역함수가 망가집니다. 매끄러우면서도 데이터의 모양(단조성)을 지키는 보간이 필요합니다.
5장 8절의 에르미트 보간을 구간마다 씁니다. 각 노드에서 값 와 기울기 를 정하면 구간 의 3차식은 로
남은 문제는 기저 를 어떻게 정하느냐입니다. 을 안다면 그대로 쓰고(에르미트 데이터), 모른다면 데이터에서 추정해야 합니다. 구간의 기울기 를 쓰는 다음 규칙이 프리치–칼슨(Fritsch–Carlson, 1980) 계열의 PCHIP(Piecewise Cubic Hermite Interpolating Polynomial)입니다.
pchip, SciPy PchipInterpolator의 방식).핵심 아이디어. 은 의 2차식이고, 가 에서 음이 되지 않을 조건을 평면에 그리면 원 를 품는 영역이 된다. 조화 평균 규칙은 를 0 이상 3 이하로 두어 이 영역 안에 머문다(등간격이면 ). ∎
- : 과 의 조화 평균 . : , . 대칭으로 , . 끝점 , .
- 가파른 구간 의 양 끝 기울기가 로 작게 잡혔다. 곡선은 평평하게 들어와서 구간 안에서 가파르게 오르고 다시 평평하게 나간다. PCHIP의 범위는 정확히 이다.
- 같은 데이터의 자연 3차 스플라인은 에서 로 내려가고 에서 로 넘친다. 데이터 범위를 벗어나는 오버슈트이고, 단조성도 깨진다.
대가도 있습니다. PCHIP는 일 뿐 곡률이 이음매에서 끊기고, 매끄러운 함수에 대한 정확도는 3차 스플라인보다 낮습니다(4절의 표에서 근처). 모양을 지키는 것이 중요하면 PCHIP, 매끄러운 함수의 정확도가 중요하면 스플라인입니다.
PCHIP는 넘치지 않는다: 스플라인과의 비교
3차 스플라인의 유도: 삼중대각계
PCHIP는 기울기를 각 노드에서 따로 정했습니다. 이음매에서 이차 도함수(곡률)까지 연속이 되도록 기울기를 함께 정하면 나무 자 스플라인처럼 매끄러운 곡선이 됩니다. 이 조건은 모든 구간을 한꺼번에 엮는 연립방정식이 됩니다.
미지수를 셉시다. 구간 개에 3차식 하나당 계수 4개, 모두 개입니다. 조건은 보간 개(각 구간의 양 끝), 내부 노드 개에서 , 연속 개, 합 개. 두 개가 모자랍니다. 이 두 자유도를 정하는 것이 4절의 경계 조건입니다.
미지수를 노드의 이차 도함수 (모멘트(moment), 보의 굽힘 모멘트에서 온 이름)로 잡으면 계산이 깔끔해집니다. 은 각 구간에서 1차식이므로 와 을 잇는 직선이고, 두 번 적분해 보간 조건을 넣으면
이 식을 미분해 에서 왼쪽 구간과 오른쪽 구간의 을 같게 놓으면 내부 노드마다 방정식 하나가 나옵니다.
삼중대각계는 에 풀립니다. 소거할 원소가 행마다 하나뿐이기 때문입니다. 이 방법을 토머스 알고리즘(Thomas algorithm)이라 부르고, 12장 직접 해법에서 띠 행렬의 일반 이론으로 다시 다룹니다.
// 토머스 알고리즘: a[i] M[i−1] + b[i] M[i] + c[i] M[i+1] = d[i], i = 1..m c′[1] ← c[1] / b[1]; d′[1] ← d[1] / b[1] for i = 2 to m // 전진 소거: a[i]를 지운다 w ← b[i] − a[i] · c′[i−1] c′[i] ← c[i] / w d′[i] ← (d[i] − a[i] · d′[i−1]) / w M[m] ← d′[m] for i = m−1 downto 1 // 후진 대입 M[i] ← d′[i] − c′[i] · M[i+1]
연산 약 번. 일반 가우스 소거의 과 비교하면 점 1000개에서 수만 배 빠르다.
- , . 방정식: : . : .
- 토머스: , . , . 후진: , .
- 에서 , . 같은 방법으로 , .
- 네 점을 지나는 3차 다항식 은 , , 이다. 스플라인이 데이터의 지그재그를 더 얌전하게 따른다.
삼중대각계를 토머스 알고리즘으로 한 줄씩 풀기
경계 조건: 자연·고정·not-a-knot
미지수 개에 조건 개였습니다. 양 끝에서 하나씩 조건을 더해야 하는데, 선택에 따라 끝 근처의 곡선 모양과 정확도의 차수가 달라집니다. 라이브러리의 기본값도 제각각입니다.
- 자연(natural): . 끝에서 자가 곧게 풀려 있는 상태. 방정식 첫 행과 끝 행이 , .
- 고정(clamped, complete): , 를 지정. 첫 행 , 끝 행 .
- not-a-knot: 첫 두 구간과 마지막 두 구간이 같은 3차식이 되도록 을 과 에서 연속으로. 이 사실상 이음매(knot)가 아니게 된다. 노드가 4개면 결과는 3차 보간 다항식 자체다. MATLAB
spline과 SciPyCubicSpline의 기본값이다. - 주기(periodic): , 이 과 에서 같도록. 닫힌 곡선이나 주기 신호에 쓴다(행렬 모서리에 원소가 생기는 순환 삼중대각계).
, 에서 실제로 잰 최대 오차입니다( = 구간 수). 자연 스플라인은 의 끝 곡률 을 0으로 강제하므로 끝에서 틀립니다.
| 방법 | 비율(32→64) | 차수 | ||||
|---|---|---|---|---|---|---|
| 조각별 선형 | 5.10×10⁻² | 1.36×10⁻² | 3.50×10⁻³ | 8.88×10⁻⁴ | 3.9 | 2 |
| PCHIP | 4.19×10⁻³ | 5.75×10⁻⁴ | 7.53×10⁻⁵ | 9.64×10⁻⁶ | 7.8 | ≈ 3 |
| 자연 스플라인 | 2.25×10⁻² | 5.66×10⁻³ | 1.42×10⁻³ | 3.54×10⁻⁴ | 4.0 | 2 |
| not-a-knot | 6.31×10⁻⁴ | 4.48×10⁻⁵ | 2.99×10⁻⁶ | 1.93×10⁻⁷ | 15.5 | 4 |
| 고정 스플라인 | 7.16×10⁻⁵ | 4.59×10⁻⁶ | 2.91×10⁻⁷ | 1.83×10⁻⁸ | 15.9 | 4 |
고정 스플라인의 오차 은 한계 안에 있습니다. 모든 방법에서 최대 오차는 이상, 곧 와 가 큰 오른쪽 끝 근처에서 생깁니다. 도함수를 알면 고정 조건이 가장 정확하고, 모르면 not-a-knot이 거의 같은 차수를 줍니다. 자연 조건은 끝에서 곡선이 직선처럼 풀려야 하는 경우(실제 나무 자, 외삽이 직선이어야 하는 경우)에 씁니다.
경계 조건 비교: 끝에서 생기는 오차
다음 시뮬레이터는 같은 실험을 부터 까지 로그–로그 그래프로 모은 것입니다. 5장 오차 공식의 기울기를 직선의 기울기로 읽을 수 있습니다.
오차–간격 로그–로그 그래프: 방법별 차수
최소 굽힘 에너지: 스플라인은 가장 덜 휜다
얇은 탄성 막대의 굽힘 에너지는 곡률의 제곱을 길이에 대해 적분한 것에 비례하고, 기울기가 작으면 곡률은 과 거의 같습니다. 못(데이터 점)에 걸린 자는 이 에너지를 최소로 하는 모양을 택합니다. 수학적으로 그 모양이 3차 스플라인일까요?
증명. 라 하면 이고 . 가운데 항이 0임을 보이면 된다. 부분적분하면 . 자연 조건 으로 첫 항이 사라진다. 각 구간에서 은 상수 이므로 . 그러므로 이고, 등호는 , 곧 가 일차식이면서 노드에서 0일 때, 즉 일 때뿐이다. ∎
예제 6.3의 데이터로 확인해 봅시다. 자연 스플라인의 은 각 구간에서 와 을 잇는 직선이므로 한 구간의 적분은 입니다. 이면 . 같은 네 점을 지나는 3차 다항식은 이라 . 스플라인이 절반 이하로 덜 휩니다. 1절 시뮬레이터의 두 에너지 값이 바로 이것입니다.
매개변수 곡선, 베지에 곡선과 드 카스텔조 알고리즘
지금까지의 보간은 꼴이었습니다. 하지만 글자 윤곽, 자동차 측면 선, 카메라 경로는 되돌아오고 수직으로 서고 고리를 만듭니다. 이런 모양은 와 를 모두 매개변수 의 함수로 쓰는 매개변수 곡선 로만 그릴 수 있습니다. 또 디자이너는 곡선이 지날 점보다 모양을 당기는 손잡이를 원합니다.
여기서 바로 성질 세 가지가 나옵니다. (1) 끝점 보간: , . 가운데 제어점은 지나지 않고 당기기만 합니다. (2) 끝 접선: , 그래서 그림 프로그램의 "손잡이"가 곧 , 입니다. (3) 볼록 껍질: 가중치가 음이 아니고 합이 1이므로 곡선은 제어점의 볼록 껍질 안에 있습니다. 충돌 검사나 화면 잘라내기에서 곡선 대신 제어 다각형을 검사할 수 있습니다.
계산은 번스타인 다항식을 직접 쓰지 않고 선분의 내분을 되풀이합니다.
증명의 핵심. 귀납법. 이 의 차 베지에 곡선이라 가정하면, 파스칼 항등식 이 점화식과 정확히 같은 꼴이다. ∎
// 드 카스텔조: 제어점 P[0..n], 매개변수 t (O(n²), 덧셈과 내분만) Q ← P // 복사 for r = 1 to n for k = 0 to n − r Q[k] ← (1 − t) · Q[k] + t · Q[k+1] return Q[0]
볼록 결합만 쓰므로 반올림 오차에 강하다. 계수 를 만들 필요도 없다.
- , 1단계(중점): , , . 2단계: , . 3단계: .
- 번스타인으로 확인: .
- : 1단계 , , . 2단계 , . 3단계 .
- 끝 접선: . 곡선은 손잡이 쪽으로 출발한다.
드 카스텔조 알고리즘 단계별로 보기
한 개의 고차 베지에 곡선은 5장의 고차 다항식과 같은 약점을 가집니다. 제어점 하나가 곡선 전체를 움직이고, 복잡한 모양에는 차수가 너무 높아집니다. 그래서 실제로는 3차 베지에 조각을 이어 붙입니다(글꼴, SVG의 C 명령). 이음매의 매끄러움은 손잡이의 배치로 정해집니다.
- : 앞 조각의 과 뒤 조각의 이 같다(이어지기만 한다, 모서리 가능).
- (기하적 연속): 이음점 양쪽의 손잡이가 한 직선 위에 반대 방향으로 놓인다. 접선의 방향이 같다.
- : 게다가 길이도 같다, . 매개변수 속도까지 연속이라 애니메이션 경로에서 속도가 튀지 않는다.
과 이어도 곡률은 이음매에서 끊길 수 있습니다. 자동차 디자인에서는 반사광의 띠가 이음매에서 꺾이는 것으로 곡률 불연속이 눈에 보이므로 (곡률 연속)를 요구합니다. 아래 시뮬레이터의 곡률 빗(curvature comb)은 곡선의 법선 방향으로 곡률에 비례하는 길이의 선을 그려 이것을 보여 줍니다. CAD 프로그램에도 같은 도구가 있습니다.
베지에 경로 편집기: 이음매의 연속성
B-스플라인과 국소 제어
베지에 조각을 로 이으려면 이음매마다 손잡이 위치에 제약이 붙고, 디자이너가 점 하나를 옮길 때마다 이웃 손잡이를 다시 맞춰야 합니다. 반대로 3절의 보간 스플라인은 이지만 한 점을 옮기면 (빠르게 줄긴 해도) 전체가 움직입니다. 매끄러움이 저절로 보장되면서 제어점 하나가 근처만 움직이는 곡선이 있을까요?
답은 기저 함수 자체를 조각별 다항식으로 만들고, 그 기저가 짧은 구간에서만 0이 아니게 하는 것입니다. 매듭(knot) 열 에서 다음 점화식으로 기저를 정의합니다.
핵심 아이디어. (가)와 (나)는 에 대한 귀납법으로, 점화식의 두 가중치가 0 이상이고 이웃 항끼리 합이 1이 되는 데서 나온다. (다)는 가 상자 함수를 번 "번지게" 한(등간격이면 상자 함수의 중 합성곱) 함수라서 한 번 번질 때마다 매끄러움이 하나씩 오르는 데서 나온다. ∎
등간격 매듭()의 3차 B-스플라인 한 조각은 행렬로 간단히 쓸 수 있습니다. 에서
B-스플라인에 가중치를 붙여 유리 함수로 만든 것이 NURBS(Non-Uniform Rational B-Spline)로, 원과 원뿔 곡선을 정확히 표현할 수 있어 CAD 데이터 교환의 표준 표현이 되었습니다. 3절의 보간 스플라인도 B-스플라인 기저로 쓸 수 있습니다. 보간 조건 가 제어점에 대한 띠 행렬 계가 되고, 이것이 라이브러리들의 내부 구현 방식 중 하나입니다.
B-스플라인 국소 제어 vs 베지에 전역 제어
이 도구가 쓰이는 곳
"구간마다 낮은 차수 + 이음매 조건"은 데이터 처리와 기하 설계 모두의 기본 문법입니다.
| 분야 | 쓰는 곡선 | 왜 |
|---|---|---|
| 글꼴·벡터 그래픽 | 2차(TrueType)·3차(PostScript/CFF, SVG) 베지에 | 확대해도 매끄럽고, 드 카스텔조 분할로 빠르게 그린다 |
| CAD·자동차·항공기 외형 | NURBS(유리 B-스플라인) | 국소 제어, 원뿔 곡선의 정확한 표현, 곡률 연속 검사 |
| 애니메이션·UI | CSS cubic-bezier() 감속 곡선, 키프레임 에르미트 | 시작·끝 기울기(속도)를 직접 지정 |
| 카메라·로봇 궤적 | 3차 스플라인, 캣멀–롬(에르미트 변형) | 위치·속도·가속도가 연속이라 흔들림과 충격이 없다 |
| 측정 데이터·보정표 | PCHIP, 3차 스플라인 | 단조성 보존(PCHIP), 매끄러운 미분(스플라인) |
| 수치 해법의 부품 | 스플라인 보간·조밀 출력 | ODE 해법의 걸음 사이 값, 표로 주어진 계수 함수 |
이 장의 출발점. 조각마다 쓰는 3차식은 5장의 에르미트 보간이다. 7장 · 최소제곱 근사평활 스플라인과 회귀
잡음이 있으면 모든 점을 지나지 않고, 오차 제곱합 + 굽힘 에너지를 최소화한다. 12장 · 직접 해법토머스 알고리즘과 띠 행렬
스플라인의 삼중대각계는 띠 행렬의 가장 단순한 예다. 대각 우세와 피벗팅. 16장 · PDE 수치 해법유한 요소법
모자 함수(1차 B-스플라인)를 기저로 쓰고, 에너지 최소화에서 강성 행렬이 나온다. 11장 · ODE 수치 해법조밀 출력
적응 간격 해법은 걸음 사이의 값을 에르미트 3차식으로 채워 준다. CALCULUSBOOK적분 기법과 수치 적분
스플라인과 조각별 다항식은 구간별로 정확히 적분된다. 사다리꼴 공식은 꺾은선의 적분이다.
핵심 정리
- 고차 다항식 대신 구간마다 낮은 차수를 쓰면 차수는 고정, 간격 만 줄이므로 룽게 현상이 없다. 조각별 선형은 .
- 조각별 3차 에르미트는 값과 기울기를 이웃과 공유해 이다. PCHIP는 기울기를 조화 평균(극값에서는 0)으로 골라 오버슈트 없이 단조성을 지킨다.
- 3차 스플라인은 조각별 3차식이다. 모멘트 에 대한 방정식 은 대각 우세 삼중대각계로, 토머스 알고리즘으로 에 풀린다.
- 미지수 개에 조건 개, 모자란 둘이 경계 조건이다. 고정·not-a-knot은 , 자연 조건은 끝 곡률이 0이 아니면 .
- 자연 스플라인은 같은 점을 지나는 모든 함수 가운데 이 가장 작다(부분적분 한 번의 증명).
- 베지에 곡선은 번스타인 가중치의 볼록 결합이다. 끝점을 지나고 끝 접선이 이며, 드 카스텔조의 내분 반복으로 안정적으로 계산하고 분할한다.
- 조각 베지에의 이음매는 손잡이 배치로 , , 이 정해지며, 도 곡률 연속을 보장하지 않는다.
- B-스플라인 기저는 콕스–드 부어 점화식으로 만들고, 받침이 매듭 구간 개라 국소 제어를 주며 3차면 저절로 이다.
확인 퀴즈
Q1. 조각별 선형 보간의 간격을 에서 으로 줄이면 오차 한계는 몇 배가 되는가?
Q2. 노드 개(구간 개)의 3차 스플라인에서 보간과 연속 조건만으로는 몇 개의 조건이 모자라는가?
Q3. 등간격 인 네 점 , , , 의 자연 스플라인에서 은?
Q4. 스플라인 모멘트 방정식을 피벗팅 없이 풀어도 안정적인 이유는?
Q5. 데이터 를 보간할 때 결과가 데이터 범위 를 벗어나지 않는 방법은?
Q6. 자연 스플라인이 같은 점을 지나는 함수 가운데 최소로 만드는 양은?
Q7. 제어점 인 3차 베지에 곡선의 는?
Q8. 3차 B-스플라인 곡선에서 제어점 하나를 옮기면 곡선의 어느 부분이 바뀌는가?