123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #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()
|