猫行天下 7 lat temu
rodzic
commit
4cf652823b
1 zmienionych plików z 51 dodań i 0 usunięć
  1. 51 0
      newton_sqrt.py

+ 51 - 0
newton_sqrt.py

@@ -0,0 +1,51 @@
+#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()