Advertisement
ms_shnits

Решение СЛАУ методом Гаусса

May 17th, 2018
5,948
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.74 KB | None | 0 0
  1. #python 3.5.2
  2.  
  3. #https://otvet.mail.ru/question/208454744
  4.  
  5. # --- исходные данные
  6. myA = [
  7.        [ 1.0, -2.0,  3.0,  -4.0],
  8.        [ 3.0,  3.0, -5.0,  -1.0],
  9.        [ 3.0,  0.0,  3.0, -10.0],
  10.        [-2.0,  1.0,  2.0,  -3.0]
  11.        ]
  12.  
  13. myB = [
  14.         2.0,
  15.        -3.0,
  16.         8.0,
  17.         5.0]
  18. # --- end of исходные данные
  19.  
  20.  
  21. # --- вывод системы на экран
  22. def FancyPrint(A, B, selected):
  23.     for row in range(len(B)):
  24.         print("(", end='')
  25.         for col in range(len(A[row])):
  26.             print("\t{1:10.2f}{0}".format(" " if (selected is None or selected != (row, col)) else "*", A[row][col]),
  27.                   end='')
  28.         print("\t) * (\tX{0}) = (\t{1:10.2f})".format(row+1, B[row]))
  29. # --- end of вывод системы на экран
  30.  
  31.  
  32. # --- перемена местами двух строк системы
  33. def SwapRows (A, B, row1, row2):
  34.     A[row1], A[row2] = A[row2], A[row1]
  35.     B[row1], B[row2] = B[row2], B[row1]
  36. # --- end of перемена местами двух строк системы
  37.  
  38.  
  39. # --- деление строки системы на число
  40. def DivideRow (A, B, row, divider):
  41.     A[row] = [a / divider for a in A[row]]
  42.     B[row] /= divider
  43. # --- end of деление строки системы на число
  44.  
  45.  
  46. # --- сложение строки системы с другой строкой, умноженной на число
  47. def CombineRows (A, B, row, source_row, weight):
  48.     A[row] = [(a + k * weight) for a,k in zip(A[row], A[source_row])]
  49.     B[row] += B[source_row] * weight
  50. # --- end of сложение строки системы с другой строкой, умноженной на число
  51.  
  52.  
  53. # --- решение системы методом Гаусса (приведением к треугольному виду)
  54. def Gauss (A, B):
  55.  
  56.     column = 0
  57.     while(column < len(B)):
  58.    
  59.         print ("Ищем максимальный по модулю элемент в {0}-м столбце:".format(column+1))
  60.         current_row = None
  61.         for r in range(column, len(A)):
  62.             if current_row is None or abs(A[r][column]) > abs(A[current_row][column]):
  63.                 current_row = r
  64.         if current_row is None:
  65.             print ("решений нет")
  66.             return None
  67.         FancyPrint (A, B, (current_row, column))
  68.    
  69.         if current_row != column:
  70.             print ("Переставляем строку с найденным элементом повыше:")
  71.             SwapRows (A, B, current_row, column)
  72.             FancyPrint(A, B, (column, column))
  73.  
  74.         print ("Нормализуем строку с найденным элементом:")
  75.         DivideRow (A, B, column, A[column][column])
  76.         FancyPrint(A, B, (column, column))
  77.        
  78.         print("Обрабатываем нижележащие строки:")
  79.         for r in range(column+1, len(A)):
  80.             CombineRows(A, B, r, column, -A[r][column])
  81.         FancyPrint(A, B, (column, column))
  82.        
  83.         column += 1
  84.        
  85.     print("Матрица приведена к треугольному виду, считаем решение")
  86.     X = [0 for b in B]
  87.     for i in range(len(B)-1, -1, -1):
  88.         X[i] = B[i] - sum(x*a for x,a in zip(X[(i+1):], A[i][(i+1):]))
  89.    
  90.     print("Получили ответ:")
  91.     print( "\n".join("X{0} =\t{1:10.2f}".format(i+1,x) for i,x in enumerate(X)) )
  92.    
  93.     return X
  94. # --- end of решение системы методом Гаусса (приведением к треугольному виду)
  95.  
  96.  
  97.  
  98. print("Исходная система:")
  99. FancyPrint(myA, myB, None)
  100.  
  101. print("Решаем:")
  102. Gauss (myA, myB)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement