我正在尝试使用牛顿法算法求解罚函数。它使用粗麻布和转置梯度来求解线性系统,该线性系统将为我提供近似值。
我的代码的问题始于第十次迭代(但它可能会因初始猜测而异,我称之为“斜道”),因为粗麻布实际上是一个奇异矩阵。在这种情况下应该怎么办?我的算法有问题吗?
我实际上并没有粘贴要优化的功能,因为它非常广泛,但是如果有其他要求,我会做。
我尝试了不同的函数,但是我从算法中获得的唯一正确答案是函数F(x,y)= x ^ 2 + y ^ 2。 (x,y)=(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(hessian,gradient.transposed)中的错误: 求解中的奇异矩阵“ a””
非常感谢您的关注和未来的答复。
编辑:我正在使用rootSolve
包来查找数字粗麻布和渐变。还修正了一些错字。