kxcoze

new_test2

Feb 20th, 2022 (edited)
827
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.17 KB | None | 0 0
  1. from fractions import Fraction as f
  2.  
  3. import numpy as np, numpy.linalg as lg
  4. import sympy as s
  5. from sympy import pprint
  6.  
  7.  
  8. class GramGauss:
  9.  
  10.     def __init__(self, n, m, a):
  11.         self._n = n
  12.         self.m = m
  13.         self.a = np.array(a)
  14.  
  15.     @property
  16.     def n(self):
  17.         return len(self.a)
  18.  
  19.  
  20.     def ladder(self):
  21.         # Приводим к ступенчатому виду
  22.         # Ведущая строка k, Ведущий элемент q
  23.         for k in range(self.n):
  24.  
  25.             q = k
  26.             if k < self.n and q < self.m and not self.a[k][q] or not any(self.a[k]):
  27.                 self.a = np.append(self.a, [self.a[k]], axis=0)
  28.                 self.a = np.delete(self.a, k, axis=0)
  29.  
  30.             for i in range(1+k, self.n):
  31.                 # Проверка ведущего элемента на 0
  32.                 while q < self.m-1 and not self.a[k][q]:
  33.                     if self.a[k][q]:
  34.                         break
  35.                     q += 1
  36.                 # Если строка состоит из нулей или элемент равен нулю - продолжаем
  37.                 if q == self.m or not self.a[k][q]:
  38.                     continue
  39.  
  40.                 x = -self.a[i][q]/self.a[k][q]
  41.                 for j in range(self.m):
  42.                     self.a[i][j] = self.a[k][j]*x + self.a[i][j]
  43.  
  44.         # Проверка нулевых строк
  45.         for k in range(self.n):
  46.             if not any(self.a[k]):
  47.                 self.a = np.append(self.a, [self.a[k]], axis=0)
  48.                 self.a = np.delete(self.a, k, axis=0)
  49.         return self.a
  50.  
  51.  
  52.     def find_free_variables(self):
  53.         # Находим свободные переменные
  54.         ans = set()
  55.         for i in range(self.n):
  56.             for j in range(self.m):
  57.                 if self.a[i][j] != 0:
  58.                     ans.add(j)
  59.                     break
  60.         return set(range(self.m)).difference(ans)
  61.  
  62.  
  63.     def identity_matrix(self):
  64.         # Преобразуем матрицу до черты в единичную
  65.         # Делим строки на ведущие элементы
  66.         for i in range(self.n):
  67.             self.a[i] /= self.a[i][i]
  68.  
  69.         for i in range(self.n-1, -1, -1):
  70.             for j in range(i-1, -1, -1):
  71.                 self.a[j] += -self.a[j][i]*self.a[i]
  72.  
  73.         return self.a
  74.  
  75.     def general_solution(self):
  76.         # Общее решение СЛАУ
  77.         k = len(self.general)
  78.         ans = self.m*[0]
  79.         for i, x in enumerate(self.free):
  80.             ans[x] = s.Symbol(f'x{x+1}')
  81.  
  82.         for ind, x in enumerate(self.general):
  83.             res = []
  84.             for i, elem in enumerate(self.a[ind][k:]):
  85.                 if elem != 0:
  86.                     res.append(s.Symbol(f'x{self.free[i]+1}')*elem)
  87.             ans[x] = sum(res)
  88.  
  89.  
  90.         return np.array([ans]).T
  91.  
  92.     def fundamental_solution(self):
  93.         # ФСР СЛАУ
  94.         k = len(self.general)
  95.         ans = np.array([self.m*[f(0.)] for x in range(len(self.free))])
  96.  
  97.         for ind, x in enumerate(self.general):
  98.             for i, elem in enumerate(self.a[ind][k:]):
  99.                 if elem != 0:
  100.                     ans[i][x] = elem
  101.         for i, x in enumerate(self.free):
  102.             ans[i][x] = 1
  103.         return ans
  104.  
  105.     def format_mat(self, x):
  106.         # Форматируем вывод матрицы
  107.         return np.array([[f'{i}' for i in x] for x in x])
  108.  
  109.     def matrix_rank(self):
  110.         # Если матрица в ступенчатом виде
  111.         return len([1 for i in self.a if any(i)])
  112.  
  113.     def gram(self):
  114.         # Процесс ортогонализации Грама-Шмидта
  115.         b = np.array([[f(0)]*self.m for x in range(self.n)])
  116.         b[0] = self.a[0]
  117.         for i in range(1, self.n):
  118.             b[i] = self.a[i] + sum([(-np.dot(self.a[i], b[j])/np.dot(b[j], b[j]))*b[j] for j in range(i)])
  119.         return b
  120.  
  121.     def solve(self):
  122.         self.a = self.ladder()
  123.         print()
  124.         print(self.format_mat(self.a))
  125.         print()
  126.         self.rank = self.matrix_rank()
  127.         self.free = list(self.find_free_variables())
  128.         self.a = self.a[:self.rank]
  129.         self.general = list(set(range(self.m)).difference(set(self.free)))
  130.  
  131.         count_free = len(self.free)
  132.         new_a = [[] for x in range(len(self.a))]
  133.         for i in sorted(self.free, reverse=True):
  134.             new_a = np.append(new_a, -1*self.a[:, i:i+1], axis=1)
  135.             self.a = np.delete(self.a, i, axis=1)
  136.         self.a = np.append(self.a, new_a[:, ::-1], axis=1)
  137.         self.a = self.identity_matrix()
  138.         print(self.format_mat(self.a))
  139.         print()
  140.  
  141.         print("Общее решение матрицы:")
  142.         print(self.general_solution())
  143.         print()
  144.  
  145.         self.a = self.fundamental_solution()
  146.         print("ФСР СЛАУ:")
  147.         print(self.format_mat(self.a.T))
  148.         print()
  149.  
  150.         print("Ортогональный базис пространства решений:")
  151.         print(self.format_mat(self.gram().T))
  152.         print()
  153.         a_copy = [s.Matrix(x) for x in self.a]
  154.         pprint(s.matrices.GramSchmidt(a_copy))
  155.  
  156.     def silent_solve(self):
  157.         self.a = self.ladder()
  158.         self.rank = self.matrix_rank()
  159.         self.free = list(self.find_free_variables())
  160.         self.a = self.a[:self.rank]
  161.         self.general = list(set(range(self.m)).difference(set(self.free)))
  162.         count_free = len(self.free)
  163.         new_a = [[] for x in range(len(self.a))]
  164.         for i in sorted(self.free, reverse=True):
  165.             new_a = np.append(new_a, -1*self.a[:, i:i+1], axis=1)
  166.             self.a = np.delete(self.a, i, axis=1)
  167.         self.a = np.append(self.a, new_a[:, ::-1], axis=1)
  168.         self.a = self.identity_matrix()
  169.         self.a = self.fundamental_solution()
  170.         return self.a
  171.         #return self.gram()
  172.  
  173.  
  174. def main():
  175.     n = int(input('Введите кол-во уравнений: '))
  176.     a = np.array([[f(x) for x in input().split()] for i in range(n)])
  177.     m = len(a[0])
  178.     g = GramGauss(n, m, a)
  179.     g.solve()
  180.  
  181. if __name__ == '__main__':
  182.     main()
  183.  
Advertisement
Add Comment
Please, Sign In to add comment