[R] vecortizing uniroot() for numerical solutions

Daniel E. Bunker deb37 at columbia.edu
Thu Jun 30 21:21:42 CEST 2005


#    Hi All,
#   
#    I need to solve a somewhat complex equation at many parameter 
values for
#    a number of different parameters.
#    A simplified version of the equation is: 0= (d1/(h1^2))-(h2*(d2^2))
#    I'd like to solve it across a parameter space of d1 and d2, holding
#    h1 and h2 constant.

#     It seems that uniroot() can do it, but I don't see how to 
vectorize it.

#    This works just fine:

R12 = function(d1, d2, h1, h2) (d1/(h1^2))-(h2*(d2^2))
uniroot(R12, interval=c(-100,100), tol=0.0001, d2=1, h1=1, h2=1)

#    but to explore the entire parameter space it seems I would need a 
series of loops

R12 = function(d1, d2, h1, h2) (d1/(h1^2))-(h2*(d2^2))
df1=data.frame(h1=numeric(0), h2=numeric(0),d1=numeric(0),d2=numeric(0))
h1=1
h2=1
for(i in 1:5) {
    output=uniroot(R12, interval=c(-100,100), tol=0.0001, d2=i, h1=1, h2=1)
    d2=i
    df1[i,"h1"]=h1
    df1[i,"h2"]=h2
    df1[i,"d2"]=i
    df1[i,3]=output$root
    }
df1

#    what I'd really like to do is something like:

R12 = function(d1, d2, h1, h2) (d1/(h1^2))-(h2*(d2^2))
uniroot(R12, interval=c(-100,100), tol=0.0001, d2=c(1:5), h1=c(1:5), 
h2=c(1:5))

#    but R rejects the multiple values for d2.

#    I could use a numerical solver such as XPPAUT, but would rather be 
able to do it all in R.

#    Any thoughts on vectorizing this would be greatly appreciated.


#    Thanks!  -Dan

-- 

Daniel E. Bunker
Associate Coordinator - BioMERGE
Post-Doctoral Research Scientist
Columbia University
Department of Ecology, Evolution and Environmental Biology
1020 Schermerhorn Extension
1200 Amsterdam Avenue
New York, NY 10027-5557

212-854-9881
212-854-8188 fax
deb37ATcolumbiaDOTedu




More information about the R-help mailing list