사전 보간
알고리즘

보간

gabury1고친 사람 github-actions[bot]

보간은 값을 띄엄띄엄만 알 때 그 사이 지점의 값을 만들어 냅니다. 넣는 것은 값을 아는 점 몇 개와 구하려는 위치입니다. 나오는 것은 그 위치의 값 하나입니다. 가장 단순한 방법은 양옆 두 값을 거리에 따라 섞는 것입니다.

쉽고 빠른 이해

값을 띄엄띄엄만 알 때 그 사이 지점의 값을 앞뒤 값에서 지어냅니다. 한 시간마다 잰 기온만 있다고 합시다. 두 시 반 기온을 물으면 두 시 값과 세 시 값의 가운데를 답합니다.

값을 모든 지점마다 재 두거나 저장해 둘 수는 없습니다. 재는 데 돈과 시간이 듭니다. 다 저장하면 너무 커집니다. 삼각형 하나를 화면에 그릴 때 색을 정해야 할 칸은 많습니다. 값은 꼭짓점 셋에만 있습니다. 보간은 그 성긴 값으로 나머지 칸을 채웁니다.

돌아가는 방식은 이렇습니다.

  1. 구하려는 지점이 양옆 점 사이 어디쯤인지를 비율로 잽니다
  2. 가까운 쪽 값이 그 비율만큼 큰 몫을 갖습니다
  3. 몫을 더해 값 하나를 냅니다

대가가 있습니다. 나온 값은 잰 값이 아니라 지어낸 값입니다. 두 점 사이에서 값이 크게 출렁였다면 보간은 그 출렁임을 놓칩니다.

상세

보간은 값을 아는 점 몇 개를 받아 그 점들을 모두 지나는 함수를 하나 세웁니다. 그 함수에 구하려는 위치를 넣어 값을 냅니다.

점을 (x₀, y₀), (x₁, y₁), …, (xₙ, yₙ) 으로 적어 봅시다. 위치 x₀ 부터 xₙ 까지는 서로 달라야 합니다. 세운 함수 f 는 모든 점에서 f(xₖ) = yₖ 를 지켜야 합니다. 아는 점에서는 아는 값을 바꾸지 않고 지나간다는 뜻입니다. 보간을 다른 계산과 가르는 조건이 이것입니다.

한 시간 간격으로 적어 둔 기온 기록이 그런 입력입니다. 두 시와 세 시 기온만 적혀 있습니다. 두 시 반 기온이 필요하면 두 값 사이에서 값 하나를 지어내야 합니다. 그 일이 보간입니다.

값을 촘촘하게 다 갖고 있으면 보간이 필요 없습니다. 그런데 값은 대개 성깁니다. 재는 데 돈과 시간이 듭니다. 다 저장하면 너무 커집니다. 아예 잴 수 없는 지점도 있습니다.

성긴 값만 들고 있다가 필요한 지점의 값을 그때그때 만들어 씁니다. 나온 값은 추측이지 측정이 아닙니다. 보간 방식을 고르는 일은 어떤 규칙으로 추측할지를 고르는 일입니다.

두 점을 곧은 선으로 잇는 규칙

가장 단순한 규칙은 양옆 두 점을 곧은 선으로 잇는 것입니다. 이 규칙을 선형 보간이라고 합니다.

구하려는 지점이 시작점에서 끝점 쪽으로 얼마나 왔는지를 0 과 1 사이의 수 t 로 적습니다. 시작점이면 0, 끝점이면 1, 한가운데면 0.5 입니다. 이 t 를 비율이라고 부르겠습니다.

block-beta
columns 5
  a["시작점 · 0"] b["0.25"] c["한가운데 · 0.5"] d["0.75"] e["끝점 · 1"]

비율은 값이 아니라 구간 위의 위치를 가리킵니다. 시작값을 f₀, 끝값을 f₁ 로 두면 그 위치의 값은 (1 − t)·f₀ + t·f₁ 입니다. 시작값에 1 − t 만큼, 끝값에 t 만큼 몫을 주어 더하는 식입니다.

