Ошибка R-несоответствующих аргументов при использовании uni root .all для rootSolve - PullRequest
0 голосов
/ 09 апреля 2020

В 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 не выявляет ошибок (я также дважды и трижды проверил размеры рассматриваемой операции). Итак, я ценю любую помощь, чтобы выяснить, в чем проблема.

...