During some quiet time recently, I decided to exercise my brain a little bit, and wrote a Scala implementation of Newton's Method for solving equations. In the Scala class/object below, I define two functions, f(x) and f'(x), and then solve those equations using my implementation of Newton's Method.
Note: I wrote the following code several years before I wrote the Scala Cookbook, so it’s a little sloppy, and it’s not written in a pure “functional programming” (FP) style. I’ll update it to a Pure-FP style when I have a little more free time.
I could clean up the source code a little bit, but in short, the newtonsMethod function is the main "solver" function, while the newtonsMethodHelper function does what it's documentation says, implementing the calculation shown.
object NewtonsMethod {
def main(args: Array[String]) {
driver
}
/**
* A "driver" function to test Newton's method.
* Start with (a) the desired f(x) and f'(x) equations,
* (b) an initial guess and (c) tolerance values.
*/
def driver {
// i pulled these f(x) and f'(x) functions from my old
// Applied Numerical Analysis book
// the f(x) and f'(x) functions
val fx = (x: Double) => 3*x + Math.sin(x) - scala.math.pow(Math.E, x)
val fxPrime = (x: Double) => 3 + Math.cos(x) - scala.math.pow(Math.E, x)
val initialGuess = 0.0
val tolerance = 0.00005
// pass f(x) and f'(x) to the Newton's Method function, along with the initial guess
// and tolerance
val answer = newtonsMethod(fx, fxPrime, initialGuess, tolerance)
println(answer)
}
/**
* Newton's Method for solving equations.
* TODO: check that |f(xNext)| is greater than a second tolerance value
* TODO: check that f'(x) != 0
*/
def newtonsMethod(fx: Double => Double,
fxPrime: Double => Double,
x: Double,
tolerance: Double): Double = {
var x1 = x
var xNext = newtonsMethodHelper(fx, fxPrime, x1)
while (Math.abs(xNext - x1) > tolerance) {
x1 = xNext
println(xNext) // debugging (intermediate values)
xNext = newtonsMethodHelper(fx, fxPrime, x1)
}
return xNext
}
/**
* This is the "x2 = x1 - f(x1)/f'(x1)" calculation
*/
def newtonsMethodHelper(fx: Double => Double,
fxPrime: Double => Double,
x: Double): Double = {
return x - fx(x) / fxPrime(x)
}
}
As you can see from the code, I use the scala.math.pow function several times. I explain the need for this in my Scala power exponentiation tutorial.
I enjoy writing code like this for several reasons. First, I love math. Second, it lets me explore features of Scala that I don't always get to use, in this case passing functions around between other functions.
There are a couple of features of Newton’s Method that I haven't implemented yet (due to time constraints), and I’ll implement those some time in the future, maybe during a ScalaTest tutorial.
I should also note that the code I wrote is not based on the Wikipedia entry for Newton's Method. I didn't look at that page until just now. I wrote my code based on an old book named Applied Numerical Analysis (first published in 1970, wow).
Finally, I want to note that the style of code here is a combination of OOP (object-oriented programming) and FP (functional programming). At some point I hope to have the time to rewrite it in a completely FP style.

