# SymPy.jl

Documentation for SymPy.jl a Julia interface to Python's SymPy library for symbolic mathematics.

To install the package, run

(v1.4) pkg> add SymPy

This package relies on PyCall to provide a link between Julia and Python. Installation should install PyCall, the sympy module for python, and if needed, a python executable.

## Quick example

This package provides a convenient way to access the functionality of the sympy library for Python from Julia, utilizing the PyCall package to provide the interface. A symbolic type, a wrapper around a PyCall.PyObject, is provided and, as much as reasonable, generic Julia methods are created for this type. Many sympy specific features are available through a qualified function call, e.g. sympy.funcname(...) or a Python method call, e.g., obj.methname(...).

This example from calculus provides an illustation of each.

julia> using SymPy

Here we create some symbolic variables, one with an assumption:

julia> @vars x
(x,)

julia> @vars a real=true
(a,)

The basic math functions have methods for symbolic expressions:

julia> sin(x)
sin(x)

julia> log(x)
log(x)

The output is a symbolic expression.

A selection of SymPy functions are defined as Julia functions. Here are three common calculus operations:

julia> limit(sin(a*x)/x, x =>  0)
a

julia> diff(x^x, (x,3))
x ⎛            3   3⋅(log(x) + 1)   1 ⎞
x ⋅⎜(log(x) + 1)  + ────────────── - ──⎟
⎜                      x           2⎟
⎝                                 x ⎠

julia> integrate(exp(-a*x) * sin(x), x)
a⋅sin(x)          cos(x)
- ────────────── - ──────────────
2  a⋅x    a⋅x    2  a⋅x    a⋅x
a ⋅ℯ    + ℯ      a ⋅ℯ    + ℯ   

Both limit and integrate are defined within the package, whereas diff, a generic Julia function, has a method defined for the first argument being symbolic.

The diff function finds derivatives, SymPy's Derivative function defines unevaluated derivatives, which are evaluated through their doit method. Derivative is not a Julia function, so we must qualify it:

julia> out = sympy.Derivative(x^x, x)
d ⎛ x⎞
──⎝x ⎠
dx

julia> out.doit()
x
x ⋅(log(x) + 1)