No matter what data we're working on with Mathematica, we'll want to call Mathematica functions from Clojure. The Clojuratica library makes this almost as easy as calling Clojure functions. Let's see how to do it.
You must first have Clojuratica and Mathematica talking to each other. Either complete the Setting up Mathematica to talk to Clojuratica for Mac OS X and Linux recipe or the Setting up Mathematica to talk to Clojuratica for Windows recipe. You'll need to have called the init-mma
function.
Also, make sure that the Clojuratica namespace is imported into your script or REPL, as follows:
(use 'clojuratica)
In order to call a function, just use Mathematica's name for it with Clojure's function-calling syntax. For this example, we'll solve a nonlinear system of equations. In Mathematica, this will look as follows:
FindRoot[{Exp[x-2] == y, y^2 == x}, {{x, 1}, {y, 1}}].
In Clojure, it will look similar to this:
user=> (math (FindRoot [(== (Exp (- x 2)) y) (== (Power y 2) x)] [[x 1] [y 1]])) [(-> x 0.019026016103714054) (-> y 0.13793482556524314)]
This recipe was very simple, but it doesn't hurt to break it down a little:
(FindRoot [(== (Exp (- x 2)) y) (== (Power y 2) x)] [[x 1] [y 1]])
This is just Mathematica's FindRoot
function. That's right. All you need to do is call the function just as you would call any Clojure function, but using the same name that you do in Mathematica. The arguments to FindRoot
are a sequence of Equals
expressions and a sequence of starting points for each variable in the system of equations. These are also the same as in the Mathematica expression, but Clojuratica, in a good lisp fashion, requires the operator to always go first. It defines some aliases to Mathematica functions, such as the ==
and –
in this expression, which are changed to Equals
and Subtract
.
(math ...)
Any calls that we make to Mathematica must be wrapped in the math
macro. We briefly discussed this macro at the end of the Setting up Mathematica to talk to Clojuratica for Mac OS X and Linux recipe. It takes the function name and parameters that we just spoke about, sends these to Mathematica, and returns the answer.
18.119.106.237