2013-03-18 1 views
1

READ FIRST: Проблема заключалась в том, что скобки абсолютного значения должны быть вокруг фактического балла. Проблема в том, что она на самом деле недостаточно точная, она игнорирует 0,000001, а больше делает как 0,0001 как допуск (он останавливается на 54.994397921372205, когда я прошу, чтобы он приблизился к 55). Я увеличил толерантность к безумному количеству 0, за которым следует 1, но, например, приблизительно 50, он оценивает 49.14 !! Ужасно! Почему это происходит?Алгоритм Ньютона Рафсона в Python не работает; только оценки в одном направлении

UPDATE: Nees быть float()

Я пытаюсь найти тету, принадлежащую к функции на основе некоторых векторов. У меня этот код работает в R, и я пытался буквально перевести его с R на Python.

Я хочу, чтобы приблизить значение Theta, когда grensscore равен 50. У меня есть начальное значение тета = 0,5, а затем он перебирает в R. Это займет около 11 итераций в R, чтобы добраться до точка.

Ужасно, это не работает в Python, и я его сильно изолировал: по какой-то причине значения могут идти только ниже 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' закрывает больше круглых скобок, чем открывается. Я уверен, что это приведет к синтаксической ошибке. – 2013-03-18 21:59:35

ответ

0

Есть несколько библиотек, которые могут это сделать для вас. Я бы предложил Scipy (scipy.optimize.newton). Рецепт можно найти здесь:

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

+0

Я не знаю здесь функцию prime; Я понятия не имею, как это сделать. – PascalVKooten

+0

'fprime' является необязательным, вам нужно только предоставить самую функцию и первую оценку нулевого значения. – 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 , поэтому он не стал действительно точным.

Смежные вопросы