Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # MatveyPanchenko DSAI-03
- import sympy as sp, math
- def rref(M, e=1e-12):
- A, m, n, r, c, piv = [row[:] for row in M], len(M), len(M[0]), 0, 0, []
- while r < m and c < n:
- k = next((i for i in range(r, m) if abs(A[i][c]) > e), None)
- if k is None: c += 1; continue
- A[r], A[k] = A[k], A[r]
- d = A[r][c]; A[r] = [x / d for x in A[r]]
- for i in range(m):
- if i != r and abs(A[i][c]) > e:
- f = A[i][c]; A[i] = [u - f * v for u, v in zip(A[i], A[r])]
- piv.append(c); r += 1; c += 1
- return A, piv
- def null_space(M):
- R, piv = rref(M); n = len(R[0]); free = [j for j in range(n) if j not in piv]
- if not free: return [[0]*n]
- B = []
- for f in free:
- v = [0]*n; v[f] = 1
- for i, p in enumerate(piv): v[p] = -R[i][f]
- B.append(v)
- return B
- si = lambda A, l: [[A[i][j] - (l if i == j else 0) for j in range(3)] for i in range(3)]
- def char_coeffs(A):
- a, b, c = A[0]; d, e, f = A[1]; g, h, i = A[2]
- tr = a + e + i
- s2 = a*e + a*i + e*i - b*d - c*g - f*h
- det = a*(e*i - f*h) - b*(d*i - f*g) + c*(d*h - e*g)
- return 1, -tr, s2, -det
- A = [list(map(float, input().split())) for _ in range(3)]
- p = char_coeffs(A)
- λ = sp.symbols('λ')
- poly = p[0]*λ**3 + p[1]*λ**2 + p[2]*λ + p[3]
- vals = [complex(sp.N(v)) for v in sp.solve(poly, λ)]
- vals = [v.real if abs(v.imag) < 1e-10 else v for v in vals]
- print("Eigenvalues:")
- for v in vals:
- print(v)
- print("Eigenvectors:")
- for l in vals:
- v = next((u for u in null_space(si(A, l)) if any(abs(x) > 1e-12 for x in u)), [0]*3)
- n = math.sqrt(sum(abs(x)**2 for x in v))
- v = [x / n for x in v] if n > 1e-12 else v
- print(v)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement