2011-08-10 4 views
1

주어진 다항식과 초기 추측 값에 대해 Newton의 방법을 풀기 위해이 코드가 있습니다. 나는 뉴턴의 방법이 실제로 반복적 인 과정으로 변하고 싶다. 프로그램은 출력 값 "x_n"이 일정해질 때까지 계속 실행해야합니다. 그리고 x_n의 최종 값은 실제 루트입니다. 또한, 내 알고리즘에서이 방법을 사용하는 동안 항상 0과 1 사이의 양수근을 생성해야합니다. 양수로 음수 출력 (루트)을 변환하면 어떤 차이가 있습니까? 고맙습니다.iterative Newton 's method

import copy 

poly = [[-0.25,3], [0.375,2], [-0.375,1], [-3.1,0]] 

def poly_diff(poly): 
    """ Differentiate a polynomial. """ 

    newlist = copy.deepcopy(poly) 

    for term in newlist: 
     term[0] *= term[1] 
     term[1] -= 1 

    return newlist 

def poly_apply(poly, x): 
    """ Apply a value to a polynomial. """ 

    sum = 0.0 

    for term in poly: 
     sum += term[0] * (x ** term[1]) 

    return sum 

def poly_root(poly): 
    """ Returns a root of the polynomial""" 

    poly_d = poly_diff(poly) 
    x = float(raw_input("Enter initial guess:")) 

    x_n = x - (float(poly_apply(poly, x))/poly_apply(poly_d, x)) 

    print x_n 

if __name__ == "__main__" : 
    poly_root(poly) 

답변

1

먼저 poly_diff에서 지수가 0인지 확인하고, 그렇다면 단순히 결과에서 해당 용어를 제거해야합니다. 그렇지 않으면 파생물이 0으로 정의되지 않습니다.

def poly_root(poly): 
    """ Returns a root of the polynomial""" 
    poly_d = poly_diff(poly) 
    x = None 
    x_n = float(raw_input("Enter initial guess:")) 
    while x != x_n: 
     x = x_n 
     x_n = x - (float(poly_apply(poly, x))/poly_apply(poly_d, x)) 
    return x_n 

그렇게해야합니다. 그러나 특정 다항식의 경우 부동 소수점 반올림 오류로 인해 종료되지 않을 수도 있습니다. 최하위 비트에서만 다른 근사치가 반복되는 사이클에서 끝날 수 있습니다. 변경 비율이 하한선에 도달하거나 반복 횟수를 초과하면 종료 될 수 있습니다.

+0

방금 ​​코드를 바꾸었지만 프로그램이 멈췄습니다. – zingy

+0

죄송합니다. 지금 작동합니다. 감사. – zingy

0
import copy 

poly = [[1,64], [2,109], [3,137], [4,138], [5,171], [6,170]] 

def poly_diff(poly): 

    newlist = copy.deepcopy(poly) 

    for term in newlist: 
     term[0] *= term[1] 
     term[1] -= 1 

    return newlist 

def poly_apply(poly, x): 

    sum = 0.0 

    for term in poly: 
     sum += term[0] * (x ** term[1]) 

    return sum 

def poly_root(poly): 

    poly_d = poly_diff(poly) 
    x = float(input("Enter initial guess:")) 

    x_n = x - (float(poly_apply(poly, x))/poly_apply(poly_d, x)) 

    print (x_n) 

if __name__ == "__main__" : 
    poly_root(poly) 
+0

이 질문에 대한 답변의 이유 또는 이유를 설명하는 것이 좋습니다. 코드 블록을 붙여 넣기 만하면 일반적으로 수용 가능한 대답이 아닙니다. – theMayer