Объект 'float' не является итерируемым в итерации Ньютона-Рафсона

Я получаю ошибку 'float' object is not Iterable в скрипте для итерации Ньютона-Рафсона. Я применяю итерацию к функции f(x) = sin(x), и x0 = 3 для итерации. Я получаю ошибку по условию остановки, которое равно max{ |xn−2 − xn−1|, |xn−1 - xn| } ‹ (1/2)10-9. Вот мой код:

def NewtonRaphson2():
    L = []
    L.append(3)
    n = 0

    while(1):
        tmp = L[n] - (math.sin(L[n])/math.cos(L[n]))
        L.append(tmp)
        n+=1
        m = (max(abs(L[n-2] - L[n-1])), abs(L[n-1] - L[n]))
        if m < (.5e-9):
            print(n, "\n")
            x = max(abs(L[n-2] - L[n-1]), abs(L[n-1] - L[n]))
            print(x, "\n")
            print(L[n], "\n")
            break
        break

и точное сообщение об ошибке

Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module>
    NewtonRaphson2()
  File "C:/Python34/nmhw3.py", line 28, in NewtonRaphson2
    m = (max(abs(L[n-2] - L[n-1])), abs(L[n-1] - L[n]))
TypeError: 'float' object is not iterable

Функции max() или abs() принимают только итерируемые объекты? Меня смущает такое поведение.


person donut juice    schedule 08.02.2017    source источник


Ответы (2)


Это простая опечатка. Ваши скобки закрываются слишком рано. Это в строке с m = ....

По сути, ваш код вызывает max только с одним числом с плавающей запятой. Однако max(x) не имеет смысла, если x не является списком или массивом.

Исправьте скобки, и все будет хорошо.

person Lagerbaer    schedule 08.02.2017
comment
Чувствую себя глупо прямо сейчас.. Спасибо, что заметили это. Другие ответы в связанных сообщениях говорили о том, как определенные функции хорошо работают/не работают с итерируемыми объектами, так что это то, откуда пришло мое предположение. - person donut juice; 08.02.2017
comment
Рад помочь, хе-хе. Годы программирования и совершения именно таких ошибок заставляют внимательно следить за этими опечатками. Если вам понравился ответ, вы можете пометить его как принятый. - person Lagerbaer; 08.02.2017

max( ) может принимать либо итерируемый, либо несколько аргументов. Это показано в первых нескольких строках help(max):

>>> help(max)
Help on built-in function max in module builtins:

max(...)
    max(iterable, *[, default=obj, key=func]) -> value
    max(arg1, arg2, *args, *[, key=func]) -> value

как указывает Лагербер - если вы исправите размещение скобок, вы вызовете max( ) со второй формой - передав несколько аргументов. (для акцента добавлены дополнительные пробелы, не относящиеся к PEP 8!)

m = max(   abs(L[n-2] - L[n-1])  ,   abs(L[n-1] - L[n])   )

Если вы действительно хотите вызвать max( ) с первой формой, вы можете добавить круглые скобки, чтобы превратить два ваших аргумента в один tuple, который затем будет итерируемым. Круглые скобки излишни, но, возможно, вы поклонник Лиспа и скучаете по всем этим скобкам! :-)

m = max( (  abs(L[n-2] - L[n-1])  ,   abs(L[n-1] - L[n]) )  )  
person quizdog    schedule 08.02.2017
comment
спасибо, я даже не знал, что в python есть функция help() - person donut juice; 08.02.2017