아래는 시작값 10, 끝값 20 에 비율 넷을 넣은 것입니다.

값 = (1 - t) × 시작값 + t × 끝값

t = 0      // 10
t = 0.25   // 0.75 × 10 + 0.25 × 20 = 12.5
t = 0.5    // 15
t = 1      // 20

t 가 0.25 면 끝값의 몫이 0.25, 시작값의 몫이 0.75 입니다. 시작값 10 쪽으로 치우친 12.5 가 나옵니다. 구간을 찾은 뒤의 계산은 뺄셈 한 번, 곱셈 두 번, 덧셈 한 번입니다.

삼각형 안쪽을 세 몫으로 섞는 규칙

점이 선 위가 아니라 평면에 흩어져 있으면 두 점이 아니라 세 점을 섞습니다. 값을 아는 꼭짓점 셋으로 삼각형을 만들고 그 안쪽 점의 값을 구합니다.

섞는 몫은 넓이로 잽니다. 꼭짓점 A 의 몫은 구하려는 점과 나머지 두 꼭짓점이 만드는 작은 삼각형의 넓이를 전체 삼각형의 넓이로 나눈 값입니다. 점이 A 에 다가갈수록 이 작은 삼각형이 커집니다. 그래서 가까운 꼭짓점일수록 몫이 커집니다.

이렇게 잰 세 몫을 무게중심 좌표라고 부릅니다. 세 몫은 각각 0 과 1 사이입니다. 셋을 더하면 1 입니다.

flowchart TD
    A["꼭짓점 A · 빨강"] --- B["꼭짓점 B · 초록"]
    B --- C["꼭짓점 C · 파랑"]
    C --- A
    A -. "멀다 → 몫 0.2" .- P["안쪽 점 하나"]
    B -. "조금 멀다 → 몫 0.3" .- P
    C -. "가깝다 → 몫 0.5" .- P

세 몫을 a, b, c 로, 꼭짓점 값을 fa, fb, fc 로 두면 안쪽 점의 값은 a·fa + b·fb + c·fc 입니다. 앞의 선형 보간을 두 점에서 세 점으로 늘린 것입니다. 위 그림이면 0.2·빨강 + 0.3·초록 + 0.5·파랑이 그 점의 색입니다.

안쪽과 바깥쪽을 가르는 선

보간은 값을 아는 점들의 안쪽에서 씁니다. 그 범위 바깥의 값을 같은 함수로 짚어 내는 것은 외삽이라고 따로 부릅니다.

block-beta
columns 3
  a["바깥쪽 · 외삽"] b["아는 점부터 아는 점까지 · 보간"] c["바깥쪽 · 외삽"]

안쪽은 양옆의 아는 값이 붙잡아 줍니다. 바깥은 붙잡아 주는 값이 한쪽에만 있습니다. 그래서 멀어질수록 빗나가기 쉽습니다.

점을 꼭 지나지 않는 계산도 있습니다. 곡선 맞춤은 점들 가까이를 지나는 선을 하나 긋습니다. 아는 점에서 값이 조금 어긋나도 받아들입니다. 보간은 f(xₖ) = yₖ 를 반드시 지키므로 측정값에 섞인 잡음까지 함께 지나갑니다.

같은 이름의 다른 뜻

숫자 사이를 메우는 뜻으로는 수치해석 · 컴퓨터 그래픽스 · 이미지 처리 · 애니메이션이 같은 이름을 씁니다. 이 항목은 그 계산을 다룹니다.

프로그래밍 언어의 문자열 보간은 글자 틀 안의 빈칸에 변수 값을 끼워 넣는 기능입니다. 사이 값을 계산하지 않습니다. 이름만 같습니다.

복잡도

보간의 비용은 두 번에 나눠 냅니다. 점들을 보고 함수를 세우는 준비 비용은 한 번 듭니다. 세운 함수로 값 하나를 구하는 비용은 값마다 듭니다. 같은 점들로 값을 여러 번 구하면 준비는 한 번만 합니다. 그때 총비용을 정하는 것은 값 하나의 비용입니다.

아래 n 은 값을 아는 점의 수입니다. 입력값이 어떻게 생겼든 연산 횟수가 같으므로 최악과 평균이 갈리지 않습니다. 갈리는 것은 방식입니다.

다항식 보간은 점 n 개를 모두 지나는 다항식 하나를 세우는 방식입니다. 차수는 다항식에서 x 의 가장 높은 거듭제곱입니다. 삼차 스플라인 보간은 구간마다 삼차식을 하나씩 두고 이음매에서 곡선이 꺾이지 않게 맞추는 방식입니다. 둘의 차이는 아래 「갈래」가 받습니다.

다항식 보간은 같은 다항식을 적는 방식이 셋입니다. 비용도 거기서 갈립니다. 라그랑주 형식은 점마다 그 점에서만 1 인 다항식을 만들어 값과 곱해 더합니다. 무게중심 형식은 그것을 점의 위치로 정한 가중치 n 개로 다시 적은 것입니다. 뉴턴 형식은 점을 하나씩 더해 가며 항을 늘립니다. 미리 만들어 둔 분할 차분표를 씁니다.

분할 차분은 두 점의 값 차이를 두 점의 위치 차이로 나눈 값입니다. 점을 늘려 가며 이것을 겹쳐 적어 둔 표가 분할 차분표입니다. 아래 표와 설명은 이 세 이름을 그대로 씁니다.

방식 준비 값 하나 공간 왜 그 값인가
선형 보간 없음 O(log n) · 등간격이면 O(1) 아는 점 전부 위치 순으로 정렬된 점에서 구간을 이진 탐색으로 찾습니다. 등간격이면 위치를 간격으로 나눠 바로 찾습니다. 찾은 뒤 섞기는 O(1) 입니다
다항식 보간 · 무게중심 형식 O(n²) O(n) 가중치 n 개 위치에만 달린 가중치를 한 번 구해 두면 값마다 n 개 항을 더합니다
다항식 보간 · 라그랑주 형식 없음 O(n²) 아는 점 전부 값마다 n 개 항을 각각 n 번 곱해 만듭니다
삼차 스플라인 보간 O(n) O(log n) 구간마다 계수 넷 이음매 조건이 만드는 연립방정식에서 대각선과 그 양옆 한 줄만 0 이 아닙니다. 이 삼중대각 꼴은 앞에서 뒤로 한 번 훑고 되돌아오면 풀립니다. 값은 구간을 찾은 뒤 삼차식 하나입니다
쌍선형 보간 (2차원 격자) 없음 이웃 표본 4개 격자 전부 가로로 한 번, 세로로 한 번 선형 보간합니다
쌍삼차 보간 (2차원 격자) 없음 이웃 표본 16개 격자 전부 1차원에서 이웃 넷을 보는 계산을 가로세로로 겹칩니다. 4 × 4 = 16 입니다

다항식 보간의 비용에서 세는 단위는 곱셈이나 나눗셈 하나와 덧셈이나 뺄셈 하나를 묶은 연산 한 번입니다. 라그랑주 형식을 값마다 처음부터 계산하면 값 하나에 O(n²) 번이 든다는 것이 흔히 드는 약점입니다.

무게중심 형식은 이 약점을 피합니다. 점의 위치에만 달린 가중치 n 개를 O(n²) 번에 구해 둡니다. 그 뒤로는 값 하나에 O(n) 번이면 됩니다. 이름은 같지만 이 가중치는 앞에서 본 삼각형의 몫과 다릅니다. 넓이 비가 아니라 점의 위치들로 정하는 수 n 개입니다.

이 가중치는 아는 값과 무관합니다. 같은 위치들에 값만 다른 함수를 여럿 보간해도 가중치를 다시 구하지 않습니다. 함수마다 값 하나에 O(n) 번입니다.

