하나의 변수 $x$를 가진 방정식의 해를 구하고 싶습니다. ($f(x) = 0$) 방정식의 해를 구하는 방법은 여러 가지가 있습니다만 이번 포스트에서 알아볼 방법은 고정점 반복법이라는 알고리즘입니다. 고정점 반복법의 시작은 $f(x) = 0$을 $g(x)=x$의 형태로 두고 $y=x$와 $y=g(x)$의 연립방정식을 반복을 통해 푸는 방법으로 특정 조건 하에서 사용할 수 있습니다.
그렇다면 $f(x) = 0$으로부터 $g(x) = x$ 형태로 둔다는 것은 무엇일까요? 예를 들어 $f(x)=x-cos(x)$일 경우, $g(x)$는 $x=g(x)=cos(x)$로 둠으로써 $y=x$와 $y=cos(x)$의 교차점을 찾으면 $f(x)=x-cos(x)=0$의 해를 구할 수 있겠죠. 만약 $f(x)=x^3+cos(x)$일 경우에는 양변에 $x$를 더해 $x+f(x)=x+x^3+cos(x)=g(x)$의 형태로 만들 수 있겠죠. 이 경우에는 $y=x$와 $y=x+x^3+cos(x)$의 교차점이 해가 되겠죠. 이러한 방법이 가능한 이유는 $f(x)=0$에서 $x=x+f(x)$이고 $x+f(x)=g(x)$라 할 때, $f(x)=0$의 해가 $r$이라면 $r=g(r)$이 성립하기 때문입니다. 따라서 $y=x$와 $y=g(x)$의 교차점이 $r$이 되고 이를 고정점 (fixed point) 라고 합니다.
고정점 반복법의 시작은 임의의 점 $x_0$에서 시작해서 $x_1=g(x_0)$, $x_2=g(x_1)$ 식으로 $r$에 접근하는 방석으로 이루어집니다. 이 과정을 반복하게 되면 다음과 같습니다. ($s_n\in (x_n, r)$로 두 번쨰 수식은 평균값 정리로 유도됩니다.)
$e_{i+1}=|x_{i+1}-r|=|g(x_i)-g(r)|$
$=|g'(s_n)(x_n-r)|=|g'(s_n)(x_n-r)|=|g'(s_n)|e_{i}$
위의 수식을 보면 $i+1$ 번째에서의 고정점과의 거리 $e_{i+1}$는 $i$ 번째에서의 고정점과의 거리 $e_i$에서 $r$과 $x_i$ 사이에 있는 값의 미분값이 곱채진 것을 볼 수 있습니다. 즉, $|g'(s_n)|$의 값이 1보다 작다면, 이 과정을 반복하했을 때 고정점 $r$에 점점 가까워지게 되곘죠. 당연히 $|g'(s_n)|$의 값이 1보다 크면 수렴하지 않고 발산하게 됩니다.
파이썬 구현
def D(f, h=1e-6): # first derivative of f
return lambda x, f=f, h=h: (f(x + h) - f(x - h)) / 2 / h
def solve_fixed_point(f, x, ap=1e-6, rp=1e-4, ns=100):
def g(x):
return f(x) + x # f(x)=0 <=> g(x)=x
Dg = D(g)
for k in range(ns):
if abs(Dg(x)) >= 1:
raise ArithmeticError("error D(g)(x)>=1")
(x_old, x) = (x, g(x))
if k > 2 and norm(x_old - x) < max(ap, norm(x) * rp):
return x
raise ArithmeticError("no convergence")
참조
'Theory > Algorithms' 카테고리의 다른 글
자료구조 - 사전과 셋 (Dictionary, Set) (0) | 2022.09.09 |
---|---|
자료구조 - 리스트와 튜플 (List, Tuple) (0) | 2022.08.07 |
메트로폴리스 (Metropolis) (0) | 2022.03.26 |
몬테카를로 시뮬레이션 (5) - 적분 계산하기 (0) | 2022.03.20 |
몬테카를로 시뮬레이션 (4) - 범용 몬테카를로 엔진 (0) | 2022.03.09 |