newton_sqrt.py 1.1 KB

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