e04yb {NAGFWrappers} | R Documentation |
e04yb checks that a user-supplied function for evaluating the second derivative term of the Hessian matrix of a sum of squares is consistent with a user-supplied function for calculating the corresponding first derivatives.
e04yb(m, lsqfun, lsqhes, x, lb, iw, w, n = nrow(x))
m |
integer |
lsqfun |
function lsqfun must calculate the vector of values f_i(x) and their first derivatives ( \partial f_i)/( \partial x_j) at any point x. (e04he gives you the option of resetting arguments of lsqfun to cause the minimization process to terminate immediately. e04yb will also terminate immediately, without finishing the checking process, if the argument in question is reset.)
|
lsqhes |
function lsqhes must calculate the elements of the symmetric matrix B(x) = ∑_i = 1^mf_i(x)G_i(x), at any point x, where G_i(x) is the Hessian matrix of f_i(x). (As with lsqfun, a argument can be set to cause immediate termination.)
|
x |
double array x[j]for j=1 . . . n, must be set to the coordinates of a suitable point at which to check the b_jk calculated by lsqhes. ‘Obvious’ settings, such as 0 or 1, should not be used since, at such particular points, incorrect terms may take correct values (particularly zero), so that errors could go undetected. For a similar reason, it is preferable that no two elements of x should have the same value. |
lb |
integer |
iw |
integer array This array appears in the argument list purely so that, if e04yb is called by another library function, the library function can pass quantities to functions lsqfun and lsqhes via iw. iw is not examined or changed by e04yb. In general you must provide an array iw, but are advised not to use it. |
integer array
This array appears in the argument list purely so that, if e04yb is called by another library function, the library function can pass quantities to functions lsqfun and lsqhes via iw. iw is not examined or changed by e04yb. In general you must provide an array iw, but are advised not to use it.
w |
double array The actual length of w as declared in the function from which e04yb is called. |
double array
The actual length of w as declared in the function from which e04yb is called.
n |
integer: default = nrow(x) The number m of residuals, f_i(x), and the number n of variables, x_j. |
R interface to the NAG Fortran routine E04YBF.
FVEC |
double array Unless you set iflag negative in the first call of lsqfun, fvec[i] contains the value of f_i at the point supplied by you in x for i=1 . . . m. |
FJAC |
double array Unless you set iflag negative in the first call of lsqfun, fjac[i, j] contains the value of the first derivative ( \partial f_i)/( \partial x_j) at the point given in x, as calculated by lsqfun for j=1 . . . n for i=1 . . . m. |
B |
double array Unless you set iflag negative in lsqhes, b[j\times(j - 1)/2+k] contains the value of b_jk at the point given in x as calculated by lsqhes for k=1 . . . j for j=1 . . . n. |
IW |
integer array This array appears in the argument list purely so that, if e04yb is called by another library function, the library function can pass quantities to functions lsqfun and lsqhes via iw. iw is not examined or changed by e04yb. In general you must provide an array iw, but are advised not to use it. |
integer array
This array appears in the argument list purely so that, if e04yb is called by another library function, the library function can pass quantities to functions lsqfun and lsqhes via iw. iw is not examined or changed by e04yb. In general you must provide an array iw, but are advised not to use it.
W |
double array |
double array
IFAIL |
integer ifail =0unless the function detects an error or a warning has been flagged (see the Errors section in Fortran library documentation). |
NAG
http://www.nag.co.uk/numeric/FL/nagdoc_fl23/pdf/E04/e04ybf.pdf
ifail <- 0 lsqfun = function(iflag, m, n, xc, ljc) { fvec <- as.matrix(mat.or.vec(m, 1)) fjacc <- as.matrix(mat.or.vec(ljc, n)) for (i in c(1:m)) { denom <- xc[2] %*% t[i, 2] + xc[3] %*% t[i, 3] fvec[i] <- xc[1] + t[i, 1]/denom - y[i] if (iflag != 0) { fjacc[i, 1] <- 1 dummy <- -1/(denom %*% denom) fjacc[i, 2] <- t[i, 1] %*% t[i, 2] %*% dummy fjacc[i, 3] <- t[i, 1] %*% t[i, 3] %*% dummy } } list(IFLAG = as.integer(iflag), FVEC = as.matrix(fvec), FJAC = as.matrix(fjacc)) } lsqhes = function(iflag, m, n, fvec, xc, lb) { b <- as.matrix(mat.or.vec(lb, 1)) sum22 <- 0 sum32 <- 0 sum33 <- 0 for (i in c(1:m)) { dummy <- 2 %*% t[i, 1]/(xc[2] %*% t[i, 2] + xc[3] %*% t[i, 3])^3 sum22 <- sum22 + fvec[i] %*% dummy %*% t[i, 2]^2 sum32 <- sum32 + fvec[i] %*% dummy %*% t[i, 2] %*% t[i, 3] sum33 <- sum33 + fvec[i] %*% dummy %*% t[i, 3]^2 } b[3] <- sum22 b[5] <- sum32 b[6] <- sum33 list(IFLAG = as.integer(iflag), B = as.matrix(b)) } m <- 15 x <- matrix(c(0.19, -1.34, 0.88), nrow = 3, ncol = 1, byrow = TRUE) lb <- 6 iw <- as.matrix(mat.or.vec(1, 1)) w <- as.matrix(mat.or.vec(78, 1)) y <- matrix(c(0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, 0.96, 1.34, 2.1, 4.39), nrow = 1, ncol = 15, byrow = TRUE) t <- matrix(c(1, 15, 1, 2, 14, 2, 3, 13, 3, 4, 12, 4, 5, 11, 5, 6, 10, 6, 7, 9, 7, 8, 8, 8, 9, 7, 7, 10, 6, 6, 11, 5, 5, 12, 4, 4, 13, 3, 3, 14, 2, 2, 15, 1, 1), nrow = 15, ncol = 3, byrow = TRUE) e04yb(m, lsqfun, lsqhes, x, lb, iw, w)