뉴턴 형식도 값 하나에는 O(n) 번이 듭니다. 다만 분할 차분표가 아는 값에 달려 있습니다. 함수가 바뀔 때마다 이 표를 O(n²) 번에 다시 만듭니다.

등간격 점처럼 가중치를 식으로 바로 적을 수 있는 배치에서는 준비 비용도 크지 않습니다. 그때는 값 하나에 O(n) 번만 듭니다.

예시

보간은 그래픽스 명세와 수치·이미지 라이브러리 안에 박혀 있습니다. 아래 넷은 각각 삼각형을 칠하는 그리기 단계 · 셰이더 언어의 선언 · 배열 계산 함수 · 이미지 크기 조절 함수입니다.

OpenGL 의 삼각형 데이터 보간

OpenGL(Open Graphics Library)은 삼각형을 화면의 칸으로 쪼개는 래스터화 단계에서 칸마다 값을 섞습니다. 화면의 칸 하나에 해당하는 조각을 프래그먼트라고 합니다.

셰이더는 그리기 단계마다 도는 작은 프로그램입니다. 꼭짓점마다 도는 정점 셰이더가 색이나 좌표 같은 값을 내보냅니다. 래스터화가 삼각형을 칸으로 쪼갭니다. 쪼갠 칸마다 그 값을 섞습니다. 칸마다 도는 프래그먼트 셰이더는 섞인 값을 받습니다.

섞는 식은 이렇습니다. a, b, c 는 그 칸의 무게중심 좌표입니다. fa, fb, fc 는 꼭짓점 값입니다. wa, wb, wc 는 각 꼭짓점의 클립 좌표 w 값입니다. 클립 좌표는 꼭짓점을 화면에 투영하기 직전의 네 성분 좌표입니다. w 는 그 넷째 성분입니다.

f = (a·fa/wa + b·fb/wb + c·fc/wc) / (a/wa + b/wb + c/wc)
z = a·za + b·zb + c·zc

여기서 a, b, c 는 화면 좌표에서 잰 넓이 비입니다. 화면에서 고르게 섞으면 비스듬히 누운 삼각형에서 값이 틀어집니다. 원근 투영은 멀리 있는 것을 작게 그리는 투영입니다. 공간에서 고르게 놓인 칸은 화면에서 가까운 쪽이 넓고 먼 쪽이 좁게 그려집니다.

block-beta
columns 4
  s1["공간 · 고른 칸"] s2["고른 칸"] s3["고른 칸"] s4["고른 칸"]
  w1["화면 · 가까워서 넓다"]:2 w2["조금 좁다"]:1 w3["멀어서 좁다"]:1

첫 식은 이 틀어짐을 바로잡습니다. 무게중심 몫을 꼭짓점마다 w 로 나눠 다시 맞춘 것입니다. 원근 투영에서 w 는 카메라에서 멀수록 커집니다. 먼 꼭짓점의 몫이 화면 위 넓이보다 작게 잡힙니다. 이 식을 원근 보정 보간이라고 합니다.

깊이 값 z 만은 둘째 식처럼 w 로 나누지 않고 무게중심 몫으로 곧장 섞습니다. 깊이 값은 그 칸이 카메라에서 얼마나 먼지를 적은 값입니다. 값은 칸의 한가운데에서 잽니다.

GLSL 의 보간 한정자

GLSL(OpenGL Shading Language)은 셰이더 변수마다 섞는 방식을 고르게 합니다. 변수 선언 앞에 붙이는 낱말을 보간 한정자라고 합니다.

한정자 하는 일
smooth 원근 보정 보간. 한정자를 안 적으면 이것입니다
noperspective 화면 공간에서 선형 보간. 위의 깊이 식과 같은 꼴입니다
flat 보간하지 않습니다. 한 도형의 모든 칸이 대표 꼭짓점 하나의 값을 받습니다

한정자는 하나만 붙일 수 있습니다. 둘 이상 붙이면 컴파일 오류입니다. 정수형이나 배정밀도 실수형인 프래그먼트 셰이더 입력에는 flat 을 반드시 붙여야 합니다.

NumPy 의 numpy.interp

