Advertisement
GeorgiLukanov87

Gauss algorithm

Oct 31st, 2024
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.98 KB | None | 0 0
  1. import numpy as np
  2.  
  3.  
  4. def gauss_elimination(a, b):
  5.     """
  6.    Решава системата линейни уравнения Ax = b с метод на Гаус.
  7.  
  8.    Аргументи:
  9.    a -- матрицата на коефициентите (NxN)
  10.    b -- векторът с резултати (Nx1)
  11.    """
  12.     n = len(b)
  13.  
  14.     # Разширена матрица
  15.     aug_matrix = np.hstack((a, b.reshape(-1, 1)))
  16.  
  17.     # Привеждане към горнотриъгълна форма
  18.     for i in range(n):
  19.         # Намиране на максималния елемент в колоната за по-голяма стабилност
  20.         max_row = i + np.argmax(abs(aug_matrix[i:, i]))
  21.  
  22.         # Размяна на текущия ред с този с максимален елемент
  23.         aug_matrix[[i, max_row]] = aug_matrix[[max_row, i]]
  24.  
  25.         # Нормализация на реда
  26.         aug_matrix[i] = aug_matrix[i] / aug_matrix[i, i]
  27.  
  28.         # Зануляване на елементите под диагоналния елемент
  29.         for j in range(i + 1, n):
  30.             aug_matrix[j] = aug_matrix[j] - aug_matrix[i] * aug_matrix[j, i]
  31.  
  32.     # Обратно заместване
  33.     x = np.zeros(n)
  34.     for i in range(n - 1, -1, -1):
  35.         x[i] = aug_matrix[i, -1] - np.sum(aug_matrix[i, i + 1:n] * x[i + 1:n])
  36.  
  37.     return x
  38.  
  39.  
  40. # Пример
  41. a = np.array([
  42.     [1, 1, 1],
  43.     [2, 3, 5],
  44.     [4, 0, 5]], dtype=float)
  45.  
  46. b = np.array([5, 8, 2], dtype=float)
  47.  
  48. solution = gauss_elimination(a, b)
  49. print("Решението x е:", solution)
  50.  
  51.  
  52.  
  53.  
  54. def gauss_elimination(A, b):
  55.     """
  56.    Решава система линейни уравнения Ax = b използвайки метода на Гаус
  57.  
  58.    Параметри:
  59.    A (numpy.array): Матрица на коефициентите
  60.    b (numpy.array): Вектор на свободните членове
  61.  
  62.    Връща:
  63.    numpy.array: Решение на системата
  64.    """
  65.     # Превръщаме входните данни в numpy масиви
  66.     A = np.array(A, dtype=np.float64)
  67.     b = np.array(b, dtype=np.float64)
  68.     n = len(A)
  69.  
  70.     # Разширена матрица [A|b]
  71.     Ab = np.concatenate((A, b.reshape(n, 1)), axis=1)
  72.  
  73.     # Права стъпка (елиминация)
  74.     for i in range(n):
  75.         # Намираме максималния елемент в текущата колона за частично пивотиране
  76.         pivot_row = i + np.argmax(abs(Ab[i:, i]))
  77.         if pivot_row != i:
  78.             Ab[i], Ab[pivot_row] = Ab[pivot_row].copy(), Ab[i].copy()
  79.  
  80.         pivot = Ab[i, i]
  81.         if abs(pivot) < 1e-10:
  82.             raise ValueError("Матрицата е сингулярна или почти сингулярна")
  83.  
  84.         # Нормализиране на текущия ред
  85.         Ab[i] = Ab[i] / pivot
  86.  
  87.         # Елиминиране на елементите под главния диагонал
  88.         for j in range(i + 1, n):
  89.             multiplier = Ab[j, i]
  90.             Ab[j] = Ab[j] - multiplier * Ab[i]
  91.  
  92.     # Обратна стъпка (обратна субституция)
  93.     x = np.zeros(n)
  94.     for i in range(n - 1, -1, -1):
  95.         x[i] = Ab[i, -1] - np.sum(Ab[i, i + 1:n] * x[i + 1:])
  96.  
  97.     return x
  98.  
  99.  
  100. # Пример за използване:
  101. def example_usage():
  102.     # Система:
  103.     # 2x + y - z = 8
  104.     # -3x - y + 2z = -11
  105.     # -2x + y + 2z = -3
  106.  
  107.     A = [
  108.         [1, 1, 1],
  109.         [2, 3, 5],
  110.         [4, 0, 5]
  111.     ]
  112.     b = [5, 8, 2]
  113.  
  114.     try:
  115.         solution = gauss_elimination(A, b)
  116.         print("Решение:", solution)
  117.  
  118.         # Проверка на решението
  119.         print("\nПроверка (Ax = b):")
  120.         print("Ax =", np.dot(A, solution))
  121.         print("b =", b)
  122.  
  123.     except ValueError as e:
  124.         print("Грешка:", e)
  125.  
  126.  
  127. if __name__ == "__main__":
  128.     example_usage()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement