Roslina Zakaria wrote:
> 
> newton.inputsingle <- function(pars,n)
> {  runi    <- runif(974, min=0, max=1)
>    lendt   <- length(runi)
>    ## Parameter to estimate
>    z <- vector(length=lendt, mode= "numeric")
>    z  <- pars[1]
>    
>    ## Constant value  
>    
>    alp  <- 2.0165 ; rho <- 0.868; 
>    c    <- sqrt(pi)/(gamma(alp)*(1-rho)^alp)
>    
>    for (i in 1:n)
>    {  t1   <- exp(-pars[1]/(1-rho))                       
>       t2   <- (pars[1]*(1-rho)/(2*sqrt(rho)))^(alp-0.5)   
>       bes1 <- besselI(pars[1]*sqrt(rho)/(1-rho),alp-0.5)  
>       bes2 <- besselI(pars[1]*sqrt(rho)/(1-rho),alp-1.5)
>       bes3 <- besselI(pars[1]*sqrt(rho)/(1-rho),alp+0.5)
>  
>    ## Equation
>       f   <- c*t1*t2*bes1 - runi
>    
>    ## derivative
>       fprime   <- c*t1*t2*( -bes1/(1-rho) + (alp-0.5)*bes1/pars[1] +
> sqrt(rho)*(bes2-bes3)/(2*(1-rho)))
>       z[i+1] <- z[i] - f/fprime 
>       }
>       z
> }
>  
> pars <- 0.5          
> newton.inputsingle(pars,5)
>  
> The output :
>  
>> pars <- 0.5          
>> newton.inputsingle(pars,5)
> [1]  0.5000000 -0.4826946 -1.4653892 -2.4480838 -3.4307784 -4.4134730
> Warning messages:
> 1: In z[i + 1] <- z[i] - f/fprime :
>   number of items to replace is not a multiple of replacement length
> 

The warning message is the result of assigning a vector (f/fprime) to a
scalar.
You are also redefining an R built-in function: c

Furthermore it is unclear what you are trying to do.

I would advise: Keep It Simple and Stupid (KISS).
To help you along I have lifted the relevant function out of your
newton.inputsingle
(or at least what I think your function is)

zztest <- function(x) {
   ## Constant value
    alp  <- 2.0165 ; rho <- 0.868;
    czz  <- sqrt(pi)/(gamma(alp)*(1-rho)^alp)

    t1   <- exp(-x/(1-rho))
    t2   <- (x*(1-rho)/(2*sqrt(rho)))^(alp-0.5)
    bes1 <- besselI(x*sqrt(rho)/(1-rho),alp-0.5)
    bes2 <- besselI(x*sqrt(rho)/(1-rho),alp-1.5)
    bes3 <- besselI(x*sqrt(rho)/(1-rho),alp+0.5)

   ## Equation
    f   <- czz*t1*t2*bes1 - .1
}

pars <- 0.5
zztest(pars)
plot(zztest,0,10)
abline(0,0,lty=2)
uniroot(zztest, c(0,2))
uniroot(zztest, c(4,8))

The plot indicates how your function behaves.
The two uniroot calls solve for the two roots that appear in the plot.
You should be able to proceed on your own from here.
BTW: I do hope that this not homework.

good luck

Berend

-- 
View this message in context: 
http://n4.nabble.com/newton-method-for-single-nonlinear-equation-tp1289991p1310861.html
Sent from the R help mailing list archive at Nabble.com.

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to