Chapter 3: Symbolic computing
Robert Johansson
Source code listings for Numerical Python - Scientific Computing and Data Science Applications with Numpy, SciPy and Matplotlib (ISBN 979-8-8688-0412-0).
import sympysympy.init_printing()from sympy import I, oo, pix = sympy.Symbol("x")y = sympy.Symbol("y", real=True)y.is_realTruex.is_real is NoneTruesympy.Symbol("z", imaginary=True).is_realFalsex = sympy.Symbol("x")y = sympy.Symbol("y", positive=True)sympy.sqrt(x**2)Loading...
sympy.sqrt(y**2)Loading...
n1, n2, n3 = (
sympy.Symbol("n"),
sympy.Symbol("n", integer=True),
sympy.Symbol("n", odd=True),
)sympy.cos(n1 * pi)Loading...
sympy.cos(n2 * pi)Loading...
sympy.cos(n3 * pi)Loading...
a, b, c = sympy.symbols("a, b, c", negative=True)d, e, f = sympy.symbols("d, e, f", positive=True)Numbers¶
i = sympy.Integer(19)"i = {} [type {}]".format(i, type(i))"i = 19 [type <class 'sympy.core.numbers.Integer'>]"i.is_Integer, i.is_real, i.is_odd(True, True, True)f = sympy.Float(2.3)"f = {} [type {}]".format(f, type(f))"f = 2.30000000000000 [type <class 'sympy.core.numbers.Float'>]"f.is_Integer, f.is_real, f.is_odd(False, True, False)i, f = sympy.sympify(19), sympy.sympify(2.3)type(i)sympy.core.numbers.Integertype(f)sympy.core.numbers.Floatn = sympy.Symbol("n", integer=True)n.is_integer, n.is_Integer, n.is_positive, n.is_Symbol(True, False, None, True)i = sympy.Integer(19)i.is_integer, i.is_Integer, i.is_positive, i.is_Symbol(True, True, True, False)i**50Loading...
sympy.factorial(100)Loading...
"%.25f" % 0.3 # create a string represention with 25 decimals'0.2999999999999999888977698'sympy.Float(0.3, 25)Loading...
sympy.Float("0.3", 25)Loading...
Rationals¶
sympy.Rational(11, 13)Loading...
r1 = sympy.Rational(2, 3)r2 = sympy.Rational(4, 5)r1 * r2Loading...
r1 / r2Loading...
Functions¶
x, y, z = sympy.symbols("x, y, z")f = sympy.Function("f")type(f)sympy.core.function.UndefinedFunctionf(x)Loading...
g = sympy.Function("g")(x, y, z)gLoading...
g.free_symbolsLoading...
sympy.sinsinsympy.sin(x)Loading...
sympy.sin(pi * 1.5)Loading...
n = sympy.Symbol("n", integer=True)sympy.sin(pi * n)Loading...
h = sympy.Lambda(x, x**2)hLoading...
h(5)Loading...
h(1 + x)Loading...
Expressions¶
x = sympy.Symbol("x")e = 1 + 2 * x**2 + 3 * x**3eLoading...
e.argsLoading...
e.args[1]Loading...
e.args[1].args[1]Loading...
e.args[1].args[1].args[0]Loading...
e.args[1].args[1].args[0].argsLoading...
Simplification¶
expr = 2 * (x**2 - x) - x * (x + 1)exprLoading...
sympy.simplify(expr)Loading...
expr.simplify()Loading...
exprLoading...
expr = 2 * sympy.cos(x) * sympy.sin(x)exprLoading...
sympy.trigsimp(expr)Loading...
expr = sympy.exp(x) * sympy.exp(y)exprLoading...
sympy.powsimp(expr)Loading...
Expand¶
expr = (x + 1) * (x + 2)sympy.expand(expr)Loading...
sympy.sin(x + y).expand(trig=True)Loading...
a, b = sympy.symbols("a, b", positive=True)sympy.log(a * b).expand(log=True)Loading...
sympy.exp(I * a + b).expand(complex=True)Loading...
sympy.expand((a * b) ** x, power_exp=True)Loading...
sympy.exp(I * (a - b) * x).expand(power_exp=True)Loading...
sympy.exp((a - b) * x).expand(power_exp=True)Loading...
Factor¶
sympy.factor(x**2 - 1)Loading...
sympy.factor(x * sympy.cos(y) + sympy.sin(z) * x)Loading...
sympy.logcombine(sympy.log(a) - sympy.log(b))Loading...
expr = x + y + x * y * zexpr.factor()Loading...
expr.collect(x)Loading...
expr.collect(y)Loading...
expr = sympy.cos(x + y) + sympy.sin(x - y)expr.expand(trig=True).collect([sympy.cos(x), sympy.sin(x)]).collect(
sympy.cos(y) - sympy.sin(y)
)Loading...
Together, apart, cancel¶
sympy.apart(1 / (x**2 + 3 * x + 2), x)Loading...
sympy.together(1 / (y * x + y) + 1 / (1 + x))Loading...
sympy.cancel(y / (y * x + y))Loading...
Substitutions¶
(x + y).subs(x, y)Loading...
sympy.sin(x * sympy.exp(x)).subs(x, y)Loading...
sympy.sin(x * z).subs({z: sympy.exp(y), x: y, sympy.sin: sympy.cos})Loading...
expr = x * y + z**2 * xvalues = {x: 1.25, y: 0.4, z: 3.2}expr.subs(values)Loading...
Numerical evaluation¶
sympy.N(1 + pi)Loading...
sympy.N(pi, 50)Loading...
(x + 1 / pi).evalf(7)Loading...
expr = sympy.sin(pi * x * sympy.exp(x))[expr.subs(x, xx).evalf(3) for xx in range(0, 10)]Loading...
expr_func = sympy.lambdify(x, expr)expr_func(1.0)Loading...
expr_func = sympy.lambdify(x, expr, "numpy")import numpy as npxvalues = np.arange(0, 10)expr_func(xvalues)array([ 0. , 0.77394269, 0.64198244, 0.72163867, 0.94361635,
0.20523391, 0.97398794, 0.97734066, -0.87034418, -0.69512687])Calculus¶
f = sympy.Function("f")(x)sympy.diff(f, x)Loading...
sympy.diff(f, x, x)Loading...
sympy.diff(f, x, 3)Loading...
g = sympy.Function("g")(x, y)g.diff(x, y)Loading...
g.diff(x, 3, y, 2) # equivalent to s.diff(g, x, x, x, y, y)Loading...
expr = x**4 + x**3 + x**2 + x + 1expr.diff(x)Loading...
expr.diff(x, x)Loading...
expr = (x + 1) ** 3 * y**2 * (z - 1)expr.diff(x, y, z)Loading...
expr = sympy.sin(x * y) * sympy.cos(x / 2)expr.diff(x)Loading...
expr = sympy.functions.special.polynomials.hermite(x, 0)expr.diff(x).doit()Loading...
d = sympy.Derivative(sympy.exp(sympy.cos(x)), x)dLoading...
d.doit()Loading...
Integrals¶
a, b = sympy.symbols("a, b")
x, y = sympy.symbols("x, y")
f = sympy.Function("f")(x)sympy.integrate(f)Loading...
sympy.integrate(f, (x, a, b))Loading...
sympy.integrate(sympy.sin(x))Loading...
sympy.integrate(sympy.sin(x), (x, a, b))Loading...
sympy.integrate(sympy.exp(-(x**2)), (x, 0, oo))Loading...
a, b, c = sympy.symbols("a, b, c", positive=True)sympy.integrate(a * sympy.exp(-(((x - b) / c) ** 2)), (x, -oo, oo))Loading...
sympy.integrate(sympy.sin(x * sympy.cos(x)))Loading...
expr = sympy.sin(x * sympy.exp(y))sympy.integrate(expr, x)Loading...
expr = (x + y) ** 2sympy.integrate(expr, x)Loading...
sympy.integrate(expr, x, y)Loading...
sympy.integrate(expr, (x, 0, 1), (y, 0, 1))Loading...
Series¶
x = sympy.Symbol("x")f = sympy.Function("f")(x)sympy.series(f, x)Loading...
x0 = sympy.Symbol("{x_0}")f.series(x, x0, n=2)Loading...
f.series(x, x0, n=2).removeO()Loading...
sympy.cos(x).series()Loading...
sympy.sin(x).series()Loading...
sympy.exp(x).series()Loading...
(1 / (1 + x)).series()Loading...
expr = sympy.cos(x) / (1 + sympy.sin(x * y))expr.series(x, n=4)Loading...
expr.series(y, n=4)Loading...
expr.series(y).removeO().series(x).removeO().expand()Loading...
Limits¶
sympy.limit(sympy.sin(x) / x, x, 0)Loading...
f = sympy.Function("f")
x, h = sympy.symbols("x, h")diff_limit = (f(x + h) - f(x)) / hsympy.limit(diff_limit.subs(f, sympy.cos), h, 0)Loading...
sympy.limit(diff_limit.subs(f, sympy.sin), h, 0)Loading...
expr = (x**2 - 3 * x) / (2 * x - 2)p = sympy.limit(expr / x, x, oo)q = sympy.limit(expr - p * x, x, oo)p, qLoading...
Sums and products¶
n = sympy.symbols("n", integer=True)x = sympy.Sum(1 / (n**2), (n, 1, oo))xLoading...
x.doit()Loading...
x = sympy.Product(n, (n, 1, 7))xLoading...
x.doit()Loading...
x = sympy.Symbol("x")sympy.Sum((x) ** n / (sympy.factorial(n)), (n, 1, oo)).doit().simplify()Loading...
Equations¶
x = sympy.symbols("x")sympy.solve(x**2 + 2 * x - 3)Loading...
a, b, c = sympy.symbols("a, b, c")sympy.solve(a * x**2 + b * x + c, x)Loading...
sympy.solve(sympy.sin(x) - sympy.cos(x), x)Loading...
sympy.solve(sympy.exp(x) + 2 * x, x)Loading...
sympy.solve(x**5 - x**2 + 1, x)Loading...
1 # s.solve(s.tan(x) - x, x)Loading...
eq1 = x + 2 * y - 1
eq2 = x - y + 1sympy.solve([eq1, eq2], [x, y], dict=True)Loading...
eq1 = x**2 - y
eq2 = y**2 - xsols = sympy.solve([eq1, eq2], [x, y], dict=True)solsLoading...
[eq1.subs(sol).simplify() == 0 and eq2.subs(sol).simplify() == 0 for sol in sols][True, True, True, True]Linear algebra¶
sympy.Matrix([1, 2])Loading...
sympy.Matrix([[1, 2]])Loading...
sympy.Matrix([[1, 2], [3, 4]])Loading...
sympy.Matrix(3, 4, lambda m, n: 10 * m + n)Loading...
a, b, c, d = sympy.symbols("a, b, c, d")M = sympy.Matrix([[a, b], [c, d]])MLoading...
M * MLoading...
x = sympy.Matrix(sympy.symbols("x_1, x_2"))M * xLoading...
p, q = sympy.symbols("p, q")M = sympy.Matrix([[1, p], [q, 1]])MLoading...
b = sympy.Matrix(sympy.symbols("b_1, b_2"))bLoading...
x = M.solve(b)
xLoading...
x = M.LUsolve(b)xLoading...
x = M.inv() * bxLoading...
- Johansson, R. (2024). Numerical Python: Scientific Computing and Data Science Applications with Numpy, SciPy and Matplotlib. Apress. 10.1007/979-8-8688-0413-7