Concept

which is equivalent to power iteration with .

Code

import numpy as np
 
def inverse_iteration(A, num_iter, tol=1e-6):
	x_k = np.random.rand(A.shape[1])
	for _ in range(num_iter):
		y_k = np.linalg.solve(A, x_k)
		x_k_o = x_k
		x_k = y_k / np.linalg.norm(y_k)
		if np.linalg.norm(x_k - x_k_o) < tol:
			break
	return x_k

Or we can also reuse LU factorization with Forward-backward substitution instead of linalg.solve.

Variants

with Shift

use for scalar .