kxcoze

satie4

Feb 24th, 2022 (edited)
643
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.67 KB | None | 0 0
  1. from fractions import Fraction
  2. import sympy, numpy as np
  3.  
  4. def matrix_rang(A):
  5.     return len([1 for i in A if any(i)])
  6.  
  7. def edin_matrix(n, m, A):
  8.     for i in range(n):
  9.         A[i] /= A[i][i]
  10.  
  11.     for i in range(n-1, -1, -1):
  12.         for j in range(i-1, -1, -1):
  13.             A[j] += -A[j][i]*A[i]
  14.  
  15.     return A
  16.  
  17. def svobodnie_znach(n, m, A):
  18.     res = set()
  19.     for i in range(n):
  20.         for j in range(m):
  21.             if A[i][j] != 0:
  22.                 res.add(j)
  23.                 break
  24.     return set(range(m)).difference(res)
  25.  
  26. def stupen_matrix(n, m, A):
  27.     for x in range(n):
  28.         y = x
  29.         if x < n and y < m and not A[x][y] or not any(A[x]):
  30.             A = np.append(A, [A[x]], axis=0)
  31.             A = np.delete(A, x, axis=0)
  32.         for i in range(1+x, n):
  33.             while y < m-1 and not A[x][y]:
  34.                 if A[x][y]:
  35.                     break
  36.                 y += 1
  37.             if y == m or not A[x][y]:
  38.                 continue
  39.  
  40.             K = -A[i][y]/A[x][y]
  41.             for j in range(m):
  42.                 A[i][j] = A[x][j]*K + A[i][j]
  43.  
  44.     for x in range(n):
  45.         if not any(A[x]):
  46.             A = np.append(A, [A[x]], axis=0)
  47.             A = np.delete(A, x, axis=0)
  48.     return A
  49.  
  50. def fsr(n, m, A, basisnie, svobodnie):
  51.     k = len(basisnie)
  52.     ans = np.array([m*[Fraction(0.)] for x in range(len(svobodnie))])
  53.     for ind, x in enumerate(basisnie):
  54.         for i, elem in enumerate(A[ind][k:]):
  55.             if elem != 0:
  56.                 ans[i][x] = elem
  57.     for i, x in enumerate(svobodnie):
  58.         ans[i][x] = 1
  59.     return ans
  60.  
  61. def reshit_slau(n, m, A):
  62.     A = stupen_matrix(n, m, A)
  63.     A = A[:matrix_rang(A)]
  64.     n = len(A)
  65.     svobodnie = list(svobodnie_znach(n, m, A))
  66.     basisnie = list(set(range(m)).difference(set(svobodnie)))
  67.     a = [[] for x in range(len(A))]
  68.     for i in sorted(svobodnie, reverse=True):
  69.         a = np.append(a, -1*A[:, i:i+1], axis=1)
  70.         A = np.delete(A, i, axis=1)
  71.     A = np.append(A, a[:, ::-1], axis=1)
  72.     return fsr(n, m, edin_matrix(n, m, A), basisnie, svobodnie)
  73.  
  74. def main():
  75.     var = sympy.Symbol('x')
  76.     n = int(input())
  77.     A = sympy.Matrix([[Fraction(x) for x in input().split()] for i in range(n)])
  78.     B = sympy.matrices.eye(n, n)*var
  79.     print('\nСоставляем характеристическое уравнение:')
  80.     sympy.pprint(A-B)
  81.     print()
  82.     eq = sympy.Eq(sympy.det(A-B), 0)
  83.     print('det(A − x*E)=')
  84.     sympy.pprint(eq)
  85.     print()
  86.     roots = sympy.roots(eq, var)
  87.     print('Собственные значения и их кратности:')
  88.     print(roots, '\n')
  89.     print('Матрица линейного оператора A в базисе, состоящем из собственных векторов:')
  90.     sympy.pprint(sympy.matrices.diag(*[x for x, i in sorted(roots.items()) for y in range(i)]))
  91.     print()
  92.  
  93.     result = sympy.Matrix([])
  94.     for step, root in enumerate(sorted(roots.keys()), start=1):
  95.         # Находим собственные вектора
  96.         a = reshit_slau(n, n, np.array(A - sympy.matrices.eye(n, n)*root))
  97.         # Ортонормируем собственные вектора
  98.         a = sympy.matrices.GramSchmidt(reversed([sympy.Matrix(i) for i in a]))
  99.         a = [sympy.Matrix(i)/sympy.Matrix(i).norm() for i in a]
  100.         for i in a:
  101.             result = result.col_insert(step, sympy.Matrix(i))
  102.  
  103.     print('Ортнормированный базис')
  104.     sympy.pprint(result)
  105.  
  106.     # print('\nПроверка')
  107.     # print('S^-1 * A * S = A(s)')
  108.     # sympy.pprint([result.T, '*', A, '*', result, '=', result.T*A*result])
  109.  
  110. if __name__ == '__main__':
  111.     main()
  112.  
Add Comment
Please, Sign In to add comment