newton.py

# Not going to do an exact translation of this.
# Better to make eps a tolerance in x, rather than in f.

import numpy as np

def newton( x0, f, fprime, eps, maxitr ):
        x = x0
        for i in range(maxitr):
                fval = f(x)
                s = - fval/fprime(x)
                print( i, x, fval )
                x += s
                if np.abs(s) < eps:
                        print(i+1,x,f(x))
                        return x, True
        print(i+1,x,f(x))
        return x,False


if __name__ == '__main__':

        from xsqm2 import xsqm2, xsqm2_prime
        print( newton( 1.5, xsqm2, xsqm2_prime, 1.e-10, 10 ) )

'''
$ py newton.py
0 1.5 0.25
1 1.4166666666666667 0.006944444444444642
2 1.4142156862745099 6.007304882871267e-06
3 1.4142135623746899 4.510614104447086e-12
4 1.4142135623730951 4.440892098500626e-16
(1.4142135623730951, True)
'''