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