#count sqrt via newton iteration ''' 算法: 对于曲线f(x)=0,如果一阶导函数f_nd(x)存在,可以利用牛顿迭代来快速求得近似解。 对于初次预估近似解 x_0, 有切线方程:y-f(x_0)=(x-x_0)*f_nd(x_0) 真实解对应于 y = 0, x = x_n (x_n - x_(n-1))f_nd(x_0) + f(x_(n-1))=0 x_n = x_(n-1) - f(x_(n-1))/f_nd(x_(n-1)) 当 x_n - x(n-1) < 指定误差时,我们认为x_n 是可以接受的近似值 对于求a 的 平方根而言,则方程如下: f(x) = x**2 - a f_nd(x) = 2x x_0 = a x = x_(n-1)-((x_(n-1))**2-a)/2(x_(n-1)) ''' import optparse import sys Epsilon = 1e-15 def Newton_sqrt(c): t = c while abs(t - c/t)>Epsilon: t = (c/t + t)/2.0 print('the sqrt of {0} is {1:.5f}'.format(c,t)) def main(): ''' 帮助信息 获取参数 ''' parser = optparse.OptionParser("""\ usage: %prog [options] infile outfile tell you the sqrt of your input number""") parser.add_option("-r", "--sqrt", dest="sqrt", help=("get the sqrt")) opts, args = parser.parse_args() Newton_sqrt(float(opts.sqrt)) main()