15.2. Solving equations and inequalities
This is one of the 100+ free recipes of the IPython Cookbook, Second Edition, by Cyrille Rossant, a guide to numerical computing and data science in the Jupyter Notebook. The ebook and printed book are available for purchase at Packt Publishing.
▶ Text on GitHub with a CC-BY-NC-ND license
▶ Code on GitHub with a MIT license
▶ Go to Chapter 15 : Symbolic and Numerical Mathematics
▶ Get the Jupyter notebook
SymPy offers several ways to solve linear and nonlinear equations and systems of equations. Of course, these functions do not always succeed in finding closed-form exact solutions. In this case, we can fall back to numerical solvers and obtain approximate solutions.
How to do it...
1. Let's define a few symbols:
from sympy import *
init_printing()
var('x y z a')
2. We use the solve()
function to solve equations (the right-hand side is 0 by default):
solve(x**2 - a, x)
3. We can also solve inequalities. Here, we need to use the solve_univariate_inequality()
function to solve this univariate inequality in the real domain:
x = Symbol('x')
solve_univariate_inequality(x**2 > 4, x)
4. The solve()
function also accepts systems of equations (here, a linear system):
solve([x + 2*y + 1, x - 3*y - 2], x, y)
5. Nonlinear systems are also handled:
solve([x**2 + y**2 - 1, x**2 - y**2 - S(1) / 2], x, y)
6. Singular linear systems can also be solved (here, there is an infinite number of solutions because the two equations are collinear):
solve([x + 2*y + 1, -x - 2*y - 1], x, y)
7. Now, let's solve a linear system using matrices containing symbolic variables:
var('a b c d u v')
8. We create the augmented matrix, which is the horizontal concatenation of the system's matrix with the linear coefficients and the right-hand side vector. This matrix corresponds to the following system in \(x, y\): \(ax+by=u, cx+dy=v\):
M = Matrix([[a, b, u], [c, d, v]])
M
solve_linear_system(M, x, y)
9. This system needs to be nonsingular in order to have a unique solution, which is equivalent to saying that the determinant of the system's matrix needs to be nonzero (otherwise the denominators in the preceding fractions are equal to zero):
det(M[:2, :2])
There's more...
Matrix support in SymPy is quite rich; we can perform a large number of operations and decompositions (see the reference guide at http://docs.sympy.org/latest/modules/matrices/matrices.html).
Here are more references about linear algebra:
- Linear algebra on Wikipedia, at https://en.wikipedia.org/wiki/Linear_algebra#Further_reading
- Linear algebra on Wikibooks, at http://en.wikibooks.org/wiki/Linear_Algebra
- Linear algebra lectures on Awesome Math, at https://github.com/rossant/awesome-math/#linear-algebra