Copyright (C) 2023 Andreas Kloeckner
import numpy as np
import numpy.linalg as la
np.set_printoptions(linewidth=120)
Make a matrix with given eigenvalues:
n = 5
np.random.seed(70)
eigvecs = np.random.randn(n, n)
eigvals = np.sort(np.random.randn(n))
A = np.dot(la.solve(eigvecs, np.diag(eigvals)), eigvecs)
print(eigvals)
X = A
Qall = np.eye(n)
Q, R = la.qr(X)
X = R @ Q
Qall = Qall @ Q
print(X)
np.tril(X, -1)
la.norm(np.tril(X, -1))
la.norm(A - Qall @ X @ Qall.T, 2) / la.norm(A, 2)
X = A
Qall = np.eye(n)
i = -4
sigma = X[i,i]
Q, R = la.qr(X - sigma*np.eye(n))
X = R @ Q + sigma*np.eye(n)
Qall = Qall @ Q
print(X)
To compare convergence speed, count iterations until left-of-diagonal entries decay below $10^{-10}$.
la.norm(np.tril(X, -1))
la.norm(A - Qall @ X @ Qall.T, 2) / la.norm(A, 2)