NumPy: Solve a System of Linear Equations
We first consider a system of linear equations in two variables $x$ and $y$.
We pick an example from the classic Hall & Knight's text Elementary Algebra1.
$$ 3x + 7y = 27 \\ 5x + 2y = 16 $$
This can be put in the matrix dot product form as
$$ \begin{bmatrix} 3 & 7 \\ 5 & 2 \\ \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ \end{bmatrix} = \begin{bmatrix} 27 \\ 16 \\ \end{bmatrix} $$
If $A$ represents the matrix of coefficients, $x$ the column vector of variables and $B$ the column vector of solutions, the above equation can be shortened to
$$ Ax = B $$
The above matrix product will be defined if and only if the number of columns in the coefficient matrix $A$ is equal to the number of rows in the variable matrix $x$.
From school, most of us are familiar with solving such set of linear equations using Cramer's Rule, which involves determinants.
Python's numerical library NumPy has a function numpy.linalg.solve()
which solves a linear matrix equation, or system of linear scalar equation.
Here we find the solution to the above set of equations in Python using NumPy's numpy.linalg.solve() function.
import numpy as np
a = np.array([[3,7], [5,2]])
b = np.array([27,16])
x = np.linalg.solve(a, b)
print(x)
If the above Python script is executed, we will get the solutions in the column matrix format as
[2. 3.]
representing the $x$ and $y$ values respectively. So, $x = 2$ and $y = 3$.
Also you can use the numpy.allclose()
function to check if the solution is correct. The following should return True
.
np.allclose(np.dot(a, x), b)
Simultaneous Equations in Three Variables
Next we consider simultaneous equations in three unknowns or variables $x$ , $y$ and $z$. We pick another example from the same book Elementary Algebra2 by Hall & Knight.
$$ 6x + 2y - 5z = 13 \\ 3x + 3y - 2z = 13 \\ 7x + 5y - 3z = 26 $$
We represent the above equations in the matrix form
$$ \begin{bmatrix} 6 & 2 & -5 \\ 3 & 3 & -2 \\ 7 & 5 & -3 \\ \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} = \begin{bmatrix} 13 \\ 13 \\ 26 \\ \end{bmatrix} $$
We solve it with NumPy's numpy.linalg.solve()
function
import numpy as np
a = np.array([[6,2,-5], [3,3,-2], [7,5,-3]])
b = np.array([13,13,26])
x = np.linalg.solve(a, b)
print(x)
On executing the script, the solution is printed as a column matrix, representing the values for $x$ , $y$ and $z$ respectively.
[2. 3. 1.]
Notes
- 1) H. S. Hall & S. R. Knight, Elementary Algebra. London: Macmillan & Co., Ltd., 1896. Chapter XVII: Simultaneous Equations, p. 148, Ex. 2.
- 2) Ibid., p152