import numpy as np
A = np.array([[1, 1, 0], [0, 1, 1], [1, 1, 1]])
A
array([[1, 1, 0], [0, 1, 1], [1, 1, 1]])
Ainv = np.linalg.inv(A)
Ainv
array([[ 0., -1., 1.], [ 1., 1., -1.], [-1., 0., 1.]])
b = np.array([[2], [2], [3]])
b
array([[2], [2], [3]])
x = Ainv @ b
x
array([[1.], [1.], [1.]])
A @ x - b
array([[0.], [0.], [0.]])
x, resid, rank, s = np.linalg.lstsq(A, b)
x
array([[1.], [1.], [1.]])
A = np.array([[1, 1, 0], [0, 1, 1], [1, 1, 1], [1, 1, 2]])
A
array([[1, 1, 0], [0, 1, 1], [1, 1, 1], [1, 1, 2]])
b = np.array([[2], [2], [3], [4.1]])
b
array([[2. ], [2. ], [3. ], [4.1]])
Apinv = np.linalg.inv(A.T @ A) @ A.T
Apinv
array([[ 0.33333333, -1. , 0.33333333, 0.33333333], [ 0.5 , 1. , 0. , -0.5 ], [-0.5 , 0. , 0. , 0.5 ]])
x = Apinv @ b
x
array([[1.03333333], [0.95 ], [1.05 ]])
A @ x
array([[1.98333333], [2. ], [3.03333333], [4.08333333]])
x, resid, rank, s = np.linalg.lstsq(A, b)
x
array([[1.03333333], [0.95 ], [1.05 ]])
resid, np.linalg.norm(A @ x - b) ** 2
(array([0.00166667]), 0.001666666666666655)