Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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()
Advertisement
Add Comment
Please, Sign In to add comment