bisection <- function(ftn, x.l, x.r, tol = 1e-9) {
  #bisection algorithm for solving ftn(x) == 0
  #x.l and a.r are the first and last ponts of interval
  
  #check point
  if (x.l >= x.r) {
    cat("error: x.l >= x.r \n")
    return(NULL)
  }
  f.l <- ftn(x.l)
  f.r <- ftn(x.r)
  if (f.l == 0) {
    return(x.l)
  } else if (f.r == 0) {
    return(x.r)
  } else if (f.l * f.r > 0) {
    cat("error: ftn(x.l) * ftn(x.r) > 0 \n")
    return(NULL)
  } 
  
  #refine x.l and x.r
  n <- 0
  while ((x.r - x.l) > tol) {
    x.m <- (x.l + x.r)/2
    f.m <- ftn(x.m)
    if (f.m == 0) {
      return(x.m)
    } else if (f.l * f.m < 0) {
      x.r <- x.m
      f.r <- f.m
    } else {
      x.l <- x.m
      f.l <- f.m
    }
    
    n <- n + 1
    cat("dar iteration", n, "rishe beyne", x.l, "va", x.r, "\n")
  }
  
  #output
  return((x.l + x.r)/2)
  
}