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"
我想要这个循环一次f一次小于10 ^ -14,但我不知道如何修改参数使循环迭代,任何帮助?
答案 0 :(得分:4)
您需要逻辑or
而不是|
:
while f > 10**-14 or -f < 10**-14:
请注意,逻辑或(or
)与按位或(|
)之间的运算符优先级存在差异。您之前的陈述可能被解析为:
while (f > (10**-14 | -f)) < 10**-14):
这似乎会引发TypeError
...
写作可能更容易:
while abs(f) > 10**-14:
答案 1 :(得分: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 :(得分:2)
while f > 10**-14 | -f < 10**-14
使用的是按位OR,而不是逻辑OR。使用or
关键字:
while f > 10**-14 or -f < 10**-14:
此外,您return
循环内的while
。你必须将这一行放在一个缩进级别:
return x0, iters