Advertisement
UsSe3wa

Untitled

Apr 16th, 2025
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.71 KB | None | 0 0
  1. # MatveyPanchenko DSAI-03
  2. import sympy as sp, math
  3.  
  4. def rref(M, e=1e-12):
  5.     A, m, n, r, c, piv = [row[:] for row in M], len(M), len(M[0]), 0, 0, []
  6.     while r < m and c < n:
  7.         k = next((i for i in range(r, m) if abs(A[i][c]) > e), None)
  8.         if k is None: c += 1; continue
  9.         A[r], A[k] = A[k], A[r]
  10.         d = A[r][c]; A[r] = [x / d for x in A[r]]
  11.         for i in range(m):
  12.             if i != r and abs(A[i][c]) > e:
  13.                 f = A[i][c]; A[i] = [u - f * v for u, v in zip(A[i], A[r])]
  14.         piv.append(c); r += 1; c += 1
  15.     return A, piv
  16.  
  17. def null_space(M):
  18.     R, piv = rref(M); n = len(R[0]); free = [j for j in range(n) if j not in piv]
  19.     if not free: return [[0]*n]
  20.     B = []
  21.     for f in free:
  22.         v = [0]*n; v[f] = 1
  23.         for i, p in enumerate(piv): v[p] = -R[i][f]
  24.         B.append(v)
  25.     return B
  26.  
  27. si = lambda A, l: [[A[i][j] - (l if i == j else 0) for j in range(3)] for i in range(3)]
  28.  
  29. def char_coeffs(A):
  30.     a, b, c = A[0]; d, e, f = A[1]; g, h, i = A[2]
  31.     tr = a + e + i
  32.     s2 = a*e + a*i + e*i - b*d - c*g - f*h
  33.     det = a*(e*i - f*h) - b*(d*i - f*g) + c*(d*h - e*g)
  34.     return 1, -tr, s2, -det
  35.  
  36. A = [list(map(float, input().split())) for _ in range(3)]
  37. p = char_coeffs(A)
  38. λ = sp.symbols('λ')
  39. poly = p[0]*λ**3 + p[1]*λ**2 + p[2]*λ + p[3]
  40. vals = [complex(sp.N(v)) for v in sp.solve(poly, λ)]
  41. vals = [v.real if abs(v.imag) < 1e-10 else v for v in vals]
  42.  
  43. print("Eigenvalues:")
  44. for v in vals:
  45.     print(v)
  46.  
  47. print("Eigenvectors:")
  48. for l in vals:
  49.     v = next((u for u in null_space(si(A, l)) if any(abs(x) > 1e-12 for x in u)), [0]*3)
  50.     n = math.sqrt(sum(abs(x)**2 for x in v))
  51.     v = [x / n for x in v] if n > 1e-12 else v
  52.     print(v)
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement