Я пытаюсь использовать алгоритм SLSQP в R, однако я не могу передать дополнительные аргументы в функцию 'constraint'.Он принимает эти аргументы для целевой функции, но выдает ошибку, когда они передаются функции «ограничения».Я не понимаю, почему и как это исправить?
Настройка функции браузера в разных точках.Кроме того, он, похоже, не попадает внутрь функции, которая вычисляет градиент "gr_obj_fn".
#objective function
obj_fn <- function(theta,dvec,Dmat,H)
{
browser()
theta_mat <- rbind(theta[1],theta[2],theta[3])
#as.numeric((0.5)*t(theta_mat)%*%t(Dmat)%*%theta_mat - t(dvec)%*%theta_mat)
return(as.numeric((0.5)*t(theta_mat)%*%t(Dmat)%*%theta_mat - t(dvec)%*%theta_mat))
}
#constraint function
constr <- function(theta,dvec,Dmat,H)
{
browser()
theta_mat <- rbind(theta[1],theta[2],theta[3])
return(as.numeric(0.66 - mean(plogis(H%*%theta_mat))))
}
#gradient of the objective function
gr_obj_fn <- function(theta,dvec,Dmat,H)
{
browser()
theta_mat <- rbind(theta[1],theta[2],theta[3])
#as.numeric(diag(Dmat)%*%theta_mat - t(dvec))
return(as.numeric(diag(Dmat)%*%theta_mat - t(dvec)))
}
#jacobian of the constraint function
jac_constr <- function(theta,dvec,Dmat,H)
{
theta_mat <- rbind(theta[1],theta[2],theta[3])
J <- cbind((1/nrow(H))*sum(dlogis(H%*%theta_mat)),(1/nrow(H))*t(H[,2])%*%dlogis(H%*%theta_mat),(1/nrow(H))*t((H[,3])^2)%*%dlogis(H%*%theta_mat))
return(as.numeric(J))
}
#SQLSQP
opt <- slsqp(x0=c(-1,0,0), fn=obj_fn, gr= gr_obj_fn, lower = c(-10,0,0), upper = rep(100, 3), hin = NULL, hinjac = NULL,
heq = constr, heqjac = jac_constr, nl.info = FALSE, control =list(stopval = -Inf,
xtol_rel = 1e-9, maxeval = 100000),dvec=dvec, Dmat=Dmat, H=H)
Я ожидаю, что дополнительные аргументы в SLSQP, которые являются dvec, Dmat и H, будут переданы всем функциям - obj_fn, gr_obj_fn, const и jac_constr.Они передаются в obj_fn, но не в const.
Это ошибка, которую я получаю -
Ошибка в журнале (H% *% theta_mat): отсутствует аргумент "H" без значения по умолчанию
Кроме того, браузерне показывает, что код идет внутри функции 'gr_obj_fn'