Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기

Theory/Algorithms

방정식 해 찾기 - 고정점 반복법

반응형

하나의 변수 x를 가진 방정식의 해를 구하고 싶습니다. (f(x)=0) 방정식의 해를 구하는 방법은 여러 가지가 있습니다만 이번 포스트에서 알아볼 방법은 고정점 반복법이라는 알고리즘입니다. 고정점 반복법의 시작은 f(x)=0g(x)=x의 형태로 두고 y=xy=g(x)의 연립방정식을 반복을 통해 푸는 방법으로  특정 조건 하에서 사용할 수 있습니다.

그렇다면 f(x)=0으로부터 g(x)=x 형태로 둔다는 것은 무엇일까요? 예를 들어 f(x)=xcos(x)일 경우, g(x)x=g(x)=cos(x)로 둠으로써 y=xy=cos(x)의 교차점을 찾으면 f(x)=xcos(x)=0의 해를 구할 수 있겠죠. 만약 f(x)=x3+cos(x)일 경우에는 양변에 x를 더해 x+f(x)=x+x3+cos(x)=g(x)의 형태로 만들 수 있겠죠. 이 경우에는 y=xy=x+x3+cos(x)의 교차점이 해가 되겠죠. 이러한 방법이 가능한 이유는 f(x)=0에서 x=x+f(x)이고 x+f(x)=g(x)라 할 때, f(x)=0의 해가 r이라면 r=g(r)이 성립하기 때문입니다. 따라서 y=xy=g(x)의 교차점이 r이 되고 이를 고정점 (fixed point) 라고 합니다.

고정점 반복법의 시작은 임의의 점 x0에서 시작해서 x1=g(x0), x2=g(x1) 식으로 r에 접근하는 방석으로 이루어집니다. 이 과정을 반복하게 되면 다음과 같습니다. (sn(xn,r)로 두 번쨰 수식은 평균값 정리로 유도됩니다.)

ei+1=|xi+1r|=|g(xi)g(r)|

=|g(sn)(xnr)|=|g(sn)(xnr)|=|g(sn)|ei

위의 수식을 보면 i+1 번째에서의 고정점과의 거리 ei+1i 번째에서의 고정점과의 거리 ei에서 rxi 사이에 있는 값의 미분값이 곱채진 것을 볼 수 있습니다. 즉, |g(sn)|의 값이 1보다 작다면, 이 과정을 반복하했을 때 고정점 r에 점점 가까워지게 되곘죠. 당연히 |g(sn)|의 값이 1보다 크면 수렴하지 않고 발산하게 됩니다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mykepzzang&logNo=220080754808

 

파이썬 구현

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")

 

참조

반응형