SymPy

Not to be confused with SimPy, a discrete-event simulation language.
SymPy
Developer(s) Independent group of people
Initial release 2007
Stable release 0.7.6 / November 14, 2014
Development status Active
Written in Python
Operating system Cross-platform
Type Computer algebra system
License New BSD license
Website sympy.org

SymPy is a Python library for symbolic computation. It provides computer algebra capabilities either as a standalone application, as a library to other applications, or live on the web as SymPy Live or SymPy Gamma. SymPy is trivial to install and to inspect because is written entirely in Python and because it does not depend on any additional libraries.[1] This ease of access combined with a simple and extensible code base in a well known language make SymPy a computer algebra system with a relatively low barrier to entry.

SymPy includes features ranging from basic symbolic arithmetic to calculus, algebra, discrete mathematics and quantum physics. It is capable of formatting the result of the computations as LaTeX code.[1]

SymPy is free software and is licensed under New BSD license. The lead developers are Ondřej Čertík and Aaron Meurer.

Features

The SymPy library is split into a core with many optional modules.

Currently, the core of SymPy has around 260,000 lines of code[2] (also includes a comprehensive set of self-tests: over 100,000 lines in 350 files as of version 0.7.5). ) and its capabilities include:[1]

Core capabilities

Polynomials

Calculus

Solving Equations

Discrete math

Matrices

Geometry

Plotting

Note, plotting requires the external Pyglet module.

Physics

Statistics

Printing

Related projects

Optional dependencies

SymPy requires no dependencies other than Python to run, but there are several optional dependencies that can enhance its capabilities:

Usage examples

Pretty Printing

Sympy allows outputs to be formatted into a more appealing format through the pprint function. Alternatively, the init_printing() method will enable pretty printing, so pprint need not be called. Pretty printing will use unicode symbols when available in the current environment, otherwise it will fall back to ASCII characters.

>>> from sympy import pprint, init_printing, Symbol, sin, cos, exp, sqrt, series, Integral, Function
>>>
>>> x = Symbol("x")
>>> y = Symbol("y")
>>> f = Function('f')
>>> # pprint will default to unicode if available
>>> pprint( x**exp(x) )
 ⎛ x⎞
 ⎝ℯ ⎠
x   
>>> # An output without unicode
>>> pprint(Integral(f(x), x), use_unicode=False)
  /       
 |        
 | f(x) dx
 |        
/        
>>> # Compare with same expression but this time unicode is enabled
>>> pprint(Integral(f(x), x), use_unicode=True)
⌠        
⎮ f(x) dx
⌡     
>>> # Alternatively, you can call init_printing() once and pretty print without the pprint function.
>>> init_printing()
>>> sqrt(sqrt(exp(x)))
   ____
4 ╱  x 
╲╱  ℯ  
>>> (1/cos(x)).series(x, 0, 10)
     2      4       6        8         
    x    5⋅x    61⋅x    277⋅x     ⎛ 101 + ── + ──── + ───── + ────── + O⎝x  ⎠
    2     24     720     8064

Expansion

>>> from sympy import init_printing, Symbol, expand
>>> init_printing()
>>>
>>> a = Symbol('a')
>>> b = Symbol('b')
>>> e = (a + b)**5
>>> e
       5
(a + b) 
>>> e.expand()
 5      4         3  2       2  3        4    5
a  + 5⋅a ⋅b + 10⋅a ⋅b  + 10⋅a ⋅b  + 5⋅a⋅b  + b

Arbitrary Precision Example

>>> from sympy import Rational, pprint
>>>
>>> e = Rational(2)**50 / Rational(10)**50
>>> pprint(e)
1/88817841970012523233890533447265625

Differentiation

>>> from sympy import init_printing, symbols, ln, diff
>>> init_printing()
>>> x,y = symbols('x y')
>>> f = x**2 / y + 2 * x - ln(y)
>>> diff(f,x)
 2⋅x    
 ─── + 2
  y 
>>> diff(f,y)
    2    
   x    1
 - ── - ─
    2   y
   y
