2017-11-17 3 views
0

다음은 루트 찾기 방법 중 하나에 대한 코드입니다.Regulafalsi 코드를 실행할 수없는 이유는 무엇입니까? NoneType 오류로 인해

from __future__ import division 
def falseposition(f, a, b, imax=50, tolerance=1.0e-10): 
    i = 0 
    while i < imax: 
    c = (a*f(b)-b*f(a))/(f(b) - f(a)) 
    if c == 0 or f(c) < tolerance: 
     return c, i 
    elif (f(a)*f(c))<0: 
     b=c 
    else: 
     a=c 
    i += 1 
f = lambda x: x**5 - x + 1 
root, steps = falseposition(f, 1, 8) 
print ("The root is", root, "and the value is", f(root), "; steps taken:", steps) 

TypeError가 있습니다. 'NoneType'객체는 반복 가능하지 않습니다.

문제가 무엇인지 확인하려면 알려주십시오. 이 iimax보다 더 얻을 수 전에 기준 을 충족 c의 값이 발견되면

+0

첫 번째 'if'조건이 충족되지 않으면 어떻게됩니까? 그 점을 고려해야합니다. –

+1

당신이 얻은 완전한 오류 메시지를 게시 할 때 사람들이 쉽게 도움을줍니다. – voiDnyx

+0

반복 한계에 도달하면 함수는 끝에서 벗어나 암묵적으로'None'을 반환합니다. 이'None'을'root'와'steps'에 압축을 풀 때 오류가 발생합니다. – jasonharper

답변

1

귀하의 falseposition 기능 명시 적으로 반환합니다. 그렇지 않으면 while 루프에서 벗어나 함수 본문의 끝에 도달 한 다음 (암시 적으로) None을 반환합니다. 이 경우 root, steps = falseposition(f, 1, 8) 문은 실제로 root, steps = None이되고 None은 반복 할 수 없기 때문에이 오류가 발생합니다.

당신은 주로 여기에 두 가지 솔루션을 가지고, 다음 중 하나를 함수의 끝에서 기본값으로

반환 None, i (None과를 기능을 시그널링 c에 대한 일치하는 값을 발견하는 데 실패) :

def falseposition(f, a, b, imax=50, tolerance=1.0e-10): 
    i = 0 
    while i < imax: 
    c = (a*f(b)-b*f(a))/(f(b) - f(a)) 
    if c == 0 or f(c) < tolerance: 
     return c, i 
    elif (f(a)*f(c))<0: 
     b=c 
    else: 
     a=c 
    i += 1 
    # nothing found 
    return None, i 

을 또는 예외를 제기하십시오 (호출자가 코드를 잡아 내도록하십시오).

def falseposition(f, a, b, imax=50, tolerance=1.0e-10): 
    i = 0 
    while i < imax: 
    c = (a*f(b)-b*f(a))/(f(b) - f(a)) 
    if c == 0 or f(c) < tolerance: 
     return c, i 
    elif (f(a)*f(c))<0: 
     b=c 
    else: 
     a=c 
    i += 1 
    # nothing found 
    raise ValueError("No matching c value") 

이온은 문맥과 이것 저것에 달려있다. 그러나 분명히 적당한 "해결책"이 발견되지 않는 꽤 많은 경우가있을 수 있기 때문에 첫 번째 것 (반환 (None, i)`)이 좋은 후보로 보인다.

당신은 물론 그대로 기능을 중단하고 당신이 그것을 압축하기 전에 반환 값을 테스트해야합니다 수 :

result = falseposition(f, 1, 8) 
if result is None: 
    print("oops, nothing found") 
root, steps = result 
# etc 

을하지만 그건 정말 정말 추한, 실제로 나쁜 관행 (하나는 반환 값을 예상 일관성있는 유형의 함수).

관련 문제