1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 from LinearAlgebra import eigenvectors, inverse
25 from Numeric import matrixmultiply, sort
26
27
28 -def eigenvalue(dfk, d2fk, I, print_prefix, print_flag, return_matrix=0):
29 """The eigenvalue Hessian modification.
30
31 This modification is based on equation 6.14 from page 144 of 'Numerical Optimization' by
32 Jorge Nocedal and Stephen J. Wright, 1999, 2nd ed.
33
34 Returns the modified Newton step.
35 """
36
37
38 eigen = eigenvectors(d2fk)
39 eigenvals = sort(eigen[0])
40
41
42 tau = None
43 if eigenvals[0] < 0.0:
44 tau = max(0.0, 1e-2 - eigenvals[0])
45 matrix = d2fk + tau * I
46 else:
47 matrix = d2fk
48
49
50 if print_flag >= 3:
51 eigen_new = eigenvectors(matrix)
52 eigenvals_new = sort(eigen_new[0])
53 print print_prefix + "d2fk:\n" + `d2fk`
54 print print_prefix + "eigenvals(d2fk): " + `eigenvals`
55 print print_prefix + "tau: " + `tau`
56 print print_prefix + "matrix:\n" + `matrix`
57 print print_prefix + "eigenvals(matrix): " + `eigenvals_new`
58 print print_prefix + "Newton dir: " + `-matrixmultiply(inverse(matrix), dfk)`
59
60
61 if return_matrix:
62 return -matrixmultiply(inverse(matrix), dfk), matrix
63 else:
64 return -matrixmultiply(inverse(matrix), dfk)
65