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:
行。帮助赞赏
答案 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)