Преодоление сингулярности при попытке решить линейную систему - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь решить штрафную функцию, используя алгоритм метода Ньютона. Он использует гессиан и транспонированный градиент для решения линейной системы, которая даст мне приблизительные значения.

Проблема с моим кодом начинается с десятой итерации (но она может варьироваться в зависимости от первоначального предположения, которое я называю '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, чтобы найти числовые гессианы и градиенты. Также исправлены некоторые опечатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...