[R] help about solving two equations
Berend Hasselman
bhh at xs4all.nl
Sat Mar 13 09:53:31 CET 2010
Ravi Varadhan wrote:
>
> require(BB)
>
> fn <- function(x, s){
> f <- rep(NA, length(x))
> f[1] <- digamma(x[1]) - digamma(x[1]+x[2]) - s[1]
> f[2] <- digamma(x[2]) - digamma(x[1]+x[2]) - s[2]
> f
> }
>
> nr <- 10
> smat <- matrix(runif(2*nr, -3, -1), nr, 2)
> soln <- matrix(NA, nr, 2)
>
> for (i in 1:nr) {
> ans <- dfsane(par=c(1,1), fn=fn, s=smat[i, ], control=list(trace=FALSE))
> soln[i, ] <- ans$par
> }
>
> soln # your solution
>
As I mentioned in a previous post to the original question, it is necessary
to record if an algorithm actually found a solution. I would also advise you
to try an alternative to BB; it's a bit quicker in your case and seems to
fail less frequently.
Like this:
library(nleqslv)
library(BB)
fn <- function(x, s){
f <- rep(NA, length(x))
f[1] <- digamma(x[1]) - digamma(x[1]+x[2]) - s[1]
f[2] <- digamma(x[2]) - digamma(x[1]+x[2]) - s[2]
f
}
s <- c(-2,-4)
xstart <- c(1,1)
Krep <- 100
smat <- matrix(runif(2*Krep, -3, -1), Krep, 2)
sobb <- matrix(NA, Krep, 2)
sonl <- matrix(NA, Krep, 2)
system.time( {
noncvg <- 0
for(k in seq(Krep)) {
ans <- nleqslv(xstart,fn, s=smat[k,],method="Newton")
if(ans$termcd>1){noncvg<-noncvg+1;sonl[k,] <- c(NA,NA)} else sonl[k,]
<- ans$x
}
msg <- sprintf("Non convergence %d ==> %.2f%%\n", noncvg,
noncvg/Krep*100)
print(msg)
})
system.time( {
noncvg <- 0
for(k in seq(Krep)) {
ans <- dfsane(par=xstart, fn=fn,
s=smat[k,],control=list(trace=FALSE))
if(ans$convergence>0){noncvg<-noncvg+1;sobb[k,] <- c(NA,NA)} else
sobb[k,] <- ans$par
}
msg <- sprintf("Non convergence %d ==> %.2f%%\n", noncvg,
noncvg/Krep*100)
print(msg)
})
sonl
sobb
Berend
--
View this message in context: http://n4.nabble.com/help-about-solving-two-equations-tp1588313p1591524.html
Sent from the R help mailing list archive at Nabble.com.
More information about the R-help
mailing list