logo

여러개의 점을 사용하는 유한 차분 유도 📂수치해석

여러개의 점을 사용하는 유한 차분 유도

정리

NN미분가능함수 f:RRf : \mathbb{R} \to \mathbb{R} 가 주어져 있다고 하자. 한 점 tRt \in \mathbb{R} 에서 d<Nd < Ndd계 도함수의 함숫값 f(d)(t)f^{(d)} \left( t \right) 은 충분히 작은 h>0h > 0 에 대해 기수nNn \in \mathbb{N}유한집합 SZS \subset \mathbb{Z} 과 같은 수의 점 {t+kh:kS}\left\{ t + k h : k \in S \right\} 으로 다음과 같이 근사할 수 있다. f(d)(t)kSckf(t+kh) f^{(d)} \left( t \right) \approx \sum_{k \in S} c_{k} f \left( t + kh \right) 여기서 {ck1,,ckn}\left\{ c_{k_{1}} , \cdots , c_{k_{n}} \right\} 은 다음과 같이 구해진다. [ck1ckn]=[k10kn0k1N1knN1]1d!hd[δ0,dδN1,d] \begin{bmatrix} c_{k_{1}} \\ \vdots \\ c_{k_{n}} \end{bmatrix} = \begin{bmatrix} k_{1}^{0} & \cdots & k_{n}^{0} \\ \vdots & \ddots & \vdots \\ k_{1}^{N-1} & \cdots & k_{n}^{N-1} \end{bmatrix}^{-1} {{ d! } \over { h^{d} }} \begin{bmatrix} \delta_{0,d} \\ \vdots \\ \delta_{N-1,d} \end{bmatrix} 여기서 nn 개의 점 {t+kh:kS}\left\{ t + k h : k \in S \right\}스텐실 포인츠stencil Points라 부르기도 한다.


  • X1X^{-1}역행렬이다.
  • x!x!팩토리얼이다.
  • δij={1,if i=j0,if ij\delta_{ij} = \begin{cases} 1 & , \text{if } i = j \\ 0 & , \text{if } i \ne j \end{cases}크로네커 델타다.

설명

f(t)f(t+h)f(t)h f ' (t) \approx {{ f(t+h) - f(t) } \over { h }} 이산화된 데이터만 있고 실제 함수가 없거나, 있더라도 미분하기 곤란할 때는 위와 같이 평균변화율을 참고할 수 밖에 없다. 그런데 꼭 붙어있는 두 점의 정보를 사용할 게 아니라 다음처럼 좌우 두 점을 쓸 수도 있다. f(t)f(t+h)f(th)2h f ' (t) \approx {{ f(t+h) - f(t-h) } \over { 2h }} 보편적으로 더 많은 점을 사용하면 정확도가 더 올라가며, 데이터가 안 좋을수록 이러한 계산에 기대야 하는 상황이 생길 수 있다.

증명 1

전략: 원본 문서처럼 그냥 예제 비슷하게 약식으로만 보인다. 테일러 정리를 통해 연립 방정식을 세우면 끝이다.


예를 들어 f(4)(t)f^{(4)} (t) 를 계산하기 위해 S={2,1,0,1,2}S = \left\{ -2, -1, 0, 1, 2 \right\} 과 같이 다섯 개의 점을 쓴다고 생각해보면, 우리의 목표는 다음을 잘 근사하는 {c2,,c2}\left\{ c_{-2} , \cdots , c_{2} \right\} 을 찾는 것이다. f(4)(t)c2f(t2h)+c1f(t1h)+c0f(t)+c1f(t+h)+ck2f(t+2h) f^{(4)} (t) \approx c_{-2} f (t - 2h) + c_{-1} f (t - 1h) + c_{0} f (t) + c_{1} f (t + h) + c_{k_{2}} f (t + 2h) 여기서 f(t+kh)f (t + kh) 각각은 테일러 정리에 따라 다음과 같이 전개된다. f(4)(t)=c2[f(t)+f(t)(2h)+f(t)2(2h)2+f(3)(t)6(2h)3+f(4)(t)24(2h)4]+c1[f(t)+f(t)(h)+f(t)2(h)2+f(3)(t)6(h)3+f(4)(t)24(h)4]+c0f(t)+c1[f(t)+f(t)h+f(t)2h2+f(3)(t)6h3+f(4)(t)24h4]+c2[f(t)+f(t)(2h)+f(t)2(2h)2+f(3)(t)6(2h)3+f(4)(t)24(2h)4]+O(h5)=[c2+c1+c0+c1+c2]f(t)+[2c2c1+0c0+c1+2c2]hf(t)+[4c2+c1+0c0+c1+4c2]h22f(t)+[8c2c1+0c0+c1+8c2]h36f(3)(t)+[16c2+c1+0c0+c1+16c2]h424f(4)(t)+O(h5) \begin{align*} & f^{(4)} (t) \\ =& c_{-2} \left[ f(t) + f ' (t) (-2h) + {{ f '' (t) } \over { 2 }} (-2h)^{2} + {{ f^{(3)} (t) } \over { 6 }} (-2h)^{3} + {{ f^{(4)} (t) } \over { 24 }} (-2h)^{4} \right] \\ & + c_{-1} \left[ f(t) + f ' (t) (-h) + {{ f '' (t) } \over { 2 }} (-h)^{2} + {{ f^{(3)} (t) } \over { 6 }} (-h)^{3} + {{ f^{(4)} (t) } \over { 24 }} (-h)^{4} \right] \\ & + c_{0} f (t) \\ & + c_{1} \left[ f(t) + f ' (t) h + {{ f '' (t) } \over { 2 }} h^{2} + {{ f^{(3)} (t) } \over { 6 }} h^{3} + {{ f^{(4)} (t) } \over { 24 }} h^{4} \right] \\ & + c_{2} \left[ f(t) + f ' (t) (2h) + {{ f '' (t) } \over { 2 }} (2h)^{2} + {{ f^{(3)} (t) } \over { 6 }} (2h)^{3} + {{ f^{(4)} (t) } \over { 24 }} (2h)^{4} \right] \\ & + O \left( h^{5} \right) \\ =& \left[ c_{-2} + c_{-1} + c_{0} + c_{1} + c_{2} \right] f(t) \\ & + \left[ -2 c_{-2} - c_{-1} + 0 c_{0} + c_{1} + 2 c_{2} \right] h f ' (t) \\ & + \left[ 4 c_{-2} + c_{-1} + 0 c_{0} + c_{1} + 4 c_{2} \right] {{ h^{2} } \over { 2 }} f '' (t) \\ & + \left[ -8 c_{-2} - c_{-1} + 0 c_{0} + c_{1} + 8 c_{2} \right] {{ h^{3} } \over { 6 }} f^{(3)} (t) \\ & + \left[ 16 c_{-2} + c_{-1} + 0 c_{0} + c_{1} + 16 c_{2} \right] {{ h^{4} } \over { 24 }} f^{(4)} (t) \\ & + O \left( h^{5} \right) \end{align*} 늘 하던대로 O(h5)O \left( h^{5} \right) 는 충분히 작으니 탈락시키고, f(t)f(t), f(t)f’(t), f(t)f^{''} (t), f(3)(t)f^{(3)} (t), f(4)(t)f^{(4)} (t) 가 무엇이든 위 근사식이 성립하려면 [c2+c1+c0+c1+c2]=0[2c2c1+0c0+c1+2c2]=0[4c2+c1+0c0+c1+4c2]=0[8c2c1+0c0+c1+8c2]=0[16c2+c1+0c0+c1+16c2]h4f(4)(t)=24f(4)(t) \begin{align*} \left[ c_{-2} + c_{-1} + c_{0} + c_{1} + c_{2} \right] =& 0 \\ \left[ -2 c_{-2} - c_{-1} + 0 c_{0} + c_{1} + 2 c_{2} \right] =& 0 \\ \left[ 4 c_{-2} + c_{-1} + 0 c_{0} + c_{1} + 4 c_{2} \right] =& 0 \\ \left[ -8 c_{-2} - c_{-1} + 0 c_{0} + c_{1} + 8 c_{2} \right] =& 0 \\ \left[ 16 c_{-2} + c_{-1} + 0 c_{0} + c_{1} + 16 c_{2} \right] h^{4} f^{(4)} (t) =& 24 f^{(4)} (t) \end{align*} 을 만족하면 된다. 간단히 행렬식의 모양으로 바꿔보면 [111112101241014810181610116][c2c1c0c1c2]=[(2)0(1)0(0)0(1)0(2)0(2)1(1)1(0)1(1)1(2)1(2)2(1)2(0)2(1)2(2)2(2)3(1)3(0)3(1)3(2)3(2)4(1)4(0)4(1)4(2)4][c2c1c0c1c2]=1h4[00004!] \begin{align*} & \begin{bmatrix} 1 & 1 & 1 & 1 & 1 \\ -2 & -1 & 0 & 1 & 2 \\ 4 & 1 & 0 & 1 & 4 \\ -8 & -1 & 0 & 1 & 8 \\ 16 & 1 & 0 & 1 & 16 \end{bmatrix} \begin{bmatrix} c_{-2} \\ c_{-1} \\ c_{0} \\ c_{1} \\ c_{2} \end{bmatrix} \\ =& \begin{bmatrix} (-2)^{0} & (-1)^{0} & (0)^{0} & (1)^{0} & (2)^{0} \\ (-2)^{1} & (-1)^{1} & (0)^{1} & (1)^{1} & (2)^{1} \\ (-2)^{2} & (-1)^{2} & (0)^{2} & (1)^{2} & (2)^{2} \\ (-2)^{3} & (-1)^{3} & (0)^{3} & (1)^{3} & (2)^{3} \\ (-2)^{4} & (-1)^{4} & (0)^{4} & (1)^{4} & (2)^{4} \end{bmatrix} \begin{bmatrix} c_{-2} \\ c_{-1} \\ c_{0} \\ c_{1} \\ c_{2} \end{bmatrix} = {{ 1 } \over { h^{4} }} \begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 4! \end{bmatrix} \end{align*} 마지막 줄에서 좌변은 우리가 정리에서 보았던 그대로의 형태고, 우변에서는 우리가 관심 있는 dd번째 행을 제외하곤 모조리 00 이 되어 버린 것을 확인할 수 있다. 좌변의 행렬을 우변으로 넘기면 우리가 원하던 근사식을 얻는다.

가령 {3,1,0,1}\left\{ -3, -1, 0, 1 \right\} 4개의 점을 사용하는 정확도의 2계 도함수를 근사하고 싶다면 다음의 행렬방정식 [(3)0(1)0(0)0(1)0(3)1(1)1(0)1(1)1(3)2(1)2(0)2(1)2(3)3(1)3(0)3(1)3(3)4(1)4(0)4(1)4][c3c1c0c1]=[1111310191012710181101][c3c1c0c1]=1h2[002!0] \begin{align*} & \begin{bmatrix} (-3)^{0} & (-1)^{0} & (0)^{0} & (1)^{0} \\ (-3)^{1} & (-1)^{1} & (0)^{1} & (1)^{1} \\ (-3)^{2} & (-1)^{2} & (0)^{2} & (1)^{2} \\ (-3)^{3} & (-1)^{3} & (0)^{3} & (1)^{3} \\ (-3)^{4} & (-1)^{4} & (0)^{4} & (1)^{4} \end{bmatrix} \begin{bmatrix} c_{-3} \\ c_{-1} \\ c_{0} \\ c_{1} \end{bmatrix} \\ =& \begin{bmatrix} 1 & 1 & 1 & 1 \\ -3 & -1 & 0 & 1 \\ 9 & 1 & 0 & 1 \\ -27 & -1 & 0 & 1 \\ 81 & 1 & 0 & 1 \end{bmatrix} \begin{bmatrix} c_{-3} \\ c_{-1} \\ c_{0} \\ c_{1} \end{bmatrix} = {{ 1 } \over { h^{2} }} \begin{bmatrix} 0 \\ 0 \\ 2! \\ 0 \end{bmatrix} \end{align*} 을 풀어서 다음을 얻는 식으로 사용하면 된다. 직접 계산은 많이 힘들테고 컴퓨터의 힘을 빌리도록 하자. f(t)[c3f(t3h)+c1f(th)+c0f(t)+c1f(t+h)]=1h2[0f(t3h)+f(th)2f(t)+f(t+h)] \begin{align*} f '' (t) \approx & \left[ c_{-3} f (t - 3h) + c_{-1} f (t - h) + c_{0} f(t) + c_{1} f (t + h) \right] \\ =& {{ 1 } \over { h^{2} }} \left[ 0 f (t - 3h) + f (t - h) - 2 f(t) + f (t + h) \right] \end{align*}

정확도

역시 엄밀하게 보이지는 않았으나 그 정확도는 O(hnd)O \left( h^{n - d} \right) 로, 스텐실 포인츠를 많이 사용할수록 정확하며 미분을 많이 할수록 코스트가 커진다고 한다.

테이블 2

같이보기


  1. https://web.media.mit.edu/~crtaylor/calculator.html ↩︎

  2. Fornberg. (1988). Generation of Finite Difference Formulas on Arbitrarily Spaced Grids: Ch4. ↩︎