我正在为一个无约束优化问题创建一个基本的牛顿法算法,我的算法结果不是我所期望的。这是一个简单的目标函数,因此很明显该算法应该收敛于 (1,1)。我之前创建的梯度下降算法证实了这一点,这里:
def grad_descent(x, t, count, magnitude):
xvalues.append(x)
gradvalues.append(np.array([dfx1(x), dfx2(x)]))
fvalues.append(f(x))
temp=x-t*dfx(x)
x = temp
magnitude = mag(dfx(x))
count+=1
return xvalues, gradvalues, fvalues, count
我为牛顿法创建算法的尝试在这里:
def newton(x, t, count, magnitude):
xvalues=[]
gradvalues=[]
fvalues=[]
temp=x-f(x)/dfx(x)
while count < 10:
xvalues.append(x)
gradvalues.append(dfx(x))
fvalues.append(f(x))
temp=x-t*f(x)/dfx(x)
x = temp
magnitude = mag(dfx(x))
count+=1
if count > 100:
break
return xvalues, gradvalues, fvalues, count
这是目标函数和梯度函数:
f = lambda x: 100*np.square(x[1]-np.square(x[0])) + np.square((1-x[0]))
dfx = lambda x: np.array([-400*x[0]*x[1]+400*np.power(x[0],3)+2*x[0]-2, 200*(x[1]-np.square(x[0]))])
这里是初始条件。请注意,在牛顿法中不使用 alpha 和 beta。
x0, t0, alpha, beta, count = np.array([-1.1, 1.1]), 1, .15, .7, 1
magnitude = mag(np.array([dfx1(x0), dfx2(x0)]))
调用函数:
xvalues, gradvalues, fvalues, iterations = newton(x0, t0, count, magnitude)
这是因为初始猜测与最佳点非常接近,还是我的算法中存在一些我没有发现的错误?任何建议将不胜感激。看起来解甚至可能是振荡的,但很难说
慕的地10843
相关分类