NumPy 의 numpy.interp 는 1차원 조각별 선형 보간을 합니다. 조각별이라는 말은 점과 점 사이 구간마다 따로 곧은 선을 긋는다는 뜻입니다.

Python
numpy.interp(x, xp, fp, left=None, right=None, period=None)

xp 는 값을 아는 점의 위치입니다. fp 는 그 값입니다. x 는 구하려는 위치입니다. period 를 주지 않으면 xp 는 커지는 순서여야 합니다.

Python
>>> xp = [1, 2, 3]
>>> fp = [3, 2, 0]
>>> np.interp(2.5, xp, fp)
1.0
>>> np.interp([0, 1, 1.5, 2.72, 3.14], xp, fp)
array([3.  , 3.  , 2.5 , 0.56, 0.  ])
>>> np.interp(3.14, xp, fp, right=-99.0)
-99.0

2.5 는 2 와 3 의 한가운데라 값 2 와 0 의 가운데인 1.0 이 나옵니다. 2.72 는 같은 구간에서 비율 t 가 0.72 인 위치입니다. 값 2 에 1 − 0.72 만큼, 값 0 에 0.72 만큼 몫을 주면 0.56 입니다.

0 과 3.14 는 아는 범위 바깥입니다. 이 함수는 외삽하지 않고 끝값을 냅니다. 왼쪽 바깥은 fp[0] 인 3, 오른쪽 바깥은 fp[-1] 인 0 입니다. left · right 로 이 값을 바꿀 수 있습니다. 마지막 줄은 오른쪽 바깥을 -99.0 으로 바꾼 것입니다.

period 는 각도처럼 한 바퀴 돌아오는 위치를 다루는 매개변수입니다. 이것을 주면 left 와 right 는 무시됩니다.

OpenCV 의 cv::resize

OpenCV(Open Source Computer Vision Library)의 cv::resize 는 이미지를 키우거나 줄입니다. 새 이미지의 칸은 원래 칸 사이에 떨어지므로 칸마다 보간으로 값을 만듭니다. 방식은 마지막 인자로 고릅니다. 기본값은 INTER_LINEAR 입니다.

C++
void cv::resize(InputArray src, OutputArray dst, Size dsize,
                double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)
플래그 방식
INTER_NEAREST 최근접 이웃 보간
INTER_LINEAR 쌍선형 보간
INTER_CUBIC 쌍삼차 보간
INTER_AREA 칸 넓이의 비율로 다시 표본을 뽑습니다
INTER_LANCZOS4 8×8 이웃을 보는 랑초시 보간

OpenCV 는 줄일 때 대개 INTER_AREA 를 권합니다. 이 방식은 무아레 무늬가 없는 결과를 줍니다. 무아레 무늬는 촘촘한 무늬를 성기게 다시 표본으로 뽑을 때 생기는 물결무늬입니다. 키울 때는 대개 INTER_CUBIC 을 권합니다. 계산이 덜 드는 대안으로 INTER_LINEAR 도 듭니다. INTER_AREA 로 키우면 결과가 INTER_NEAREST 와 비슷해집니다.

갈래

갈래는 두 가지로 갈립니다. 이웃 점을 몇 개 보느냐와 그 점들을 어떤 선으로 잇느냐입니다. 보는 점이 늘수록 계산이 늘어납니다. 대신 이음매에서 꺾이지 않는 곡선을 얻습니다.

방식 보는 점 잇는 선
최근접 이웃 보간 가장 가까운 1개 잇지 않습니다. 계단처럼 끊깁니다
선형 보간 양옆 2개 곧은 선
쌍선형 보간 격자 4개 가로세로로 곧은 선 두 번
삼차 합성곱 보간 1차원 4개 · 2차원 16개 삼차 곡선
스플라인 보간 구간 양 끝. 이음매 조건이 전체를 묶습니다 구간마다 다항식 조각
다항식 보간 전부 다항식 하나
구면 선형 보간 회전 2개 구 위의 큰 원을 따라가는 호

