2013-03-18 3 views
1

첫 번째 읽기 : 문제는 단순히 절대 값의 괄호가 실제 점수 주변에 있어야한다는 것입니다. 문제는 실제로 실제로는 정확하지 않고 0.000001을 무시하고 0.0001은 허용 오차 (54.994397921372205로 끝나고 55에 가까워 질 때까지 멈 춥니 다. 나는 관용을 0의 미친 양에 1을 더해서 증가시켰다. 그러나 예를 들면 50에 가깝다, 그것은 49.14를 추측한다 !! 무서운! 왜 이런 일이 생길까요?Python에서 Newton Raphson 알고리즘이 작동하지 않습니다. 한 방향으로 만 추정

업데이트 : 내가 몇 가지 벡터 기반의 기능에 속하는 세타를 찾기 위해 노력 오전 float()

로 NEES. 나는이 코드를 R로 실행 시켰고, 이것을 문자 그대로 R에서 Python으로 변환하려고 시도했다. grensscore는 I 세타 = 0.5의 시작 값이 50 같을 때

는 I 세타 값을 근사 할 다음은 R. 로를 반복 그것은 단지에 도착 R의 약 11 번 반복 소요 포인트.

슬프게도 이것은 파이썬에서 작동하지 않습니다. 그리고 나는 이것을 많이 격리 시켰습니다 : 어떤 이유로 값은 0.5 이하로 갈 수 있지만 위에 갈 수는 없습니다. 그 자리에서 인쇄물을 사용하면 코드에서 #a 부분을 실행하지 않고 #b 부분 만 실행하는 것으로 나타납니다. 이것은 값이 절대로 올라갈 수 없다는 것을 보여줍니다. 따라서 0.4와 같은 값을 찾을 수 없습니다 (0.5, 0.25, 0.37.5, 0.4375 등이되어야하기 때문에 0.5, 0.25, 0.125 만 내려갈 수 있습니다). 조만간 중지합니다)

#b를 실행하는 것을 볼 수 있습니다. 그것이 내려 가야 할 때가 여러 번 있지만, 결코 올라가지 않습니다. 주문 효과가 있는지를보기 위해 주위를 바꿨지 만, 그렇지 않다는 것을 알았을 때 (심지어 그것이 내가 아는 경우 라 할지라도) 그것이 사실로 평가되지는 않는다. 누군가가 무엇이 잘못되었는지를 볼 수 있는가? R에서 일하고 있습니까?

def CalcTheta(grensscore, alpha, beta): 
    theta = 0.5 
    estimate = [10000] # I just set this to not error on the check 
    up = 1 
    down = 0 

    while((math.fabs(sum(estimate)) - grensscore) > 0.00001): 

     if estimate == [10000]:  # I set it like this, 
      estimate = [grensscore] # so it will skip the first run 

     # a. 
     if (sum(estimate) - grensscore) < 0: 
      down = theta 
      print(down) 
      theta = (theta + up)/2 
      print(theta) 

     #b. 
     if (sum(estimate) - grensscore) > 0: 
      print(up, down, theta) 
      up = theta 
      theta = (theta + down)/2 
      print(up, down, theta) 

     for x in range(len(beta)): 
      if x == 0: 
       estimate = [] 

      estimate.append(math.exp(alpha[x] * (theta - beta[x]))/(1 + math.exp(alpha[x] * (theta - beta[x])))) 

    return(theta) 

CalcTheta(50, data[:,1], data[:,2]) 
+1

본인이이 질문을 스스로 해결했는지 여부는 분명하지 않습니다. 이 질문을 해결했다면 자신의 질문에 대한 답변을 작성하면 좋을 것입니다. – nograpes

+0

여기에 오타가 있는지, 실제 코드가 corerct인지 확실하지 않지만'while' 문이있는 행은 열리는 괄호보다 더 많은 괄호를 닫습니다. 구문 오류가 발생할 것이라고 확신합니다. –

답변

0

당신을 위해 할 수있는 라이브러리가 있습니다. Scipy (scipy.optimize.newton)을 제안합니다. 조리법은 여기에서 찾을 수 있습니다 :

http://code.activestate.com/recipes/576762-newton-raphson-root-finding/

+0

함수의 소수를 모릅니다. 나는 그것을하는 방법을 전혀 모른다. – PascalVKooten

+0

'fprime'은 선택 사항입니다. 함수 자체와 0 값의 첫 번째 추정치 만 제공하면됩니다. – heltonbiker

+0

(실제 설명서는 http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html) – heltonbiker

1

문제는

while(math.fabs(sum(estimate)) - grensscore) > 0.00001):

이 다른 부분으로

while(math.fabs(sum(estimate) - grensscore)) > 0.00001):

을해야한다고했다, 그것은 float 아니었다 그러므로 그것은 정말로 정확하지 않았습니다.