python中过早触发收敛的If/break测试

python中过早触发收敛的If/break测试,python,if-statement,convergence,Python,If Statement,Convergence,我试图使用if语句来检查近似值何时收敛,但它会不断返回在2次迭代后收敛的结果,这是不应该的,因为删除if break语句并将其设置为1000次迭代会得到非常不同的值 def Jacobi2D(U,xrange,yrange,order): Up=sym.zeros(len(xrange),len(yrange)) for k in range(1,order): if k>=2 and U==Up: print('Approximat

我试图使用if语句来检查近似值何时收敛,但它会不断返回在2次迭代后收敛的结果,这是不应该的,因为删除if break语句并将其设置为1000次迭代会得到非常不同的值

def Jacobi2D(U,xrange,yrange,order):
    Up=sym.zeros(len(xrange),len(yrange))
    for k in range(1,order):
        if k>=2 and U==Up:
            print('Approximation converges after',k,'iterations')
            break
        Up=U #Save the U of the previous iteration for use in the formula
        for i in range(1,len(xrange)-1):
            for j in range(1,len(yrange)-1):
                U[i,j]=Up[i,j]+(1/4)*(Up[i+1,j]+Up[i-1,j]+Up[i,j+1]+Up[i,j-1]-4*Up[i,j])
                continue
            continue
        continue
    return U

该函数将U视为一个具有维度(len(xrange)、len(yrange))的矩阵,“顺序”是希望近似经过的迭代次数。有人知道为什么在重新定义Up=U之前会触发该条件吗?任何帮助都将不胜感激,谢谢

k>=2
U==Up
时,您的条件将中断。在第二次迭代中,
k=2
并设置
Up=U
,因此
U==Up
。因此,当循环满足条件时,它总是在第二次迭代时中断

我可能会建议一个不同的收敛条件:跟踪上一次近似和本次迭代近似之间的差异。一旦差值小于某个目标精度(比如说
epsilon=0.0000001
),则中断并返回


编辑:问题在于
Up=U
将两个变量指向同一个对象,从而使其中一个对象中的更改也会更改另一个对象。您可以通过将
Up=U
替换为
Up=U.copy()

来解决这个问题。仅供参考,您不需要在每个
for
循环的末尾都添加一条语句。但是我在k循环的2个for循环中重新定义了U,那么为什么它不等到if语句之后才重新定义呢?也许这与
=
有关?我刚刚运行了一个测试,将所有0的
Up
U==Up
的所有1的
U
进行比较,结果返回
true
。无需担心。它与对同一对象的引用有关。您的
U
指向与您的
Up
相同的对象,因此编辑
U
也会编辑
Up
。您应该使用
Up=U.copy()
。编辑我的答案以反映这一点。