2012-10-11 5 views
2

이 문제는 C/C++에서 해결 된 것으로 알고 있습니다. 그러나 파이썬으로 변환 할 수있는 언어로는 충분하지 않습니다. 파이썬에서 this을 만들려고합니다. 내가 올 수 있었던 가장 가까운이었다이 :파이썬의 Secant 메서드 함수

#This is meant to work for functions of the form x^a + b = 0 

def secant(base, exp=2, it=20): 
    def f(x): 
     return x**exp - base 
    x1 = base/float(exp**2) 
    xnm1 = x1 - 5 
    xnm2 = x1 + 5 
    xn = 0 
    for n in range(it): 
     q = (xnm1-xnm2)/float(f(xnm1)-f(xnm2)) 
     xn = xnm1 - (f(xnm1)*q) 
     xnm1, xnm2 = xn, xnm1 
    return xn 

print secant(2, 2) 

이 오류를 반환

Traceback (most recent call last): 
    File "/Users/Joe/Desktop/secant.py", line 16, in <module> 
    print secant(2, 2) 
    File "/Users/Joe/Desktop/secant.py", line 11, in secant 
    q = (xnm1-xnm2)/float(f(xnm1)-f(xnm2)) 
ZeroDivisionError: float division by zero 

은 내가 오프이 코드를 기반으로 뉴턴 방법, 프로그램, 그러나 수 있었다. 도움이된다면, 여기있다 :

def newton(base, exp=2, it=20): 
    def f(x): 
     return x**exp - base 
    def df(x): 
     return exp*(x**(exp-1)) 
    x1 = base/float(exp**2) 
    xnp = x1 
    xn = 0 
    for n in range(it): 
     xn = xnp - ((f(xnp)/df(xnp))) 
     xnp = xn 
    return xn 

다음 방법은 20 반복 후 정확도 12 자리 대답을 제공합니다. 어떤 도움을 주시면 감사하겠습니다.

+0

무엇이 작동하지 않습니까? –

+0

실례합니다. 나는 제로 오류로 나눗셈을 얻는다. – JShoe

답변

2

알고리즘이 파이썬의 정밀도 내에서 답변으로 수렴 되었기 때문에 0으로 나누기가 발생했습니다. 최대 횟수 반복 (무한 루프를 방지하기 위해) 마지막 두 추측이 "충분히 근접한"것인지 확인해야합니다.

+0

고마워, 나는 xnm1 = xnm2가 될 때까지 while 루프로 고정시켰다. – JShoe

+2

항상 작동하지는 않습니다. 때로는 두 값 사이에서 튀는 솔루션을 만날 수 있습니다. – casevh

2

중요한 플로트 번호입니다. 전자의 경우, 약간의 반복 후에는 f(xnm1)f(xnm2) 사이의 차이가 너무 작아서 float이이를 나타내지 못하기 때문에 0으로 반올림되어 오류가 발생합니다.

후자의 경우, 우리는 미분을 사용하여 그 지점의 기울기를 직접 계산하지만, 작지만 0이 아닙니다 (그러나 다음 반복에서 거의 동일한 값으로 유지됨). 오류가 발생했습니다.

여기에 an exampleIEEE floating point입니다.

관련 문제