1
def fvals_sqrt(x):
    """
    Return f(x) and f'(x) for applying Newton to find a square root.
    """
    f = x**2 - 4.
    fp = 2.*x
    return f, fp

def solve(fvals_sqrt, x0, debug_solve = False):
    """
    Solves the sqrt function, using newtons methon.
    """
    iters = 0
    f, fp = 0.
    while  f > 10**-14 | -f < 10**-14:
        f, fp = fvals_sqrt(x0)
        x0 = x0 - (f/fp)
        iters = iters+1
        print  + " x = %22.15e in %i iterations " % (x0, iters)
        return x0, iters

    print "we're done"

我想要这个while循环一次f小于10^-14,但我不确定如何修改参数以使循环可迭代,有什么帮助吗?

4

3 回答 3

4

你想要逻辑or而不是|

while  f > 10**-14 or -f < 10**-14:

请注意,逻辑或 ( or) 和按位或 ( |) 之间的运算符优先级有所不同。您之前的声明可能被解析为:

while (f > (10**-14 | -f)) < 10**-14):

这似乎会引发TypeError...

写起来可能更容易:

while abs(f) > 10**-14:
于 2013-05-02T00:28:12.430 回答
2

|运算符用于bitwise-OR所以你应该在这里使用逻辑or,其次该return语句也在错误的位置,它只会在一次迭代后结束你的循环。

def solve(fvals_sqrt, x0, debug_solve = False):
    iters = 0
    f, fp = 0.
    while  f > 10**-14 or -f < 10**-14:
        f, fp = fvals_sqrt(x0)
        x0 = x0 - (f/fp)
        iters = iters+1
        print  + " x = %22.15e in %i iterations " % (x0, iters)
    print "we're done"
    return x0, iters
于 2013-05-02T00:28:31.977 回答
2

while f > 10**-14 | -f < 10**-14正在使用按位或,而不是逻辑或。使用or关键字:

while  f > 10**-14 or -f < 10**-14:

此外,你return在你的while循环中。您必须将此行降低一级缩进:

    return x0, iters
于 2013-05-02T00:28:38.547 回答