Newton-Raphson根查找方法的Python OverflowError

时间:2015-10-15 17:26:53

标签: python overflow root

x=float(raw_input('Enter a number to show its square root'))
precise = 0.01
g=x/2.0
while abs(g**2-x)>=precise:
   g=g-(g**2-x)/2*g
print g

这是一个基于Newton-Raphson Root Finding方法的python代码。当我在Canopy中运行时,我可以找到1的根。但是当我输入25来查找根时,它会指出OverflowError: (34, 'Result too large') 指向while abs(g**2-x)>=precise:行。帮助赞赏

2 个答案:

答案 0 :(得分:1)

您确定算法吗?将您的print g移到while循环中,您会发现g变得非常大,非常快。然后你试图摆正它。你的分母应该是2*g吗?如果是这样,那么你应该像(2*g)一样将括号括在它周围,因为你除以2然后乘以g。可能不是你想做的。

答案 1 :(得分:0)

在使用Newton-Raphson方法进行根查找时,我总是觉得对这种算法使用我的标准代码并在必要时指定它很有用。也许您也会发现它有用。

ftn1 <- function(x){
  fx <- log(x) -exp(-x)
  dfx <- 1/x + exp(-x)
  return(c(fx,dfx))
}


newtonraphson <- function(ftn, x0, tol = 1e-9, max.iter = 100) {

  x <- x0
  fx <- ftn(x)
  iter <- 0
  while ((abs(fx[1]) > tol) && (iter < max.iter)) {
    x <- x - fx[1]/fx[2]
    fx <- ftn(x)
    iter <- iter + 1
    cat("At iteration", iter, "value of x is:", x, "\n")
  }
  if (abs(fx[1]) > tol) {
    cat("Algorithm failed to converge\n")
    return(NULL)
  } else {
    cat("Algorithm converged\n")
    return(x)
  }
}
newtonraphson(ftn1, 0.1)