최근접 이웃 보간

구하려는 위치에서 가장 가까운 점의 값을 손대지 않고 가져옵니다. 값을 섞지 않으므로 아는 값에 없던 새 값이 생기지 않습니다. 대신 점과 점 사이에서 값이 계단처럼 뚝 바뀝니다.

선형 보간

양옆 두 점을 곧은 선으로 잇습니다. 비율 t 로 (1 − t)·f₀ + t·f₁ 을 계산합니다. 「상세」에서 본 규칙이 이것입니다. 점에서 점으로 넘어갈 때 기울기가 갑자기 바뀌므로 이음매에서 선이 꺾입니다.

쌍선형 보간

2차원 격자에서 구하려는 위치를 둘러싼 네 점을 봅니다. 가로 방향으로 두 번 선형 보간해 값 둘을 얻습니다. 그 둘을 세로 방향으로 한 번 더 선형 보간합니다. 이미지를 키우거나 줄일 때 흔히 쓰는 방식입니다. OpenCV cv::resize 의 기본값인 INTER_LINEAR 가 이것입니다.

삼차 합성곱 보간

Keys 가 1981 년 디지털 이미지 처리용으로 낸 방식입니다. 커널은 표본마다 줄 무게를 거리로 정하는 함수입니다. 이 방식의 커널은 구간마다 삼차식입니다. 커널 값은 (−2, 2) 구간 밖에서 0 입니다. 그래서 구하려는 위치 앞뒤의 표본 넷만 섞습니다.

커널의 매개변수 하나는 보간 결과가 원래 함수의 테일러 전개 처음 세 항과 맞도록 고릅니다. 테일러 전개는 함수를 한 점 둘레에서 거듭제곱 항들의 합으로 펼친 것입니다. 표본 간격을 줄일 때 오차가 줄어드는 빠르기는 선형 보간과 삼차 스플라인 사이에 놓입니다. 경계 조건과 커널에 알맞은 조건을 둔 경우입니다.

2차원에서는 가로와 세로에 1차원 계산을 한 번씩 하는 분리형 확장을 씁니다. 4 × 4 이웃 16점을 봅니다.

스플라인 보간

구간마다 차수가 낮은 다항식 조각을 두고 이음매에서 조각들을 매끄럽게 잇습니다. 매끄럽다는 것은 이음매 양쪽에서 기울기와 기울기가 바뀌는 빠르기가 같다는 뜻입니다. 앞의 것을 1차 도함수, 뒤의 것을 2차 도함수라고 합니다.

일반 꼴은 차수가 k − 1 인 조각을 k − 2 차 도함수까지 이어지게 붙이는 것입니다. k = 4 면 삼차 조각을 1차·2차 도함수까지 이어지게 붙인 삼차 스플라인이 됩니다.

이름은 제도용 자에서 왔습니다. 스플라인은 나무 같은 탄성 재료로 만든 가늘고 휘는 막대입니다. 모눈종이 위 몇 점에 추를 올려 고정하면 매끄러운 곡선이 됩니다. 그 곡선이 삼차 조각을 이어 붙인 모양이라는 데서 Schoenberg 가 1946 년에 이 이름을 붙였습니다.

다항식 보간

위치가 서로 다른 점 n 개를 모두 지나는 차수 n − 1 이하의 다항식은 하나뿐입니다. 이 다항식을 세우는 것이 다항식 보간입니다. 「복잡도」에서 본 라그랑주 형식 · 무게중심 형식 · 뉴턴 형식은 모두 같은 다항식을 다르게 적은 것입니다.

세 형식 중 뉴턴 형식만 점을 더하기 쉽습니다. 점이 하나 늘면 항 하나와 그 분할 차분만 더 계산하면 됩니다. 라그랑주 형식은 점이 하나 늘 때 처음부터 다시 계산합니다.

구면 선형 보간

회전을 섞을 때 씁니다. 회전을 네 개의 수로 적는 것을 쿼터니언이라고 합니다. 쿼터니언 가운데 4차원 단위 구 위에 있는 것이 애니메이션에 쓰기 알맞습니다. Shoemake 가 1985 년에 애니메이션용으로 정리했습니다.

