pd_check.RdWe desire that Hessian matrices of objective functions for optimization are symmetric and positive definite. Symmetry is easy to check, but we caution that evaluation or approximation of a Hessian often gives a slightly asymmetric, and we commonly average the elements that are supposed to be equal, thereby symmetrizing the proposed Hessian.
The Cholesky decomposition will fail for a symmetric matrix which is NOT positive definite.
pd_check(A, pivot=TRUE, tol=1.e-07)The function returns a logical TRUE if the decomposition can be carried out, FALSE otherwise.
n <- 10
A <- pracma::moler(n)
system.time(print(pd_check(A))) # returns FALSE
#> [1] TRUE
#> user system elapsed
#> 0 0 0
system.time(print(eigen(A)$value))
#> [1] 3.158981e+01 5.506463e+00 3.375284e+00 2.770820e+00 2.517158e+00
#> [6] 2.388872e+00 2.317702e+00 2.277391e+00 2.256491e+00 8.582807e-06
#> user system elapsed
#> 0.003 0.004 0.007
n <- 100
A <- pracma::moler(n)
system.time(print(pd_check(A))) # returns FALSE
#> [1] FALSE
#> user system elapsed
#> 0 0 0
system.time(print(eigen(A)$value))
#> [1] 3.934277e+03 4.390118e+02 1.593905e+02 8.235182e+01 5.064857e+01
#> [6] 3.460032e+01 2.537008e+01 1.957885e+01 1.570838e+01 1.299440e+01
#> [11] 1.101813e+01 9.534543e+00 8.392479e+00 7.494608e+00 6.775954e+00
#> [16] 6.191801e+00 5.710558e+00 5.309393e+00 4.971474e+00 4.684171e+00
#> [21] 4.437857e+00 4.225092e+00 4.040049e+00 3.878115e+00 3.735601e+00
#> [26] 3.609523e+00 3.497451e+00 3.397389e+00 3.307685e+00 3.226960e+00
#> [31] 3.154060e+00 3.088010e+00 3.027981e+00 2.973268e+00 2.923267e+00
#> [36] 2.877455e+00 2.835383e+00 2.796659e+00 2.760941e+00 2.727931e+00
#> [41] 2.697366e+00 2.669016e+00 2.642676e+00 2.618166e+00 2.595324e+00
#> [46] 2.574007e+00 2.554087e+00 2.535449e+00 2.517991e+00 2.501619e+00
#> [51] 2.486250e+00 2.471808e+00 2.458225e+00 2.445439e+00 2.433393e+00
#> [56] 2.422037e+00 2.411323e+00 2.401209e+00 2.391656e+00 2.382628e+00
#> [61] 2.374093e+00 2.366019e+00 2.358381e+00 2.351151e+00 2.344307e+00
#> [66] 2.337828e+00 2.331693e+00 2.325883e+00 2.320382e+00 2.315175e+00
#> [71] 2.310246e+00 2.305582e+00 2.301171e+00 2.297000e+00 2.293060e+00
#> [76] 2.289340e+00 2.285832e+00 2.282526e+00 2.279414e+00 2.276490e+00
#> [81] 2.273747e+00 2.271178e+00 2.268777e+00 2.266540e+00 2.264460e+00
#> [86] 2.262535e+00 2.260759e+00 2.259129e+00 2.257641e+00 2.256293e+00
#> [91] 2.255081e+00 2.254003e+00 2.253057e+00 2.252241e+00 2.251554e+00
#> [96] 2.250993e+00 2.250558e+00 2.250248e+00 2.250062e+00 6.238619e-14
#> user system elapsed
#> 0.003 0.020 0.016