Hi Ravi,
I would like come back to your offer. I have a problem which possibly is
caused by a bug or by something I don't understand:
My function to be minimised is executed even when an element in hin() is
negative.
My hin looks as follow:
--8<---------------cut here---------------start------------->8---
hinMahat <- function(x, hauteur, na, zjoint, y, LAI, ...) {
if (x[1] < 0) {
cat(names(list(...)), "\n")
cat(..., "\n")
cat(x, "|", hauteur, LAI, y, "\n")
}
h <- rep(NA, 8)
if (!missing(na)) {
x <- c(na, x )
}
if (!missing(y)) {
x <- c(x, y)
}
if (!missing(zjoint)) {
x <- c(x[1], zjoint, x[2])
}
##
dep <- hauteur * (0.05 + LAI^0.02 / 2) + (x[3] - 1)/20
h[1] <- dep
h[2] <- hauteur - dep
## if (h[2]==0) {
## h[2] <- -1
## }
##
z0 <- hauteur * (0.23 + LAI^0.25 / 10) + (x[3] - 1)/67
h[3] <- z0
## if (h[3]==0) {
## h[3] <- -1
## }
h[4] <- hauteur - z0
##
h[5] <- x[1]
##
h[6] <- x[2]
h[7] <- hauteur - x[2]
##
h[8] <- hauteur - dep - z0
if (any(h<=0)) {
cat(h, "\n")
cat("\n")
}
return(h)
}
--8<---------------cut here---------------end--------------->8---
the x contains up to three elements: c(na=, zjoint=, y=) and I fit these
three, unless one or two are specified explicitely.
The values going into hin are:
,----
| ... (z u ua za z0sol )
| 3 11 17 23 29 37 0.315 0.422 0.458 0.556 1.567 1.747 1.747 37 0.001
|
| x(na, zjoint): -8.875735 24.51316
| hauteur: 28
| na: 8.1
| y: 3
|
| the resulting hin() is:
| 16.09815 11.90185 11.19352 16.80648 -8.875735 24.51316 3.486843 0.708335
`----
Which is negative in element 5 as x[2]=na is negative.
So I would expect that the function fn is not evaluated. But it is, and
raises an error:
,----
| Error in wpLELMahat(z = z, ua = ua, na = ifelse(missing(na), par[1], na), :
| na has to be larger or equal than zero!
`----
Is this a misunderstanding on my part, or is it an error in the function
auglag?
Below is the function which is doing the minimisation.
If I replace auglag() with constrOptim.nl(), the optimisation is working
as expected.
So I think this is a bug in auglag?
Let me know if you need further information.
Cheers,
Rainer
--8<---------------cut here---------------start------------->8---
fitAuglag.wpLEL.mahat.single <- function(
z,
u,
LAI,
initial = c(na=9, zjoint=0.2*2, y=3),
na, zjoint, y,
h = 28,
za = 37,
z0sol = 0.001,
hin,
...
) {
if (missing(hin)) {
hin <- hinMahat
}
wpLELMin <- function(par, na, zjoint, y, z, u, ua, hauteur, za, z0sol, LAI) {
result <- NA
try({
p <- wpLELMahat(
z = z,
ua = ua,
na = ifelse(missing(na), par[1], na),
zjoint = ifelse(missing(zjoint), par[2], zjoint),
h = hauteur,
za = za,
z0sol = z0sol,
LAI = LAI,
y = ifelse(missing(y), par[3], y)
)
result <- sum( ( (p$u - u)^2 ) / length(u) )
},
silent = FALSE
)
## cat("From wpLELMin", par, "\n")
return( result )
}
ua <- u[length(u)]
result <- list()
result$method <- "fitAuglag.wpLEL.mahat.single"
result$initial <- initial
result$dot <- list(...)
result$z <- z
result$u <- u
result$fit <- auglag(
par = initial,
fn = wpLELMin,
hin = hin,
na = na,
zjoint = zjoint,
y = y,
##
z = z,
u = u,
ua = ua,
hauteur = h,
za = za,
z0sol = z0sol,
LAI = LAI,
...
)
result$wp <- wpLELMahat(
z = z,
ua = ua,
na = ifelse ( missing(na), result$fit$par["na"], na),
zjoint = ifelse ( missing(zjoint), result$fit$par["zjoint"], zjoint),
h = h,
za = za,
z0sol = z0sol,
LAI = LAI,
y = ifelse ( missing(y), result$fit$par["y"], y)
)
class(result) <- c(class(result), "wpLELFit")
return(result)
}
#+end_src--8<---------------cut here---------------end--------------->8---