newton.py

mzp2007-04-26

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で精度以下の部分は消している