Я пытаюсь решить штрафную функцию, используя алгоритм метода Ньютона. Он использует гессиан и транспонированный градиент для решения линейной системы, которая даст мне приблизительные значения.
Проблема с моим кодом начинается с десятой итерации (но она может варьироваться в зависимости от первоначального предположения, которое я называю 'chute'), потому что гессиан оказывается единственной матрицей. Что нужно сделать в этом случае? Есть ли проблема с моим алгоритмом?
На самом деле я не вставляю оптимизируемую функцию, потому что она очень обширная, но, если потребуется, я сделаю это.
Я пробовал разные функции, но единственный правильный ответ, который я получил из алгоритма, был для функции F (x, y) = x ^ 2 + y ^ 2. (х, у) = (0,0).
for(i in 1:n){
hessian <- hessian(f = f, x = chute, centered = TRUE)
gradient.transposed <- -1 * t(gradient(f = f, x = chute))
# solving the linear system
sk <- qr.solve(hessian, gradient.transposed)
xk.1 <- xk + sk
k[[i]] <- xk.1
# calculating a test to verify the solution
first.test <- (norm(xk - xk.1) < epsilon * (1 + norm(xk)))
g[[i]] <- first.test
if(first.test == TRUE){
# calculating a test to verify the solution
second.test <- (norm(gradient.transposed) <= delta * (1 + abs(f(xk))))
h[[i]] <- second.test
if(second.test == TRUE){
root.approx <- tail(k)[[1]]
res <- list('aprox' = root.approx, 'iter' = k)
return(res)
}
}
xk <- xk.1
chute <- c(xk.1)
}
Сообщение об ошибке, которое я пытаюсь пройти через определенные итерации:
"Ошибка в qr.solve (гессиан, градиент. Транспонирован):
Сингулярная матрица «а» в решении "
Большое спасибо за внимание и будущие ответы.
Редактировать: я использую пакет rootSolve
, чтобы найти числовые гессианы и градиенты. Также исправлены некоторые опечатки.