我的代码似乎没有超出这一行

时间:2019-05-01 09:34:00

标签: python

我想在python中实现共轭梯度算法。但是,当我运行代码时,不会打印/显示结果。当我停止程序时,python向我显示了此内容:

def V(r):
return (r[0]-r[1])**4+2*r[0]**2+r[1]**2-r[0]+2*r[1]

def g(r):
return np.array([4*(r[0]-r[1])**3+4*r[0]-1, -4*(r[0]-r[1])**3+2*r[1]+2])  

def Conj_Grad(r):
iterations = 0
maxiterations = 1000
precision = 10**-10
a = 10**-4
b = 0.9
alpha = 0.09
r0 = r
g0 = g(r)
p0 = -g(r)
V0 = V(r)
Coord_List= []
S = np.dot(p0,g0)
while iterations < maxiterations:
    Coord_List.append(r0)
    while True:
        r1 = r0 + alpha*p0 
        g1 = g(r1) 
        V1 = V(r1)
        if V1 <= V0 + a*alpha*S:
            g1 = g(r1)
            if abs(np.dot(g1,p0)) <= b*abs(np.dot(p0,g0)):
                break
            else:
                alpha = alpha*(1.5)
                continue
        else:
            alpha = alpha/2
            continue
    if abs(V0-V1) < precision:
        Coord_List.append(r1)
        iterations +=1
        break       
# Generating beta by Fletcher Reeves
    beta = np.dot(g1,g1)/np.dot(g0,g0)        
    p0 = -g1 + beta*p0
    g0 = g1
    V0 = V1
    iterations +=1
return (Coord_List, i, V1-V0)
<ipython-input-57-f26ac2ab8296> in Conj_Grad(r)
     29         Coord_List.append(r0)
     30         while True:
---> 31             r1 = r0 + alpha*p0
     32             g1 = g(r1)
     33             V1 = V(r1)

当我输入一个r时,例如[1,1];不管我让它运行多长时间,它总是卡在第31行。此代码有什么问题?

1 个答案:

答案 0 :(得分:3)

如果不退出,则while循环将永远运行。 while循环中的3行将很快执行,因此,当您暂停代码时,很有可能会在该行上暂停,但是该行可能已经成功执行了数千次。

您应该包括一些条件以在完成后停止while循环:

while True:
    # Computations
    if enough_iterations:
        break

编辑:还要检查您的if语句的缩进。它应该在while循环中,但是现在不是。因此,可能正在执行while循环的前3行。