Skip to content

Instantly share code, notes, and snippets.

@koverholt
Created November 11, 2011 05:01
Show Gist options
  • Select an option

  • Save koverholt/1357235 to your computer and use it in GitHub Desktop.

Select an option

Save koverholt/1357235 to your computer and use it in GitHub Desktop.
newtonRaphson method
## module error
''' err(string).
Prints 'string' and terminates program.
'''
import sys
def err(string):
print string
raw_input('Press return to exit')
sys.exit()
## module newtonRaphson
''' root = newtonRaphson(f,df,a,b,tol=1.0e-9).
Finds a root of f(x) = 0 by combining the Newton-Raphson
method with bisection. The root must be bracketed in (a,b).
Calls user-supplied functions f(x) and its derivative df(x).
'''
def newtonRaphson(f, df, a, b, tol=1.0e-9):
# import error
fa = f(a)
if fa == 0.0: return a
fb = f(b)
if fb == 0.0: return b
if fa * fb > 0.0: err('Root is not bracketed')
x = 0.5 * (a + b)
for i in range(30):
fx = f(x)
if abs(fx) < tol: return x
# Tighten the brackets on the root
if fa * fx < 0.0:
b = x
else:
a = x
# Try a Newton-Raphson step
dfx = df(x)
# If division by zero, push x out of bounds
try: dx = -fx / dfx
except ZeroDivisionError: dx = b - a
x = x + dx
# If the result is outside the brackets, use bisection
if (b - x) * (x - a) < 0.0:
dx = 0.5 * (b - a)
x = a + dx
# Check for convergence
if abs(dx) < tol * max(abs(b), 1.0): return x
print 'Too many iterations in Newton-Raphson'
def f(x):
return x**3 - 10*x**2 + 5
def df(x):
return 3*x - 20*x
solution = newtonRaphson(f, df, 0.1, 1, tol=1e-11)
print solution
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment