在Newton-Raphson迭代中,'float'对象不可迭代

时间:2017-02-08 00:38:47

标签: python iteration newtons-method

我在Newton-Raphson迭代的脚本中遇到'float' object is not Iterable错误。我将迭代应用于函数f(x) = sin(x),并将x 0 = 3用于迭代。我在停止条件上得到错误,即max {| x n-2 - x n-1 |,| x n-1 - x n | }< (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()函数只能进行迭代吗?我对这种行为感到困惑。

2 个答案:

答案 0 :(得分:2)

这是一个简单的错字。你的括号太早了。它与m = ...一致。

基本上你的代码只用一个浮点调用max。但是,max(x)除非x是列表或数组,否则没有意义。

修正括号,你很好。

答案 1 :(得分:0)

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

正如Lagerbaer所指出的那样 - 如果您修复了括号放置,您将使用第二种形式调用max( ) - 传入多个参数。 (增加额外的非PEP 8空间用于强调!)

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

如果 想要使用第一个表单调用max( ),您可以添加括号以将两个参数转换为单个tuple,然后是可迭代的。括号是多余的,但也许你是Lisp的粉丝而且想念所有那些parens! : - )

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