В R я написал функцию rootfn_dimRet1
, которую затем передаю uniroot.all()
из пакета rootSolve. Моя функция rootfn_dimRet1
отлично работает, когда запускается сама. Тем не менее, когда я передаю его в функцию uniroot.all()
, я получаю ошибку «несоответствующие аргументы». Представ:
Во-первых, моя функция:
rootfn_dimRet1 <- function(k, nab_decRet, eigvals, Rtarg, Ctarg){
u_vec <- as.numeric(eigvals)
mu_vec <- as.numeric(nab_decRet)
theta_vec <- acos(3 * sqrt(3) * u_vec * sqrt(k / mu_vec^3))
rho_vec <- 2 / sqrt(3) * (diag(sqrt(mu_vec)) %*% as.matrix(cos(theta_vec / 3)))
ones_vec <- rep(1, length(u_vec))
rho_C <- as.numeric(t(ones_vec) %*% rho_vec)
r <- (Ctarg / rho_C)^2
wStar <- sqrt(r) * rho_vec
lR <- as.numeric(-t(mu_vec) %*% wStar^-1)
lR_slack <- log(Rtarg) - lR
return(lR_slack)
}
Теперь обратите внимание, что когда я запускаю функцию root сама по себе, она работает нормально, без "неконформируемых аргументов" ошибка:
k_lobound <- 0
nab_decRet <- c(0.285722097, 0.180731978, 0.153446319, 0.017926719, 0.002276443, 0.077438859)
eigvals <- c(4.902779e-04, 1.387980e-04, 8.627054e-05, 6.683328e-05, 3.233686e-05, 2.617442e-05)
k_upbound <- min(nab_decRet^3 / (27 * eigvals^2))
k_interval <- c(k_lobound, k_upbound)
Rtarg <- 0.01
Ctarg <- 1
kseq <- seq(k_lobound, k_upbound, length.out = 15)
for(i in 1:length(kseq)){
k <- kseq[i]
out_slack <- rootfn_dimRet1(k, nab_decRet, eigvals, Rtarg, Ctarg)
print(out_slack)
}
Однако, когда я запускаю его в uniroot.all()
, он выдает ошибку «неконформируемые аргументы» в операции sqrt(mu_vec)) %*% as.matrix(cos(theta_vec/3)
.
rootSolve::uniroot.all(rootfn_dimRet1, k_interval, lower = min(k_interval), upper = max(k_interval), nab_decRet = nab_decRet, eigvals = eigvals, Rtarg = Rtarg, Ctarg = Ctarg)
Так как В самой функции rootfn_dimRet1
нет ошибок, я не знаю, как отладить эту строку построчно. Т.е. построчная отладка rootfn_dimRet1
не выявляет ошибок (я также дважды и трижды проверил размеры рассматриваемой операции). Итак, я ценю любую помощь, чтобы выяснить, в чем проблема.