Функция 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)
Эта программа (это программа?) Находит только один настоящий корень, если таковой существует, но я полагаю, что этого достаточно для упражнения.