newton.py
30分シリーズ。その9。ネタがねぇ。
今回はニュートン法。数値計算の教科書までもひっぱり出した。いやね、アルゴリズムの本はすべからく手続き的・反復的に書いてあるのよ。それを、再帰で書き直していると30分で終わらないのです。
というわけで、今回はニュートン法で二乗根、三乗根、10乗根を求めてみた。
$ python newton.py sqrt(2) = 1.41421 cubic_root(2) = 1.25992 root(2,10) = 1.0717734625
def newton(f,x,delta=0.1): new = x-f(x) if abs(new - x) < delta: return new else: return newton(f,new,delta) def newton_wrap(f,precious=2,init=2.0): return round(newton(f,init,10**(-precious)),precious) def sqrt(x,precious=2): return newton_wrap((lambda y: (y**2 - x) / (2*y)), precious=precious) def cube_root(x,precious=2): return newton_wrap((lambda y: (y**3 - x) / (3*y**2)), precious=precious) def root(x,root=2,precious=2): return newton_wrap((lambda y: (y**root - x) / (root*y**(root-1))), precious=precious) print "sqrt(2)\t\t= %s" % sqrt(2,5) print "cubic_root(2)\t= %s" % cube_root(2,5) print "root(2,10)\t= %s" % root(2,precious=10,root=10)
- Pythonはreturnが面倒
- キーワード引数最高
- rootさえあればsqrtもcube_rootも要らないんだけど、ここまで書いた軌跡として
- roundで精度以下の部分は消している