>>> diff(diff(f,x),y)
 -2⋅x
 ────
   2 
  y

Plotting

Output of the plotting example
>>> from sympy import symbols, plot3d, cos
>>> x,y = symbols('x y')
>>> plot3d(cos(x*3)*cos(y*5)-y, (x, -1, 1), (y, -1, 1))
<sympy.plotting.plot.Plot object at 0x3b6d0d0>

Limits

>>> from sympy import init_printing, Symbol, limit, sqrt, oo
>>> init_printing()
>>> 
>>> x = Symbol('x')
>>> limit(sqrt(x**2 - 5*x + 6) - x, x, oo)
-5/2
>>> limit(x*(sqrt(x**2 + 1) - x), x, oo)
1/2
>>> limit(1/x**2, x, 0)>>> limit(((x - 1)/(x + 1))**x, x, oo)
 -2

Differential Equations

>>> from sympy import init_printing, Symbol, Function, Eq, dsolve, sin, diff
>>> init_printing()
>>>
>>> x = Symbol("x")
>>> f = Function("f")
>>>
>>> eq = Eq(f(x).diff(x), f(x))
>>> eq
d              
──(f(x)) = f(x)
dx         
>>>    
>>> dsolve(eq, f(x))
           x
f(x) = C₁⋅ℯ
 
>>>
>>> eq = Eq(x**2*f(x).diff(x), -3*x*f(x) + sin(x)/x)
>>> eq
 2 d                      sin(x)
x ⋅──(f(x)) = -3⋅x⋅f(x) + ──────
   dx                       x   
>>>
>>> dsolve(eq, f(x))
       C₁ - cos(x)
f(x) = ───────────
             3    
            x

Integration

>>> from sympy import init_printing, integrate, Symbol, exp, cos, erf
>>> init_printing()
>>> x = Symbol('x')
>>> # Polynomial Function
>>> f = x**2 + x + 1
>>> f
 2        
x  + x + 1
>>> integrate(f,x)
 3    2    
x    x     
── + ── + x
3    2     
>>> # Rational Function
>>> f = x/(x**2+2*x+1)
>>> f
     x      
────────────
 2          
x  + 2⋅x + 1
 
>>> integrate(f, x)
               1  
log(x + 1) + ─────
             x + 1
>>> # Exponential-polynomial functions
>>> f = x**2 * exp(x) * cos(x)
>>> f
 2  x       
x ⋅ℯ ⋅cos(x)
>>> integrate(f, x)
 2  x           2  x                         x           x       
x ⋅ℯ ⋅sin(x)   x ⋅ℯ ⋅cos(x)      x          ℯ ⋅sin(x)   ℯ ⋅cos(x)
──────────── + ──────────── - x⋅ℯ ⋅sin(x) + ───────── - ─────────
     2              2                           2           2    
>>> # A non-elementary integral
>>> f = exp(-x**2) * erf(x)
>>> f
   2       
 -x        
ℯ   ⋅erf(x)
>>> integrate(f, x)
 
  ___    2   
╲╱ π ⋅erf (x)
─────────────
      4

Series

>>> from sympy import Symbol, cos, sin, pprint
>>> x = Symbol('x')
>>> e = 1/cos(x)
>>> pprint(e)
  1   
──────
cos(x)
>>> pprint(e.series(x, 0, 10))
     2      4       6        8         
    x    5⋅x    61⋅x    277⋅x     ⎛ 101 + ── + ──── + ───── + ────── + O⎝x  ⎠
    2     24     720     8064          
>>> e = 1/sin(x)
>>> pprint(e)
  1   
──────
sin(x)
>>> pprint(e.series(x, 0, 4))
           3        
1   x   7⋅x     ⎛ 4⎞
─ + ─ + ──── + O⎝x ⎠
x   6   360

See also

References

  1. 1.0 1.1 1.2 "SymPy homepage". Retrieved 2014-10-13.
  2. "Sympy project statistics on Open HUB". Retrieved 2014-10-13.

External links