두 쿼터니언을 곧은 선으로 섞고 그 선 위에 고른 간격으로 점을 찍으면 가운데에서 회전이 빨라집니다. 구면 선형 보간은 두 점 사이를 구 위의 큰 원을 따라 잇습니다. 큰 원은 구를 그 가운데를 지나는 평면으로 자른 테두리입니다. 구 위의 두 점을 잇는 가장 짧은 경로가 이 원의 호입니다. 호를 따라가면 일정한 빠르기로 돕니다.

식은 sin((1 − u)θ)/sin θ · q₁ + sin(uθ)/sin θ · q₂ 입니다. u 는 0 에서 1 로 가는 비율입니다. θ 는 q₁ · q₂ = cos θ 를 만족하는 각도입니다.

실패

보간이 내는 값은 지어낸 값입니다. 그래서 깨지는 조건이 구체적으로 있습니다. 아래는 모두 오류가 나지 않고 틀린 값만 조용히 나온다는 점이 같습니다.

조건 나오는 값
등간격 점에 차수 높은 다항식을 건다 구간 끝에서 크게 출렁이는 값
삼차 곡선으로 잇는다 아는 값 범위를 넘는 값. 오르기만 하던 데이터가 잠깐 내려가는 값
비스듬한 삼각형을 화면 위 거리로만 섞는다 원근이 틀어진 값
이름 대신 쓰는 숫자를 섞는다 없는 번호
각도를 숫자로만 섞는다 엉뚱한 방향
점 사이에서 값이 크게 튀었다 튄 것이 사라진 밋밋한 값
numpy.interp 에 커지는 순서가 아닌 xp 를 넣는다 의미 없는 값. 함수는 순서를 검사하지 않습니다

룽게 현상

등간격 점 n 개에 다항식 하나를 걸면 차수가 n 가까이 올라갑니다. n 이 크면 무게중심 형식의 가중치들 사이의 크기 차이가 대략 2ⁿ 배까지 벌어집니다. 그 결과 구간 가운데의 작은 데이터 값이 구간 끝 근처에서 2ⁿ 배쯤 큰 출렁임으로 번집니다. 이것을 룽게 현상이라고 부릅니다.

계산법의 문제가 아니라 등간격 점의 다항식 보간 자체가 가진 성질입니다. 데이터가 조금만 바뀌어도 보간 결과가 크게 바뀔 수 있습니다. n 이 꽤 작지 않다면 다항식 보간을 쓸 때 등간격 점을 버려야 합니다. 대신 간격이 고르지 않은 배치를 씁니다. 체비쇼프 점이 그런 배치입니다.

삼차 곡선의 범위 넘침

삼차 곡선으로 이으면 곡선이 아는 값의 범위를 넘어 출렁일 수 있습니다. 계속 오르기만 하는 데이터에서도 곡선이 점 사이에서 잠깐 내려갔다 올라올 수 있습니다. 한 방향으로만 가는 성질을 단조라고 합니다. 삼차식이 한 구간에서 단조이려면 따로 조건이 필요합니다. Fritsch 와 Carlson 은 1980 년에 그 필요충분조건을 세우고 단조 데이터에 단조인 조각별 삼차 보간을 만드는 방법을 냈습니다.

비스듬한 삼각형의 원근 틀어짐

삼각형이 화면에 비스듬히 누워 있으면 화면 위 거리로만 섞은 값이 틀어집니다. 가까운 쪽과 먼 쪽을 화면에서 같은 간격으로 섞기 때문입니다. 앞 예시의 OpenGL 식이 몫을 w 로 나누는 것이 이 틀어짐을 바로잡는 계산입니다. GLSL 에서 noperspective 를 붙이면 이 보정을 빼고 화면 공간에서 선형으로 섞습니다.

이름 대신 쓰는 숫자

