gt22

Untitled

May 14th, 2020
1,883
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.55 KB | None | 0 0
  1. import numpy as np
  2. import numpy.linalg as ln
  3. import scipy.linalg
  4.  
  5. dt = int
  6. matr = np.array([[0, 1, 0], [-4, 4, 0], [-2, 1, 2]], dtype=dt)
  7. assert matr.shape[0] == matr.shape[1]
  8. n = matr.shape[0]
  9. E = np.identity(n, dtype=dt)
  10.  
  11.  
  12. def print_matrix(m):
  13.     for i in range(m.shape[0]):
  14.         for j in range(m.shape[1]):
  15.             print(m[i, j], end=' ')
  16.         print()
  17.  
  18.  
  19. def make_cell(l, k):
  20.     return l * np.eye(k, dtype=dt) + np.eye(k, k=1, dtype=dt)
  21.  
  22.  
  23. def get_cells_for_value(l):
  24.     nilp = matr - l * E
  25.     print(f"A - {l}E:")
  26.     print_matrix(nilp)
  27.     k = n - ln.matrix_rank(nilp)
  28.     print(f"dim Ker(A - {l}E) = {k}")
  29.     cells = np.ones(k, dtype=int)
  30.     k_prev = 0
  31.     nilp_cur = nilp
  32.     p = 1
  33.     while True:
  34.         k_prev = k
  35.         p += 1
  36.         nilp_cur = nilp_cur @ nilp
  37.         k = n - ln.matrix_rank(nilp_cur)
  38.         if k == k_prev:
  39.             break
  40.         print(f"(A - {l}E)^{p}:")
  41.         print_matrix(nilp_cur)
  42.         print(f"dim Ker(A - {l}E)^{p} = {k}")
  43.         for i in range(k - k_prev):
  44.             cells[i] += 1
  45.     print(f"Cells for {l}:", end=' ')
  46.     print_matrix(cells.reshape(1, -1))
  47.     return scipy.linalg.block_diag(*[make_cell(l, x) for x in cells])
  48.  
  49.  
  50. def jordanize():
  51.     for l in np.unique(np.round(ln.eigvals(matr), 5)):
  52.         print(f"For eigenvalue {l}:")
  53.         get_cells_for_value(l)
  54.  
  55.  
  56. def main():
  57.     lambdas = np.unique(np.round(ln.eigvals(matr), 5))
  58.     print(scipy.linalg.block_diag(*[get_cells_for_value(dt(l)) for l in lambdas]))
  59.  
  60.  
  61. if __name__ == '__main__':
  62.     main()
Advertisement
Add Comment
Please, Sign In to add comment