import numpy as np
import numpy.linalg as ln
import scipy.linalg
dt = int
matr = np.array([[0, 1, 0], [-4, 4, 0], [-2, 1, 2]], dtype=dt)
assert matr.shape[0] == matr.shape[1]
n = matr.shape[0]
E = np.identity(n, dtype=dt)
def print_matrix(m):
for i in range(m.shape[0]):
for j in range(m.shape[1]):
print(m[i, j], end=' ')
print()
def make_cell(l, k):
return l * np.eye(k, dtype=dt) + np.eye(k, k=1, dtype=dt)
def get_cells_for_value(l):
nilp = matr - l * E
print(f"A - {l}E:")
print_matrix(nilp)
k = n - ln.matrix_rank(nilp)
print(f"dim Ker(A - {l}E) = {k}")
cells = np.ones(k, dtype=int)
k_prev = 0
nilp_cur = nilp
p = 1
while True:
k_prev = k
p += 1
nilp_cur = nilp_cur @ nilp
k = n - ln.matrix_rank(nilp_cur)
if k == k_prev:
break
print(f"(A - {l}E)^{p}:")
print_matrix(nilp_cur)
print(f"dim Ker(A - {l}E)^{p} = {k}")
for i in range(k - k_prev):
cells[i] += 1
print(f"Cells for {l}:", end=' ')
print_matrix(cells.reshape(1, -1))
return scipy.linalg.block_diag(*[make_cell(l, x) for x in cells])
def jordanize():
for l in np.unique(np.round(ln.eigvals(matr), 5)):
print(f"For eigenvalue {l}:")
get_cells_for_value(l)
def main():
lambdas = np.unique(np.round(ln.eigvals(matr), 5))
print(scipy.linalg.block_diag(*[get_cells_for_value(dt(l)) for l in lambdas]))
if __name__ == '__main__':
main()
Comments