On Tue, Dec 21, 2010 at 11:39:31AM -0800, casperyc wrote:
> 
> Hi all,
> 
> I am writing a simple function to implement regularfalsi (secant) method.
> 
> ###################################################
> regulafalsi=function(f,x0,x1){
>       x=c()
>       x[1]=x1
>       i=1
>       while ( f(x[i])!=0 ) {
>               i=i+1
>               if (i==2) {
>                       x[2]=x[1]-f(x[1])*(x[1]-x0)/(f(x[1])-f(x0))
>               } else {
>                       
> x[i]=x[i-1]-f(x[i-1])*(x[i-1]-x[i-2])/(f(x[i-1])-f(x[i-2]))
>               }
>       }
>       x[i]
> }
> ###################################################
> 
> These work fine,
> regulafalsi(function(x) x^(1/2)+3*log(x)-5,1,10)
> regulafalsi(function(x) x^(1/2)+3*log(x)-5,10,1)
> 
> For all x>0, the function is strictly increasing.
> 
> Then
> 
> regulafalsi(function(x) x^(1/2)+3*log(x)-5,1,100)
> 
> Error in while (f(x[i]) != 0) { : missing value where TRUE/FALSE needed
> In addition: Warning message:
> In log(x) : NaNs produced
> 
> I dont know what happened there, is there a way to find the value for
> f(x[i])
> that R can't determine TRUE/FALSE?

The previous replies imply that at some point, your code evaluates the
function outside the required interval. The reason for this may be seen
using graphics. If you add plot commands to your code, for example

  regulafalsi=function(f,x0,x1){
          z <- seq(x0, x1, lenth=1000)
          plot(z, f(z), type="l")
          abline(h=0)
          x=c()
          x[1]=x1
          i=1
          while ( f(x[i])!=0 ) {
                  i=i+1
                  if (i==2) {
                          x[2]=x[1]-f(x[1])*(x[1]-x0)/(f(x[1])-f(x0))
                          lines(c(x0, x[i-1]), c(f(x0), f(x[i-1])), col=2)
                  } else {
                          
x[i]=x[i-1]-f(x[i-1])*(x[i-1]-x[i-2])/(f(x[i-1])-f(x[i-2]))
                          lines(c(x[i-2], x[i-1]), c(f(x[i-2]), f(x[i-1])), 
col=2)
                  }
                  points(x[i], 0)
                  aux <- readline("press Enter to continue")
          }
          x[i]
  }
  regulafalsi(function(x) x^(1/2)+3*log(x)-5,1,10)
  regulafalsi(function(x) x^(1/2)+3*log(x)-5,1,100)

then it may be seen that for [1, 10], we get convergence, while for [1, 100]
the secant line in the second iteration does not intersect x-axis inside the
required interval.

Petr Savicky.

______________________________________________
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