2013-06-15 3 views
1

내 프로그램에서이 부분을 while 루프에 입력 할 수 없습니다. poly, x_0epsilon의 값을 연결 한 후 프로그램은 evaluate_poly() 함수를 사용하여 ans의 값을 계산합니다.이 값은 제 특정 인스턴스에서 -13.2119입니다. 내 엡실론 값은 0.0001입니다. abs(ans)이 실제로 epsilon보다 큽니다. 왜 루프를 건너 뛰고 있습니까? 조건이 참으로 평가 되더라도 코드가 루프를 건너 뜁니다.

나는 확실히 그것 (그 않는) 제대로 내 epsilon 값에 복용했다 확인하기 위해 while 루프와도 print epsilon 문 앞에 정확하게 계산 된 있도록 바로 x_01 = 0 라인 아래에 print ans 문을 넣어.

def compute_root(poly, x_0, epsilon): 
    """uses newton's method to find a root of a polynomial function""" 

    ans = evaluate_poly(poly, x_0) 
    x_01 = 0 

    while abs(ans) > epsilon: 

     Dpoly = compute_deriv(poly) 
     Fprime = evaluate_poly(Dpoly, x_01) 
     return ans 

     x_01 = x_0 - (ans/Fprime) 
     print x_01 
     return x_01 

    print ans 
+0

>>>> abs (-13.2119)> 0.0001'은 'True'를 반환합니다. – njzk2

답변

1

루프 안에 return ans이 있습니다. 따라서 그 시점에서 함수는 종료되고 print에 도달하지 않습니다.

ans이 실제로 -13.2119이면 루프를 입력하고 return 때문에 모든 것을 수행하지 않습니다.

루프 내부에서 return ans 행을 제거하더라도 끝에는 return x_01이 있습니다. 따라서이 경우 루프는 최대 한 번 실행되므로 if 문과 동일하게됩니다.

+0

그래서 함수 본문의 끝에 ans를 추가하면 나머지 본문이 실행됩니까? 프로그램의 목표는 <0.0001의 ans를 줄 x_0의 값을 찾는 것입니다 (답이 달라지 든 아니든 상관 없습니다) –

+0

@BradGalpin : 'return' 문을 루프는 함수를 즉시 종료 할 것이기 때문입니다. 하지만 지금은'ans'가 루프 안에서 업데이트되지 않으므로 무한대로 돌아갑니다. 루프에서'ans'를 새로운 값으로 업데이트해야합니다. 그리고 아마도 x를 돌려주고, 끝에는 ans가 필요 없을 것입니다. – interjay

+0

아아, 나는 return 문이 while 루프 위의 ans를 업데이트 한 다음 while 루프를 다시 평가할 것이라고 생각했습니다. 또한 while 루프의 print 문은 어디에서 일이 일어나고 있었는지/시도하지 않았던 곳을 찾는데 도움이되었습니다. 도와 주셔서 감사합니다 –

2

루프 내에 두 개의 return 문을 넣습니다. 첫 번째 공격이 발생하면 즉시 종료됩니다. 따라서 while 루프가 첫 번째 루프에서 종료 될뿐만 아니라 print 문에 결코 도달하지 않습니다.

관련 문제