값이 숫자 모양이어도 섞으면 안 되는 것이 있습니다. 도로 번호나 상태 코드처럼 이름 대신 쓰는 숫자입니다. 1번과 2번 도로의 가운데인 1.5번 도로는 없습니다. 이런 값에는 섞지 않고 가장 가까운 쪽 값을 가져오는 최근접 이웃 보간이 맞습니다. GLSL 의 flat 도 섞지 않고 꼭짓점 하나의 값을 줍니다.

각도의 감김

359도와 1도의 가운데를 숫자로만 계산하면 180도가 나옵니다. 두 방향은 0도를 사이에 두고 2도 떨어져 있습니다. 가운데는 0도입니다. 각도는 한 바퀴 돌면 처음으로 돌아오기 때문입니다.

flowchart TD
    subgraph s1["숫자 줄로 보면 · 가운데가 180도"]
        A1["1도"] --- A2["180도"] --- A3["359도"]
    end
    subgraph s2["한 바퀴로 보면 · 가운데가 0도"]
        B1["359도"] --- B2["0도"] --- B3["1도"]
    end

비슷한 문제가 회전에서도 생깁니다. 회전을 세 축의 각도 셋으로 적는 것을 오일러 각이라고 합니다. 오일러 각 셋을 따로따로 보간하면 사이 자세가 세 축으로 한꺼번에 비틀립니다. 회전 자유도 하나를 잃는 짐벌 락을 만날 수도 있습니다. 구면 선형 보간은 이 문제를 피하려고 나왔습니다.

점 사이에서 튄 값

성긴 점 사이에서 값이 크게 출렁이면 보간은 그 출렁임을 못 봅니다. 한 시간마다 잰 기온으로는 그 사이에 지나간 소나기를 알 수 없습니다. 보간은 양옆 값만 보고 밋밋한 선을 긋기 때문입니다. 점 사이에서 값이 얼마나 튈 수 있는지 모르면 보간 결과가 얼마나 빗나갔는지도 알 수 없습니다.

관련 항목

보간의 하위 종류

선형 보간 · 쌍선형 보간 · 삼차 보간 · 삼차 합성곱 보간 · 쌍삼차 보간 · 스플라인 보간 · 최근접 이웃 보간 · 다항식 보간 · 라그랑주 보간 · 뉴턴 보간 · 에르미트 보간 · 단조 삼차 보간 · 구면 선형 보간 · 무게중심 보간 · 랑초시 보간

보간을 계산하는 수학 도구

무게중심 좌표 · 분할 차분 · 다항식 · 삼중대각 행렬 · 테일러 급수 · 이진 탐색 · 오일러 각

삼각형 안을 채울 때 함께 쓰는 좌표와 보정

원근 보정 보간 · 클립 좌표 · 보간 한정자 · 배리잉 · 래스터화 · 프래그먼트 · 정점 속성

보간된 값이 지나가는 그리기 단계

그래픽스 파이프라인 · 정점 셰이더 · 프래그먼트 셰이더 · 정점 · 정점 색 · 텍스처 좌표 · 깊이 버퍼

보간 방식을 골라야 하는 이미지와 텍스처 처리

텍스처 필터링 · 밉맵 · 이방성 필터링 · 샘플러 · 텍셀 · 텍스처 · 이미지 리샘플링 · 무아레

보간을 담은 그래픽스 명세와 라이브러리

OpenGL · GLSL · NumPy · OpenCV

보간이 빗나가는 현상

룽게 현상 · 짐벌 락 · 오버슈트 · 에일리어싱

보간과 맞세워지는 다른 계산

외삽 · 곡선 맞춤 · 회귀 · 근사 · 샘플링 · 결측값

시간 축에서 사이 값을 만드는 기법

키프레임 · 이징 · 베지에 곡선 · 애니메이션 커브 · 쿼터니언

이름이 겹치는 다른 뜻의 보간

문자열 보간 · 템플릿 리터럴 · 보간 탐색

다른 이름: interpolation · Interpolation · 인터폴레이션 · 사이값 계산 · 보간법