| name | sympy |
| description | Comprehensive guide for SymPy - Python library for symbolic mathematics. Use for symbolic expressions, calculus (derivatives, integrals, limits, series), equation solving (algebraic, differential, systems), linear algebra, simplification, matrix operations, special functions, code generation, and mathematical proofs. Essential for analytical mathematics and computer algebra. |
| version | 1.13 |
| license | BSD-3-Clause |
SymPy - Symbolic Mathematics
Python library for symbolic mathematics, providing computer algebra system (CAS) capabilities entirely in Python.
When to Use
- Symbolic expressions and algebraic manipulation
- Calculus (derivatives, integrals, limits, series expansions)
- Solving equations (algebraic, transcendental, differential)
- Simplification and transformation of expressions
- Matrix operations and linear algebra (symbolic)
- Special mathematical functions
- Mathematical proofs and verification
- Code generation (C, Fortran, LaTeX)
- Physics calculations (mechanics, quantum mechanics)
- Number theory and discrete mathematics
- Logic and Boolean algebra
- Geometric algebra
Reference Documentation
Official docs: https://docs.sympy.org/
Search patterns: sympy.symbols, sympy.diff, sympy.integrate, sympy.solve, sympy.simplify
Core Principles
Use SymPy For
| Task | Module | Example |
|---|
| Symbols | symbols | x, y = symbols('x y') |
| Derivatives | diff | diff(x**2, x) |
| Integrals | integrate | integrate(x**2, x) |
| Equation solving | solve | solve(x**2 - 4, x) |
| Simplification | simplify | simplify(expr) |
| Limits | limit | limit(sin(x)/x, x, 0) |
| Series expansion | series | series(exp(x), x, 0, 5) |
| Matrices | Matrix | Matrix([[1, 2], [3, 4]]) |
Do NOT Use For
- Numerical computing (use NumPy, SciPy)
- Fast numerical calculations (symbolic is slow)
- Machine learning (use PyTorch, TensorFlow)
- Statistical analysis (use SciPy, statsmodels)
- Large-scale numerical simulations (use NumPy, Numba)
Quick Reference
Installation
pip install sympy
conda install sympy
pip install sympy[all]
Standard Imports
import sympy as sp
from sympy import symbols, Symbol, Function
from sympy import diff, integrate, limit, series
from sympy import simplify, expand, factor, collect
from sympy import solve, solveset, dsolve
from sympy import sin, cos, exp, log, sqrt, Abs
from sympy import pi, E, I, oo
from sympy import Matrix, eye, zeros, ones
from sympy import init_printing, pprint, latex
init_printing()
Basic Pattern - Symbolic Expression
from sympy import symbols, simplify, expand
x, y, z = symbols('x y z')
expr = (x + y)**2
expanded = expand(expr)
print(f"Expanded: {expanded}")
from sympy import factor
factored = factor(expanded)
print(f"Factored: {factored}")
result = expr.subs([(x, 2), (y, 3)])
print(f"Result: {result}")
Basic Pattern - Calculus
from sympy import symbols, diff, integrate, limit
from sympy import sin, cos, exp
x = symbols('x')
f = x**3 + 2*x**2 - x + 1
df = diff(f, x)
print(f"f'(x) = {df}")
integral = integrate(sin(x), x)
print(f"∫sin(x)dx = {integral}")
definite = integrate(x**2, (x, 0, 1))
print(f"∫₀¹ x²dx = {definite}")
lim = limit(sin(x)/x, x, 0)
print(f"lim(sin(x)/x) as x→0 = {lim}")
Critical Rules
✅ DO
- Use symbols() for variables - Define symbolic variables properly
- Simplify expressions - Use simplify() to clean up results
- Use rational numbers - Use Rational(1, 2) instead of 0.5
- Check assumptions - Set assumptions on symbols when needed
- Use subs() for substitution - Replace symbols with values
- Pretty print results - Use pprint() or init_printing()
- Verify results numerically - Convert to float for checking
- Use appropriate functions - Choose right solving function
- Factor before solving - Simplify equations first
- Use lambdify for speed - Convert to NumPy functions
❌ DON'T
- Mix symbolic and numeric carelessly - Be explicit with types
- Use Python floats in symbolic - Use Rational or Integer
- Forget to define symbols - Must declare before use
- Ignore symbolic/numeric distinction - Know when to use each
- Use == for equation solving - Use solve() or Eq()
- Evaluate expensive operations blindly - Some integrals are hard
- Assume automatic simplification - Often need explicit simplify()
- Use symbolic for large numerical tasks - Too slow
- Forget assumptions - Can affect results (positive, real, etc.)
- Over-rely on solve() - Use solveset() for better handling
Anti-Patterns (NEVER)
from sympy import symbols, solve, simplify, integrate, Rational
import sympy as sp
x = symbols('x')
expr = x + 0.5
expr = x + Rational(1, 2)
result = y**2 + 2*y + 1
y = symbols('y')
result = y**2 + 2*y + 1
solve(x**2 == 4)
solve(x**2 - 4, x)
from sympy import Eq
solve(Eq(x**2, 4), x)
expr = (x + 1)**2 - (x**2 + 2*x + 1)
print(expr)
result = simplify(expr)
print(result)
i ():
result = sp.sin(sp.pi * i / )
numpy np
x = symbols()
f_sym = sp.sin(x)
f_num = sp.lambdify(x, f_sym, )
results = f_num(np.linspace(, np.pi, ))
x = symbols()
sqrt(x**)
x = symbols(, positive=)
simplify(sqrt(x**))
Symbols and Expressions
Creating Symbols
from sympy import symbols, Symbol
x = Symbol('x')
x, y, z = symbols('x y z')
x = symbols('x', real=True)
y = symbols('y', positive=True)
n = symbols('n', integer=True)
theta = symbols('theta', real=True)
z = symbols('z', complex=True)
from sympy import Function
f = Function('f')
g = Function('g')
from sympy import IndexedBase, Idx
A = IndexedBase('A')
i, j = symbols('i j', integer=True)
element = A[i, j]
print(f"Assumptions for x: {x.assumptions0}")
Building Expressions
from sympy import symbols, sin, cos, exp, log, sqrt
from sympy import pi, E, I, oo
x, y, z = symbols('x y z')
expr1 = x + 2*y - 3*z
expr2 = x**2 + y**2
expr3 = x*y / z
expr4 = sin(x) + cos(y)
expr5 = exp(x**2)
expr6 = log(x + 1)
expr7 = pi * x
expr8 = E**x
expr9 = I * x
expr10 = (x + y)**3 / (sqrt(x**2 + y**2))
expr11 = sin(x)**2 + cos(x)**2
print(f"Numerator: {expr3.as_numer_denom()[0]}")
print(f"Denominator: {expr3.as_numer_denom()[1]}")
print(f"Free symbols: {expr10.free_symbols}")
print(f"Is polynomial: {expr1.is_polynomial()}")
Substitution
from sympy import symbols, sin, cos, pi
x, y = symbols('x y')
expr = x**2 + 2*x + 1
result = expr.subs(x, 3)
print(f"Result: {result}")
expr = x**2 + y**2
result = expr.subs([(x, 1), (y, 2)])
print(f"Result: {result}")
expr = sin(x) + cos(x)
result = expr.subs(x, pi/4)
print(f"Result: {result}")
expr = x + y
temp = expr.subs(x, y)
result = temp.subs(y, 1)
print(f"Result: {result}")
from sympy import simplify
expr = sin(x)**2 + cos(x)**2
result = simplify(expr.subs(x, pi/3))
print(f"Result: {result}")
Calculus
Derivatives
from sympy import symbols, diff, sin, cos, exp, log
from sympy import pprint
x, y, z = symbols('x y z')
f = x**3 + 2*x**2 - x + 1
df = diff(f, x)
print(f"f'(x) = {df}")
d2f = diff(f, x, 2)
d3f = diff(f, x, 3)
print(f"f''(x) = {d2f}")
print(f"f'''(x) = {d3f}")
f = x**2*y + y**3*z
df_dx = diff(f, x)
df_dy = diff(f, y)
df_dz = diff(f, z)
print(f"∂f/∂x = {df_dx}")
print(f"∂f/∂y = {df_dy}")
d2f_dxdy = diff(f, x, y)
d2f_dydz = diff(f, y, z)
print(f"∂²f/∂x∂y = {d2f_dxdy}")
g = sin(x**2) * exp(-x)
dg = diff(g, x)
print(f"g'(x) = {dg}")
h = sin(cos(x))
dh = diff(h, x)
print(f"h'(x) = ")
Integrals
from sympy import symbols, integrate, sin, cos, exp, log, sqrt
from sympy import pi, oo
x, y = symbols('x y')
f = x**2
F = integrate(f, x)
print(f"∫x²dx = {F}")
f = x*y
F = integrate(f, x)
print(f"∫xy dx = {F}")
result = integrate(x**2, (x, 0, 1))
print(f"∫₀¹ x²dx = {result}")
result = integrate(exp(-x), (x, 0, oo))
print(f"∫₀^∞ e^(-x)dx = {result}")
result = integrate(sin(x)**2, x)
print(f"∫sin²(x)dx = {result}")
result = integrate(x*exp(x), x)
print(f"∫x·e^x dx = {result}")
f = x*y
result = integrate(f, (x, 0, 1), (y, 0, 2))
print(f"∫∫xy dx dy = {result}")
sympy erf
result = integrate(exp(-x**), (x, -oo, oo))
()
Limits
from sympy import symbols, limit, sin, cos, exp, log
from sympy import oo, pi
x = symbols('x')
lim = limit(sin(x)/x, x, 0)
print(f"lim(sin(x)/x) as x→0 = {lim}")
lim = limit((1 + 1/x)**x, x, oo)
print(f"lim((1+1/x)^x) as x→∞ = {lim}")
lim_left = limit(1/x, x, 0, '-')
lim_right = limit(1/x, x, 0, '+')
print(f"Left limit: {lim_left}")
print(f"Right limit: {lim_right}")
lim = limit((exp(x) - 1)/x, x, 0)
print(f"lim((e^x - 1)/x) as x→0 = {lim}")
y = symbols('y')
lim = limit(limit(x*y/(x**2 + y**2), x, 0), y, 0)
print(f"Double limit: {lim}")
n = symbols('n', integer=, positive=)
lim = limit(( + /n)**n, n, oo)
()
Series Expansions
from sympy import symbols, series, sin, cos, exp, log
from sympy import O
x = symbols('x')
s = series(exp(x), x, 0, 5)
print(f"exp(x) ≈ {s}")
s_no_o = s.removeO()
print(f"Without O term: {s_no_o}")
s = series(log(x), x, 1, 5)
print(f"log(x) around x=1: {s}")
s = series(sin(x), x, 0, 7)
print(f"sin(x) ≈ {s}")
s = series(1/(x**2 + x), x, 0, 3)
print(f"1/(x²+x) ≈ {s}")
s1 = series(exp(x), x, 0, 5)
s2 = series(sin(x), x, 0, 5)
s_composed = series(s1.removeO().subs(x, s2.removeO()), x, 0, 5)
print(f"exp(sin(x)) ≈ {s_composed}")
y = symbols('y')
s = series(exp(x*y), x, , )
()
Equation Solving
Algebraic Equations
from sympy import symbols, solve, Eq
from sympy import sqrt
x, y, z = symbols('x y z')
solutions = solve(x**2 - 4, x)
print(f"x² = 4: {solutions}")
eq = Eq(x**2, 4)
solutions = solve(eq, x)
print(f"Solutions: {solutions}")
eq = x**3 - 6*x**2 + 11*x - 6
solutions = solve(eq, x)
print(f"x³ - 6x² + 11x - 6 = 0: {solutions}")
a, b, c = symbols('a b c')
eq = a*x**2 + b*x + c
solutions = solve(eq, x)
print(f"ax² + bx + c = 0:")
for sol in solutions:
print(f" x = {sol}")
eq = 1/x + 1/(x+1) - 1/2
solutions = solve(eq, x)
print(f"Solutions: {solutions}")
eq = sqrt(x) + sqrt(x - 1) - 2
solutions = solve(eq, x)
()
Systems of Equations
from sympy import symbols, solve, Eq
x, y, z = symbols('x y z')
eq1 = Eq(x + y, 5)
eq2 = Eq(x - y, 1)
solution = solve([eq1, eq2], [x, y])
print(f"Linear system: {solution}")
eq1 = x**2 + y**2 - 4
eq2 = x - y - 1
solutions = solve([eq1, eq2], [x, y])
print(f"Nonlinear system: {solutions}")
eq1 = x + y + z - 6
eq2 = 2*x - y + z - 2
eq3 = x + 2*y - z - 2
solution = solve([eq1, eq2, eq3], [x, y, z])
print(f"3x3 system: {solution}")
eq1 = x + 2*y + z - 1
eq2 = 2*x + y + 2*z - 2
solution = solve([eq1, eq2], [x, y, z])
print(f"Parametric solution: {solution}")
Differential Equations
from sympy import symbols, Function, dsolve, Eq
from sympy import diff, sin, cos, exp
x = symbols('x')
f = Function('f')
eq = Eq(diff(f(x), x), f(x))
solution = dsolve(eq, f(x))
print(f"f'(x) = f(x): {solution}")
eq = Eq(diff(f(x), x, 2) + f(x), 0)
solution = dsolve(eq, f(x))
print(f"f''(x) + f(x) = 0: {solution}")
eq = Eq(diff(f(x), x), f(x))
ics = {f(0): 1}
solution = dsolve(eq, f(x), ics=ics)
print(f"Solution with IC: {solution}")
eq = Eq(diff(f(x), x, 2) + 4*f(x), sin(x))
solution = dsolve(eq, f(x))
print(f"Non-homogeneous: {solution}")
g = Function('g')
eq1 = Eq(diff(f(x), x), g(x))
eq2 = Eq(diff(g(x), x), -f(x))
solution = dsolve([eq1, eq2], [f(x), g(x)])
print(f"System of ODEs: {solution}")
Transcendental and Numerical
from sympy import symbols, solve, sin, cos, exp, log
from sympy import nsolve, lambdify
import numpy as np
x = symbols('x')
eq = sin(x) - x/2
solutions = solve(eq, x)
print(f"sin(x) = x/2 solutions: {solutions}")
eq = exp(x) + x
try:
solution = nsolve(eq, -1)
print(f"e^x + x = 0: x ≈ {solution}")
except:
print("Could not find solution")
eq = sin(x) + cos(x) - 1
solutions = solve(eq, x)
print(f"sin(x) + cos(x) = 1: {solutions[:3]}")
eq = log(x) - 1/x
solutions = solve(eq, x)
print(f"log(x) = 1/x: {solutions}")
Simplification and Manipulation
Simplification
from sympy import symbols, simplify, sin, cos, exp, log, sqrt
from sympy import pi
x, y = symbols('x y')
expr = (x**2 + 2*x + 1) / (x + 1)
simplified = simplify(expr)
print(f"Simplified: {simplified}")
expr = sin(x)**2 + cos(x)**2
simplified = simplify(expr)
print(f"sin²x + cos²x = {simplified}")
expr = exp(x) * exp(y)
simplified = simplify(expr)
print(f"e^x · e^y = {simplified}")
expr = sqrt(x**2)
x_pos = symbols('x', positive=True)
simplified = simplify(expr.subs(x, x_pos))
print(f"√(x²) = {simplified}")
expr = (x + y)**3 - (x**3 + 3*x**2*y + 3*x*y**2 + y**3)
simplified = simplify(expr)
print(f"Result: {simplified}")
expr = log(x) + log(y)
simplified = simplify(expr)
print()
Expansion and Factoring
from sympy import symbols, expand, factor, collect
from sympy import sin, cos
x, y, z = symbols('x y z')
expr = (x + y)**3
expanded = expand(expr)
print(f"(x+y)³ = {expanded}")
expr = sin(x + y)
expanded = expand(expr, trig=True)
print(f"sin(x+y) = {expanded}")
expr = x**2 + 2*x + 1
factored = factor(expr)
print(f"x² + 2x + 1 = {factored}")
expr = x**4 - 1
factored = factor(expr)
print(f"x⁴ - 1 = {factored}")
expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3
collected = collect(expr, x)
print(f"Collected: {collected}")
expr = (x + 1)*(x + 2)*(x + 3)
expanded = expand(expr)
refactored = factor(expanded)
print(f"Expanded: ")
()
Rewriting Expressions
from sympy import symbols, sin, cos, exp, log, tan
from sympy import sinh, cosh
x = symbols('x')
expr = tan(x)
rewritten = expr.rewrite(sin)
print(f"tan(x) in terms of sin: {rewritten}")
expr = sin(x)
rewritten = expr.rewrite(exp)
print(f"sin(x) in exp form: {rewritten}")
expr = sinh(x)
rewritten = expr.rewrite(exp)
print(f"sinh(x) = {rewritten}")
expr = log(x, 10)
rewritten = expr.rewrite(log)
print(f"log₁₀(x) = {rewritten}")
expr = sin(2*x)
rewritten = expr.rewrite(sin, cos)
print(f"sin(2x) = {rewritten}")
Partial Fractions
from sympy import symbols, apart, together
from sympy import cancel, factor
x = symbols('x')
expr = (x**2 + 2*x + 1) / (x**3 + x**2)
partial = apart(expr, x)
print(f"Partial fractions: {partial}")
expr = 1/x + 2/x**2 - 1/(x + 1)
combined = together(expr)
print(f"Combined: {combined}")
expr = (x**2 - 1) / (x - 1)
cancelled = cancel(expr)
print(f"Cancelled: {cancelled}")
expr = (4*x**3 + 21*x**2 + 10*x + 12) / (x**4 + 5*x**3 + 5*x**2 + 4*x)
partial = apart(expr, x)
print(f"Complex partial fractions: {partial}")
Linear Algebra
Matrices
from sympy import Matrix, eye, zeros, ones, diag
from sympy import symbols
x, y, z = symbols('x y z')
A = Matrix([[1, 2], [3, 4]])
B = Matrix([[x, y], [z, x+y]])
print(f"Matrix A:\n{A}")
I = eye(3)
Z = zeros(2, 3)
O = ones(3, 2)
D = diag(1, 2, 3)
print(f"Identity:\n{I}")
print(f"Diagonal:\n{D}")
C = A + A
D = A * A
E = 2 * A
print(f"A + A:\n{C}")
print(f"A * A:\n{D}")
At = A.T
print(f"A transpose:\n{At}")
M = Matrix([[x, y], [y, z]])
print(f"Symbolic matrix:\n{M}")
Matrix Properties
from sympy import Matrix, symbols
from sympy import sqrt
A = Matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
det_A = A.det()
print(f"det(A) = {det_A}")
rank_A = A.rank()
print(f"rank(A) = {rank_A}")
trace_A = A.trace()
print(f"trace(A) = {trace_A}")
B = Matrix([[1, 2], [3, 4]])
B_inv = B.inv()
print(f"B inverse:\n{B_inv}")
product = B * B_inv
print(f"B * B⁻¹:\n{product}")
eigenvals = B.eigenvals()
print(f"Eigenvalues: {eigenvals}")
eigenvects = B.eigenvects()
print(f"Eigenvectors:")
for val, mult, vects in eigenvects:
print(f" λ = {val}, multiplicity = ")
v vects:
()
Matrix Decompositions
from sympy import Matrix, eye
from sympy import QR, LU
A = Matrix([[1, 2], [3, 4], [5, 6]])
Q, R = A.QRdecomposition()
print(f"Q:\n{Q}")
print(f"R:\n{R}")
print(f"Q*R:\n{Q*R}")
B = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 10]])
L, U, perm = B.LUdecomposition()
print(f"L:\n{L}")
print(f"U:\n{U}")
from sympy import Matrix
M = Matrix([[2, 1], [0, 2]])
P, J = M.jordan_form()
print(f"Jordan form J:\n{J}")
print(f"Transform P:\n{P}")
A = Matrix([[1, 2], [2, 1]])
:
P, D = A.diagonalize()
()
()
()
:
()
Solving Linear Systems
from sympy import Matrix, symbols
x, y, z = symbols('x y z')
A = Matrix([[3, 2, -1],
[2, -2, 4],
[-1, 0.5, -1]])
b = Matrix([1, -2, 0])
x_sol = A.inv() * b
print(f"Solution using inverse:\n{x_sol}")
from sympy import solve_linear_system
M = Matrix([[3, 2, -1, 1],
[2, -2, 4, -2],
[-1, 0.5, -1, 0]])
solution = solve_linear_system(M, x, y, z)
print(f"Solution: {solution}")
A_extended = Matrix([[3, 2, -1, 1],
[2, -2, 4, -2],
[-1, 0.5, -1, 0]])
rref_form, pivot_cols = A_extended.rref()
()
()
Special Functions and Constants
Mathematical Constants
from sympy import pi, E, I, oo, zoo
from sympy import GoldenRatio, EulerGamma
from sympy import S
print(f"π = {pi}")
print(f"π ≈ {pi.evalf()}")
print(f"e = {E}")
print(f"e ≈ {E.evalf()}")
print(f"i = {I}")
print(f"i² = {I**2}")
print(f"∞ = {oo}")
print(f"Complex infinity = {zoo}")
print(f"φ = {GoldenRatio}")
print(f"φ ≈ {GoldenRatio.evalf()}")
print(f"γ = {EulerGamma}")
print(f"γ ≈ {EulerGamma.evalf()}")
from sympy import Rational
half = Rational(, )
third = Rational(, )
()
()
()
Special Functions
from sympy import symbols, factorial, binomial, fibonacci
from sympy import gamma, beta, zeta
from sympy import besselj, bessely
n, m, x = symbols('n m x')
print(f"5! = {factorial(5)}")
print(f"n! = {factorial(n)}")
print(f"C(5,2) = {binomial(5, 2)}")
print(f"C(n,m) = {binomial(n, m)}")
print(f"F(10) = {fibonacci(10)}")
print(f"Γ(5) = {gamma(5)}")
print(f"Γ(1/2) = {gamma(S(1)/2)}")
print(f"B(2,3) = {beta(2, 3)}")
print(f"ζ(2) = {zeta(2)}")
()
()
()
Error and Hypergeometric Functions
from sympy import symbols, erf, erfc, erfi
from sympy import hyper, meijerg
from sympy import exp, sqrt, pi
x = symbols('x')
print(f"erf(x) = {erf(x)}")
print(f"erf(1) ≈ {erf(1).evalf()}")
print(f"erfc(x) = {erfc(x)}")
print(f"erfc(x) = {1 - erf(x)}")
print(f"erfi(x) = {erfi(x)}")
from sympy import integrate
erf_integral = 2/sqrt(pi) * integrate(exp(-x**2), (x, 0, x))
print(f"erf via integral: {erf_integral}")
result = hyper([1, 2], [3], x)
print(f"Hypergeometric: {result}")
Code Generation
Lambdify (Convert to NumPy)
from sympy import symbols, sin, cos, exp, lambdify
import numpy as np
import matplotlib.pyplot as plt
x = symbols('x')
expr = sin(x) * exp(-x**2/2)
f = lambdify(x, expr, 'numpy')
x_vals = np.linspace(-3, 3, 1000)
y_vals = f(x_vals)
plt.figure(figsize=(10, 6))
plt.plot(x_vals, y_vals)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title(r'$f(x) = \sin(x) \cdot e^{-x^2/2}$')
plt.grid(True)
plt.savefig('lambdify_example.png', dpi=150)
print(f"Function evaluated at x=1: {f(1):.6f}")
x, y = symbols('x y')
expr = x**2 + y**2
f = lambdify((x, y), expr, 'numpy')
X, Y = np.meshgrid(np.linspace(-2, 2, 50),
np.linspace(-2, 2, 50))
Z = f(X, Y)
print(f"Shape of result: {Z.shape}")
LaTeX Generation
from sympy import symbols, sin, cos, exp, integrate, Integral
from sympy import latex, Derivative, limit
x, y = symbols('x y')
expr = sin(x)**2 + cos(x)**2
latex_str = latex(expr)
print(f"LaTeX: {latex_str}")
expr = integrate(x**2, x)
latex_str = latex(expr)
print(f"∫x²dx in LaTeX: {latex_str}")
expr = Integral(sin(x) * exp(-x), (x, 0, float('inf')))
latex_str = latex(expr)
print(f"Integral notation: {latex_str}")
expr = Derivative(sin(x**2), x)
latex_str = latex(expr)
print(f"Derivative: {latex_str}")
expr = limit((1 + 1/x)**x, x, float('inf'))
latex_str = latex(expr)
print(f"Limit: {latex_str}")
from sympy import Matrix
M = Matrix([[x, y], [y, x]])
latex_str = latex(M)
print(f"Matrix:\n{latex_str}")
Code Generation (C, Fortran)
from sympy import symbols, sin, cos, exp
from sympy.utilities.codegen import codegen
x, y = symbols('x y')
expr = sin(x) * exp(-y)
[(c_name, c_code), (h_name, c_header)] = codegen(
('func', expr), 'C', 'file', header=False
)
print("C code:")
print(c_code)
[(f_name, f_code)] = codegen(
('func', expr), 'F95', 'file', header=False
)
print("\nFortran code:")
print(f_code)
from sympy import symbols, Function, Derivative
from sympy.utilities.autowrap import autowrap
x = symbols('x')
expr1 = x**2
expr2 = x**3
SymPy to NumPy Functions
from sympy import symbols, Matrix, lambdify
import numpy as np
x, y = symbols('x y')
M = Matrix([[x, y], [y, x]])
M_func = lambdify((x, y), M, 'numpy')
result = M_func(1, 2)
print(f"Matrix at (1, 2):\n{result}")
expr = M.det()
det_func = lambdify((x, y), expr, 'numpy')
print(f"Determinant at (1, 2): {det_func(1, 2)}")
v = Matrix([x**2, y**2, x*y])
v_func = lambdify((x, y), v, 'numpy')
result = v_func(np.array([1, 2, 3]), np.array([4, 5, 6]))
print(f"Vector result:\n{result}")
Physics and Engineering
Classical Mechanics
from sympy import symbols, Function, diff, solve, Eq
from sympy import sin, cos, sqrt, simplify
t = symbols('t', positive=True)
m, g, L = symbols('m g L', positive=True)
theta = Function('theta')
eq = Eq(diff(theta(t), t, 2) + (g/L)*sin(theta(t)), 0)
print(f"Pendulum equation: {eq}")
eq_linear = Eq(diff(theta(t), t, 2) + (g/L)*theta(t), 0)
from sympy import dsolve
solution = dsolve(eq_linear, theta(t))
print(f"Small angle solution: {solution}")
x = Function('x')
k = symbols('k', positive=True)
eq = Eq(m*diff(x(t), t, 2) + k*x(t), 0)
solution = dsolve(eq, x(t))
print(f"Harmonic oscillator: {solution}")
omega = sqrt(k/m)
print(f"Angular frequency: ω = {omega}")
Quantum Mechanics
from sympy import symbols, Function, diff, exp, sqrt, integrate
from sympy import pi, I, oo, simplify
from sympy import Rational
x, t = symbols('x t', real=True)
m, hbar, omega = symbols('m hbar omega', positive=True)
psi_0 = (m*omega/(pi*hbar))**Rational(1,4) * exp(-m*omega*x**2/(2*hbar))
print(f"Ground state: ψ₀(x) = {psi_0}")
norm = integrate(psi_0**2, (x, -oo, oo))
norm_simplified = simplify(norm)
print(f"Normalization: ∫|ψ₀|²dx = {norm_simplified}")
expect_x = integrate(x * psi_0**2, (x, -oo, oo))
print(f"⟨x⟩ = {simplify(expect_x)}")
expect_x2 = integrate(x**2 * psi_0**2, (x, -oo, oo))
expect_x2_simplified = simplify(expect_x2)
print(f"⟨x²⟩ = {expect_x2_simplified}")
delta_x = sqrt(expect_x2_simplified)
print(f"Δx = {delta_x}")
dpsi_dx = diff(psi_0, x)
expect_p = integrate(-I*hbar*psi_0*dpsi_dx, (x, -oo, oo))
print(f"⟨p⟩ = {simplify(expect_p)}")
Electromagnetism
from sympy import symbols, sin, cos, exp, sqrt, pi
from sympy import Function, diff, integrate
from sympy import I, oo
x, y, z, t = symbols('x y z t', real=True)
c, epsilon_0, mu_0 = symbols('c epsilon_0 mu_0', positive=True)
E = Function('E')
B = Function('B')
div_E = diff(E(x, y, z, t), x) + diff(E(x, y, z, t), y) + diff(E(x, y, z, t), z)
k, omega = symbols('k omega', real=True)
E_0 = symbols('E_0', real=True)
E_wave = E_0 * exp(I*(k*x - omega*t))
B_wave = E_wave / c
print(f"Electric field: E = {E_wave}")
print(f"Magnetic field: B = {B_wave}")
dispersion = omega - c*k
print(f"Dispersion: ω = {c*k}")
S = E_0**2 / (mu_0 * c)
print(f"Time-averaged Poynting vector: ⟨S⟩ = {S}")
u = epsilon_0 * E_0**2 / 2
print(f"Energy density: u = {u}")
Number Theory and Discrete Math
Prime Numbers and Factorization
from sympy import primefactors, factorint, isprime, prime
from sympy import nextprime, prevprime, primerange
from sympy import divisors, totient
n = 17
print(f"{n} is prime: {isprime(n)}")
n = 360
factors = factorint(n)
print(f"Prime factorization of {n}: {factors}")
primes = primefactors(n)
print(f"Prime factors: {primes}")
print(f"10th prime: {prime(10)}")
p = 100
print(f"Next prime after {p}: {nextprime(p)}")
print(f"Previous prime before {p}: {prevprime(p)}")
primes_list = list(primerange(1, 50))
print(f"Primes up to 50: {primes_list}")
divs = divisors(n)
print(f"Divisors of {n}: {divs}")
phi = totient(n)
()
Modular Arithmetic
from sympy import symbols, Mod, gcd, lcm
from sympy import mod_inverse, crt, isprime
a, b, m = symbols('a b m', integer=True)
print(f"17 mod 5 = {Mod(17, 5)}")
print(f"gcd(48, 18) = {gcd(48, 18)}")
print(f"lcm(48, 18) = {lcm(48, 18)}")
a, m = 3, 11
inv = mod_inverse(a, m)
print(f"{a}⁻¹ mod {m} = {inv}")
print(f"Verification: {Mod(a * inv, m)}")
remainders = [2, 3, 2]
moduli = [3, 5, 7]
solution = crt(moduli, remainders)
print(f"CRT solution: x = {solution[0]} (mod )")
x = solution[]
r, m (remainders, moduli):
()
Combinatorics
from sympy import symbols, factorial, binomial, multinomial
from sympy import catalan, bell, fibonacci, lucas
from sympy import stirling, partition
n, k = symbols('n k', integer=True, positive=True)
print(f"10! = {factorial(10)}")
print(f"C(10, 3) = {binomial(10, 3)}")
print(f"Multinomial(5, [2, 2, 1]) = {multinomial(5, [2, 2, 1])}")
for i in range(6):
print(f"C_{i} = {catalan(i)}")
for i in range(6):
print(f"B_{i} = {bell(i)}")
print(f"Fibonacci: {[fibonacci(i) for i ()]}")
()
()
()
sympy.utilities.iterables partitions
p = (partitions())
()
Practical Workflows
Symbolic Regression Analysis
from sympy import symbols, exp, log, sin, cos
from sympy import lambdify, simplify
import numpy as np
from scipy.optimize import curve_fit
x_data = np.linspace(0, 10, 50)
y_true = 2.5 * np.exp(-0.5 * x_data) * np.sin(x_data)
y_data = y_true + 0.1 * np.random.randn(len(x_data))
x = symbols('x')
A, alpha, omega = symbols('A alpha omega', real=True)
model = A * exp(-alpha*x) * sin(omega*x)
print(f"Model: y = {model}")
f_model = lambdify((x, A, alpha, omega), model, 'numpy')
def fit_func(x_vals, A_val, alpha_val, omega_val):
return f_model(x_vals, A_val, alpha_val, omega_val)
params, covariance = curve_fit(fit_func, x_data, y_data, p0=[2, 0.5, 1])
A_fit, alpha_fit, omega_fit = params
print(f"\nFitted parameters:")
print(f"A = {A_fit:.4f} (true: 2.5)")
print(f"α = {alpha_fit:.4f} (true: 0.5)")
print(f"ω = (true: 1.0)")
fitted_expr = model.subs([(A, A_fit), (alpha, alpha_fit), (omega, omega_fit)])
()
matplotlib.pyplot plt
y_fit = f_model(x_data, A_fit, alpha_fit, omega_fit)
plt.figure(figsize=(, ))
plt.scatter(x_data, y_data, alpha=, label=)
plt.plot(x_data, y_true, , label=)
plt.plot(x_data, y_fit, , label=)
plt.xlabel()
plt.ylabel()
plt.legend()
plt.grid()
plt.savefig(, dpi=)
Optimization Problem with Constraints
from sympy import symbols, diff, solve, simplify
from sympy import Matrix, hessian
x, y, lam = symbols('x y lambda', real=True)
f = x**2 + y**2
g = x + y - 1
L = f - lam * g
dL_dx = diff(L, x)
dL_dy = diff(L, y)
dL_dlam = diff(L, lam)
print("KKT conditions:")
print(f"∂L/∂x = {dL_dx} = 0")
print(f"∂L/∂y = {dL_dy} = 0")
print(f"∂L/∂λ = {dL_dlam} = 0")
solution = solve([dL_dx, dL_dy, dL_dlam], [x, y, lam])
print(f"\nSolution: {solution}")
x_opt = solution[x]
y_opt = solution[y]
print(f"\nOptimal point: ({x_opt}, {y_opt})")
print(f"Objective value: f({x_opt}, {y_opt}) = {f.subs([(x, x_opt), (y, y_opt)])}")
g_check = g.subs([(x, x_opt), (y, y_opt)])
print(f"Constraint check: g = {simplify(g_check)}")
H = hessian(f, (x, y))
print(f"\nHessian of f:\n")
H_opt = H.subs([(x, x_opt), (y, y_opt)])
eigenvals = H_opt.eigenvals()
()
(val > val eigenvals.keys()):
()
Symbolic Differential Equation Solver
from sympy import symbols, Function, dsolve, Eq, diff
from sympy import sin, cos, exp, sqrt
from sympy import init_printing
init_printing()
x = symbols('x')
y = Function('y')
odes = [
(Eq(diff(y(x), x) + y(x), exp(x)), "Linear first-order"),
(Eq(diff(y(x), x), y(x) * (1 - y(x))), "Logistic equation"),
(Eq(diff(y(x), x, 2) - 4*y(x), 0), "Simple harmonic"),
(Eq(diff(y(x), x, 2) + 2*diff(y(x), x) + 5*y(x), 0), "Damped oscillator"),
]
print("SOLVING DIFFERENTIAL EQUATIONS")
print("=" * 60)
for eq, description in odes:
print(f"\n{description}:")
print(f"Equation: {eq}")
solution = dsolve(eq, y(x))
print(f"Solution: {solution}")
y_sol = solution.rhs
eq_check = eq.lhs.subs(y(x), y_sol)
eq_check_simplified = simplify(eq_check)
if eq_check_simplified == eq.rhs:
print()
:
()
( + * )
()
( * )
eq = Eq(diff(y(x), x) + y(x), )
ics = {y(): }
solution = dsolve(eq, y(x), ics=ics)
()
()
Taylor Series Approximation Analysis
from sympy import symbols, sin, cos, exp, log, sqrt
from sympy import series, diff, factorial
from sympy import lambdify, Abs
import numpy as np
import matplotlib.pyplot as plt
x = symbols('x')
f = exp(sin(x))
orders = [1, 3, 5, 7, 9]
series_dict = {}
print(f"Taylor series for f(x) = {f} around x=0:")
print("=" * 60)
for n in orders:
s = series(f, x, 0, n)
s_poly = s.removeO()
series_dict[n] = s_poly
print(f"Order {n-1}: {s}")
f_num = lambdify(x, f, 'numpy')
series_num = {n: lambdify(x, s, 'numpy') for n, s in series_dict.items()}
x_vals = np.linspace(-2, 2, 200)
y_true = f_num(x_vals)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
ax1.plot(x_vals, y_true, 'k-', linewidth=2, label=)
n orders:
y_approx = series_num[n](x_vals)
ax1.plot(x_vals, y_approx, , label=, alpha=)
ax1.set_xlabel()
ax1.set_ylabel()
ax1.set_title()
ax1.legend()
ax1.grid()
ax1.set_ylim(-, )
n orders:
y_approx = series_num[n](x_vals)
error = np.(y_true - y_approx)
ax2.semilogy(x_vals, error, label=)
ax2.set_xlabel()
ax2.set_ylabel()
ax2.set_title()
ax2.legend()
ax2.grid()
plt.tight_layout()
plt.savefig(, dpi=)
( + * )
()
( * )
x_test =
y_test = f_num(x_test)
n orders:
y_approx = series_num[n](x_test)
error = (y_test - y_approx)
rel_error = error / (y_test) *
()
Symbolic Integration Techniques
from sympy import symbols, integrate, sin, cos, exp, log, sqrt
from sympy import apart, trigsimp, simplify
from sympy import pi, oo, I
x = symbols('x')
integrals = [
(x * exp(x**2), "u-substitution (automatic)"),
(x * sin(x), "Integration by parts"),
(sin(x)**2, "Trigonometric identity"),
(1/(x**2 + 3*x + 2), "Partial fractions"),
(log(x)/x, "Logarithmic"),
(1/sqrt(1 - x**2), "Inverse trig"),
]
print("INTEGRATION TECHNIQUES")
print("=" * 60)
for integrand, technique in integrals:
print(f"\n{technique}:")
print(f"∫ {integrand} dx")
result = integrate(integrand, x)
print(f"= {result}")
check = diff(result, x)
check_simplified = simplify(check)
simplify(check_simplified - integrand) == :
()
:
()
( + * )
()
( * )
definite_integrals = [
(x**, , , ),
(sin(x), , pi, ),
(exp(-x**), -oo, oo, ),
(/( + x**), -oo, oo, ),
]
integrand, a, b, description definite_integrals:
result = integrate(integrand, (x, a, b))
()
result.is_number:
()
This comprehensive SymPy guide covers 60+ examples across symbolic mathematics, calculus, algebra, and more!