<p>所以我终于弄明白这是怎么回事了。这完全是关于Python将我的变量存储为什么样的数据结构。因此,我将所有值设置为'float32',并初始化正在迭代的变量。工作代码如下:</p>
<h2>注意:lambda函数是对单行表达式有用的匿名函数</h2>
<pre><code>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]))], dtype='float32')
dfx11 = lambda x: -400*(x[1])+1200*np.square(x[0])+2
dfx12 = lambda x: -400*x[0]
dfx21 = lambda x: -400*x[0]
dfx22 = lambda x: 200
hessian = lambda x: np.array([[dfx11(x), dfx12(x)], [dfx21(x), dfx22(x)]], dtype='float32')
inv_hessian = lambda x: inv(hessian(x))
mag = lambda x: math.sqrt(sum(i**2 for i in x))
def newton(x, t, count, magnitude):
xvalues=[]
gradvalues=[]
fvalues=[]
temp = np.zeros((2,1))
while magnitude > .000005:
xvalues.append(x)
gradvalues.append(dfx(x))
fvalues.append(f(x))
deltaX = np.array(np.dot(-inv_hessian(x), dfx(x)))
temp = np.array(x+t*deltaX)
x = temp
magnitude = mag(deltaX)
count+=1
return xvalues, gradvalues, fvalues, count
x0, t0, alpha, beta, count = np.array([[-1.1], [1.1]]), 1, .15, .7, 1
xvalues, gradvalues, fvalues, iterations = newton(x0, t0, count, magnitude)
final_value = print('Final set of x values: ', xvalues[-1])
final_grad = print('Final gradient values: ', gradvalues[-1])
final_f = print('Final value of the object function with optimized inputs: ', fvalues[-1])
final_grad_mag = print('Final magnitude of the gradient with optimized inputs: ', mag(np.array([dfx1(xvalues[-1]), dfx2(xvalues[-1])])))
total_iterations = print('Total iterations: ', iterations
print(xvalues)
</code></pre>
<p>输出:</p>
<pre><code>Final set of x values: [[0.99999995]
[0.99999987]]
Final gradient values: [[ 9.1299416e-06]
[-4.6193604e-06]]
Final value of the object function with optimized inputs: [5.63044182e-14]
Final magnitude of the gradient with optimized inputs: 1.02320249276675e-05
Total iterations: 9
[array([[-1.1],
[ 1.1]]), array([[-1.00869558],
[ 1.00913081]]), array([[-0.25557778],
[-0.50186648]]), array([[-0.24460602],
[ 0.05971173]]), array([[ 0.97073805],
[-0.53472879]]), array([[0.97083687],
[0.94252417]]), array([[0.99999957],
[0.99914868]]), array([[0.99999995],
[0.99999987]])]
</code></pre>