2016-06-11 15 views
-2

Функция compute_root использует метод последовательного приближения Ньютона, чтобы найти достаточно хорошие аппроксимации нулей полиномов (здесь и лежит проблема). Функция evalPoly вычисляет значение многочлена при определенном значении x, а функция ddx2 вычисляет производную от полинома.TypeError: объект «NoneType» не является итерируемым. Почему я получаю эту ошибку?

poly2 = (2,3,1,5) #poly2 represents the polynomial 5x^3+x^2+3x+1 

def evalPoly(poly,x): 
    degree = 0 
    ans = 0 
    for index in poly: 
     ans += (index * (x**degree)) 
     degree += 1 
    return ans 

def ddx2(tpl): 
    lst = list(tpl) 
    for i in range(len(lst)): 
     lst[i] = lst[i]*i 
     if i != 0: 
      lst[i-1] = lst[i] 
    del lst[-1] 
    tpl = tuple(lst) 

def compute_root(poly,x_0): 
    epsilon = .001 
    numGuesses = 1 
    if abs(evalPoly(poly,x_0)) <= epsilon: 
     ans = (evalPoly(poly,x_0),numGuesses) 
     print ans 
     return ans 
    else: 
     x_1 = x_0 - (evalPoly(poly,x_0)/evalPoly(ddx2(poly),x_0)) 
     # This is Newton's method of getting progressively better/
     # "guesses" 
     compute_root(poly,x_1) 
     x_0 = x_1 
     numGuesses += 1 
     return x_0 
     return poly 

compute_root(poly2,2) #Here I call the function *compute_root* 

Когда я вызываю функцию я получаю эту ошибку:

Samuels-MacBook:python barnicle$ python problemset2.py 
Traceback (most recent call last): 
    File "problemset2.py", line 160, in <module> 
    compute_root(poly2,x_0) 
    File "problemset2.py", line 156, in compute_root 
    x_1 = x_0 - (evalPoly(poly,x_0)/evalPoly(ddx2(poly),x_0)) 
    File "problemset2.py", line 126, in evalPoly 
    for index in poly: 
TypeError: 'NoneType' object is not iterable 

Я знаю функции питона не возвращать ни по умолчанию. Я думаю, что ошибка возникает, потому что значение отсутствует передается в параметр poly в evalPoly. Почему это происходит?

Я чувствовал, что было бы разумно включить все, даже функцию ddx2 (которая еще не была вызвана в этом примере), потому что я не знаю, нужна ли она вам. Я знаю compute_root нуждается в большой работе, это только первый шаг. Благодаря!!!

ОБНОВЛЕНИЕ !!!

Это было доведено до моего сведения, что я получал ошибку, потому что моя функция ddx2 недоставало возвращаемое значение, так что это было, конечно, не возвращая значение ни, которая, конечно, не итерацию. Спасибо!!

UPDATE2 !!!

У меня есть моя полная рабочая программа здесь, в которой я размещаю в надежде, что она может кому-то помочь. Я потратил много часов на это. Это из MIT открытых учебных электротехники и информатики 6.00sc с профессором Джоном Гуттаг, проблема установить 2.

poly5 = (-13.39, 0.0, 17.5, 3.0, 1.0) # represents the polynomial: 
     # x^4+3x^3+17.5x^2-13.39 


def evalPoly(poly,x): 
    degree = 0 
    ans = 0 
    for index in poly: 
     ans += (index * (x**degree)) 
     degree += 1 
    return float(ans) 
    return degree 

def ddx2(tpl): 
    lst = list(tpl) 
    for i in range(len(lst)): 
     lst[i] = lst[i]*i 
     if i != 0: 
      lst[i-1] = lst[i] 
    del lst[-1] 
    tpl = tuple(lst) 
    return tpl 

def compute_root(poly,x_0,numGuesses): 
    epsilon = .001 
    ans = [] 
    if abs(evalPoly(poly,x_0)) <= epsilon: 
     ans.append(x_0) 
     ans.append(numGuesses) 
     ans = tuple(ans) 
     print ans 
     return ans 
    else: 
     numGuesses += 1 
     x_0 = x_0 - (evalPoly(poly,x_0)/evalPoly(ddx2(poly),x_0)) 
     compute_root(poly,x_0,numGuesses) 

    compute_root(poly5,.1,1) 

Выход: Сэмюэлс-MacBook: питон Барникл $ питон problemset2.py (+0,806790753796352, 8)

Эта программа (это программа?) Находит только один настоящий корень, если таковой существует, но я полагаю, что этого достаточно для упражнения.

ответ

1

В вашей функции ddx2(tpl) отсутствует возвращаемое значение.

0

Функция evalPoly раз она возвращает не анс его не возвращает степень: вы можете использовать возврат (анс, степень)

так же в в цикле еще

также ddx2 не возвращает какой-либо функции.

0

Изменение:

def ddx2(tpl): 
    lst = list(tpl) 
    for i in range(len(lst)): 
     lst[i] = lst[i]*i 
     if i != 0: 
      lst[i-1] = lst[i] 
    del lst[-1] 
    tpl = tuple(lst) 

To:

def ddx2(tpl): 
    lst = list(tpl) 
    for i in range(len(lst)): 
     lst[i] = lst[i]*i 
     if i != 0: 
      lst[i-1] = lst[i] 
    del lst[-1] 
    tpl = tuple(lst) 

    return tpl 

Он пропускал return.

У вас есть еще одна проблема, и мне непонятно, каково было ваше намерение. Эта функция возвращает дважды, и только первый на самом деле будет возвращен (ans):

def evalPoly(poly,x): 
    degree = 0 
    ans = 0 
    for index in poly: 
     ans += (index * (x**degree)) 
     degree += 1 
    return ans 
    return degree 

Следующая проблема, которую вы будете иметь обдувает Рекурсия предел. Я предлагаю вам использовать цикл вместо рекурсии для решения этой проблемы.

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