在python中格式化if-else语句时遇到问题

在python中格式化if-else语句时遇到问题,python,Python,我的程序使用牛顿算法找到根。我在最后一个部分遇到了问题,如果没有足够的迭代来找到要打印的根,那么就没有找到根 for i in range(N): f= evaluate(p,deg,x0) s=evaluate(d,deg-1,x0) if s==0: print "Can't divide by 0" return -1 x1=x0 - f/s print ("Iteration %d" %(i+1)) prin

我的程序使用牛顿算法找到根。我在最后一个部分遇到了问题,如果没有足够的迭代来找到要打印的根,那么就没有找到根

for i in range(N):
    f= evaluate(p,deg,x0)
    s=evaluate(d,deg-1,x0)
    if s==0:
        print "Can't divide by 0"
        return -1
    x1=x0 - f/s
    print ("Iteration %d" %(i+1))
    print "%f" %x0
    if abs(x1-x0)<tol:
        print "Found a root %f" %x1
        return 0
    else:
        x0=x1
    if abs(x1-x0)>tol:
       print "root not found"
范围(N)内的i的
:
f=评估(p,度,x0)
s=评估(d,度-1,x0)
如果s==0:
打印“不能被0除”
返回-1
x1=x0-f/s
打印(“迭代%d”%(i+1))
打印“%f”%x0
如果abs(x1-x0)tol:
打印“未找到根目录”
不知怎的,它似乎跳过了最后一个if语句,没有打印任何内容,我试着把它放在不同的地方。当我把它放在前面的if语句之前时,它跳过了x0=x1部分。我不知道它出了什么问题


N是迭代次数,x0是初始猜测,我想,永远都没有用牛顿方法做过任何事情,你想要的东西更像:

x1 = sys.maxint # the first iteration is a throw-away
                # you could do this a different way, but you have a lot of global 
                # variables that I don't know how to handle.
for i in range(N):
    # ....
    if abs(x1-x0)<tol:
        # ...

    # you want these two lines together, somehow.
    x0 = x1
    x1 = x0 - f/s

    #...
    # no "else" down here

# no "if abs(x1-x0)>tol:", because it's taken care of by the return(0)
# earlier. Also note the unindent.
print "root not found"
x1=sys.maxint#第一次迭代是一次性的
#你可以用另一种方式来做,但你有很多全球性的问题
#我不知道如何处理的变量。
对于范围(N)中的i:
# ....

如果abs(x1-x0)显示未找到根的逻辑不正确。您不想检查
abs(x0-x1)>tol
,因为这与查找根无关。想想看:
x0
x1
之间的差异可能非常大,但是您仍然可以找到根。您不会仅仅因为在某些迭代中
x1
x0
不同就想跳出迭代

更好的方法是将错误语句放在
for
循环之外,例如:

for i in range(N):
    f = evaluate(p,deg,x0)
    s = evaluate(d,deg-1,x0)

    if s==0:
        print "Can't divide by 0"
        return -1
    x1=x0 - f/s
    print ("Iteration %d" %(i+1))
    print "%f" %x0
    if abs(x1-x0)<tol:
        print "Found a root %f" %x1
        return 0
    else:
        x0=x1

# If we exhaust the for-loop without returning due to
# a found root, then there must have been an error with
# convergence, so just print that at exit.
print "Error: did not converge to the root in %d iterations."%(N)
print "Check your initial guess and check your functions for cyclic points."
范围(N)内的i的
:
f=评估(p,度,x0)
s=评估(d,度-1,x0)
如果s==0:
打印“不能被0除”
返回-1
x1=x0-f/s
打印(“迭代%d”%(i+1))
打印“%f”%x0

如果abs(x1-x0),我不确定这是否是堆栈溢出问题,或者这是否正是您的代码在Python中的表现,但我认为您的缩进是不正确的。。。编辑:看起来不错now@Dream:这就是将Python代码放入堆栈溢出的美妙之处;由于格式不同,在本地编辑器中很难发现的一些问题在这里渲染时有时会非常明显。由于格式不同,此代码已被破坏,显然也是如此。:)这就是代码的外观。在
vim
和派生文本编辑器中,您会发现
:set list
模式非常有助于区分空格和制表符。Python关心,所以您也必须关心。除了缩进,x0=x1也有问题。看起来abs(x1-x0)>tol永远不会为真,因为x0=x1。编辑:也许最后一个if不应该缩进?另一个建议的技巧是,如果保存
x
值序列,使用迭代解算器诊断问题通常会很有帮助。因此,您可以首先创建一个列表
x_vals=[0.0]*(N+1)
,它将为您提供一个长度为N+1的零列表。然后将
x\u vals[0]
设置为初始猜测,并将迭代结果
i
添加到
x\u vals[i]
槽中,用于
范围(1,N)
中的
i
。在每次迭代中,您都会使用
x\u vals[i-1]
引用前面的值。这可以让您更好地匹配常用的教科书符号,出于诊断目的,您可以返回整个
x
值列表,而不仅仅是最后一个值。更好的是,一旦开始学习NumPy,就可以使用NumPy数组和操作。这
打印(“迭代%d”%(i+1))
应该是
打印“迭代%d”%i+1
@burhan,不,它是正确的。您可以像调用函数一样调用
print
,即使在较早版本的Python中也是如此。在Python3K中,您必须这样称呼它,但在旧版本中您仍然可以这样称呼它。您是对的@EMS,我的观点是最好保持一致,选择其中之一。理想情况下,坚持使用“函数调用”语法,这样在3K全面启动时就不必担心什么了。