2013-05-02 82 views
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 while循环一次f一次小于10^-14,但我不知道如何修改参数,使循环迭代,任何帮助?while block does not expect expected

+0

还有,你是初始化'F = 0.'循环 – wim 2013-05-02 00:58:26

+0

之外其实,'楼FP = 0.'是一个问题语法错误是不是? – wim 2013-05-02 01:00:22

+1

@wim - 我不知道语法错误,但至少有一个TypeError ... – mgilson 2013-05-02 01:24:46

回答

4

你想要的逻辑or而不是|

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

需要注意的是有逻辑或(or)和按位或(|)之间的运算符优先级的差别。您以前的声明可能被解析为:

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

这似乎是这将提高TypeError ...

这可能是更容易编写:

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 
2

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

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

此外,您returnwhile循环内。你不得不放弃这条线向下缩进一个级别:

return x0, iters