728x90
Cubic Spline Interpolation

Cubic Spline Interpolation

Piecewise Polynomial

  • 임의의 함수 y=f(x)의 근사
  • 일정 간격으로 1차(직선)으로 근사 (linear interpolation) 시의 문제점
    • 각 근사 구간의 교점마다 그래프가 각진 형태로 나타남
    • 근사식의 오차가 크게 나타남
  • 2차 식으로 근사 시
    • 그래프의 오차는 다소 줄어듦
    • 구간 접점의 문제는 해결 x
  • n차 미분이 가능할수록 구간별 연결이 부드럽지만, 과할 경우 진동 문제 존재

Cubic Spline Condition

  • 3차 다항식 aj+bj(xxj)+cj(xxj)2+dj(xxj)3a_j+b_j(x-x_j)+c_j(x-x_j)^2+d_j(x-x_j)^3를 구간별로 분할한 함수 S, S1, ..., Sj,Sj+1, Sn2, Sn1S,\ S_1,\ ...,\ S_j, S_{j+1},\ S_{n-2},\ S_{n-1}
  • 각 구간별 함수의 접점이 연속(Piecewise)할 것을 요구
  • 연결점에서 연속되기 위한 조건 (for all j=0, 1, .. ,n-1)
    • Sj(xj+1)=f(xj)S_j(x_{j+1})=f(x_j)
    • Sj+1(xj+1)=f(xj+1)S_{j+1}(x_{j+1})=f(x_{j+1})
    • 1차 미분 : Sj=Sj+1S'_j=S'_{j+1}
    • 2차 미분 : Sj=Sj+1S''_j=S''_{j+1}
  • 전체 함수의 개수가 갖는 계수는 총 4n개이므로
    • 2n개의 함수 연속 조건
    • n-1개의 1, 2차 미분 연속 조건
    • 총 4n-2개의 연속 조건을 갖게 됨 (2개가 더 있어야 계수의 계산이 가능)
    • 이를 위해 2개 조건을 더 추가 (Boudary Condition)
  • Natural Boundary Condition : S(x0)=S(xn)=0S''(x_0)=S''(x_n)=0 (기울기는 있으나 휨은 없음)
    • free boudary condition이 있는 곡선을 natural spline이라고 함
  • ex. (1, 2), (2, 3), (3, 5)를 지나는 natural cubic spline을 구할 것
    • [1, 2]의 구간에서 S0(x)=a0+b0(x1)+c0(x1)2+d0(x1)3S_0(x)=a_0+b_0(x-1)+c_0(x-1)^2+d_0(x-1)^3
    • [2, 3]의 구간에서 S1(x)=a1+b1(x2)+c1(x2)2+d1(x2)3S_1(x)=a_1+b_1(x-2)+c_1(x-2)^2+d_1(x-2)^3
    • f(1)=2=a0, f(2)=3=a0+b0+c0+d0f(1) = 2 = a_0,\ f(2)=3=a_0+b_0+c_0+d_0
    • f(2)=3=a1, f(3)=5=a1+b1+c1+d1f(2) = 3 = a_1,\ f(3)=5=a_1+b_1+c_1+d_1
    • S0(2)=S1(2)b0+2c0+3d0=b1S'_0(2)=S'_1(2)\rarr b_0+2c_0+3d_0=b_1
    • S0(2)=S1(2)2c0+6d0=2c1S''_0(2)=S''_1(2)\rarr 2c_0+6d_0=2c_1
    • natural boundary condition
      • S0(1)=02c0=0S_0''(1)=0\rarr 2c_0=0
      • S1(3)=02c1+6d1=0S_1''(3)=0\rarr 2c_1+6d_1=0

  • Cubic Spline의 계수 찾기

  • (xxj)=hj(x-x_j) = h_j로 정의

    • aj+1=aj+bjhj+cjhj2+djhj3a_{j+1}=a_j+b_jh_j+c_jh_j^2+d_jh_j^3
    • bj+1=bjhj+2cjhj+3djhj2b_{j+1}=b_jh_j+2c_jh_j+3d_jh_j^2
    • cj+1=cj+3djhjc_{j+1}=c_j+3d_jh_j
  • cj,cj+1c_j, c_{j+1}을 안다고 할 때

    • aj+1=aj+bjhj+hj23(2cj+cj+1)a_{j+1}=a_j+b_jh_j+\frac{h_j^2}{3}(2c_j+c_{j+1})
    • bj+1=bj+hj(cj+cj+1)b_{j+1}=b_j+h_j(c_j+c_{j+1})
    • b에 대해 정리하면 bj=1hj(aj+1aj)hj3(2cj+cj+1)b_j=\frac{1}{h_j}(a_{j+1}-a_j)-\frac{h_j}{3}(2c_j+c_{j+1})
      • bj1b_{j-1}에 대해 bj1=1hj1(ajaj1)hj13(2cj1+cj)b_{j-1}=\frac{1}{h_{j-1}}(a_{j}-a_{j-1})-\frac{h_{j-1}}{3}(2c_{j-1}+c_j)
      • 식을 정리하면 bj=bj1+hj1(cj1+cj)b_j=b_{j-1}+h_{j-1}(c_{j-1}+c_j)
  • bjbj1b_j-b_{j-1}을 대입하여 정리하면
    hj1cj1+2(hj1+hj)cj+hjcj+1=3hj(aj+1aj)3hj1(ajaj1)\rarr h_{j-1}c_{j-1}+2(h_{j-1}+h_j)c_j+h_jc_{j+1}=\frac{3}{h_j}(a_{j+1}-a_j)-\frac{3}{h_{j-1}}(a_j-a_{j-1})

    • a, h값을 알면 c를 계산 가능
    • a, c를 이용하여 b 계산 : bj=1hj(aj+1aj)hj3(2cj+cj+1)b_j=\frac{1}{h_j}(a_{j+1}-a_j)-\frac{h_j}{3}(2c_j+c_{j+1})
    • c, h를 이용하여 d 계산 : cj+1=cj+3djhjc_{j+1}=c_j+3d_jh_j
728x90

+ Recent posts