我想在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行。此代码有什么问题?
答案 0 :(得分:3)
如果不退出,则while循环将永远运行。 while循环中的3行将很快执行,因此,当您暂停代码时,很有可能会在该行上暂停,但是该行可能已经成功执行了数千次。
您应该包括一些条件以在完成后停止while循环:
while True:
# Computations
if enough_iterations:
break
编辑:还要检查您的if
语句的缩进。它应该在while循环中,但是现在不是。因此,可能正在执行while循环的前3行。