Advertisement
myloyo

№7 Метод прогонки решения СЛАУ с трёхдиагональной матрицей коэффициентов

Nov 20th, 2024
484
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.49 KB | None | 0 0
  1. import numpy as np
  2.  
  3.  
  4. def tridiagonal_algorithm(a, b, c, d):
  5.     n = len(a)
  6.     p = [0] * (n + 1)
  7.     q = [0] * (n + 1)
  8.  
  9.     # Прямая прогонка
  10.     for i in range(n):
  11.         denominator = b[i] - a[i] * p[i]
  12.         if abs(denominator) < 1e-6:
  13.             raise ValueError("Деление на ноль или почти ноль в прогонке.")
  14.         p[i + 1] = c[i] / denominator
  15.         q[i + 1] = (a[i] * q[i] - d[i]) / denominator
  16.  
  17.     print("Прямая прогонка:")
  18.     for i in range(1, n):
  19.         print(f"(P{i}, Q{i}) = ({p[i]:.4f}, {q[i]:.4f})")
  20.     print(f"(Q{n}) = ({q[n]:.4f})\n")
  21.  
  22.     # Обратная прогонка
  23.     res = [0] * n
  24.     res[-1] = q[n]
  25.     for i in range(n - 2, -1, -1):
  26.         res[i] = p[i + 1] * res[i + 1] + q[i + 1]
  27.  
  28.     return res
  29.  
  30. n = 5
  31. v = 8.0
  32.  
  33. A = np.zeros((n, n))
  34. for i in range(n):
  35.     for j in range(max(0, i - 1), min(i + 2, n)):
  36.         A[i][j] = (v + i) / 100
  37.     A[i][i] = v + i
  38.  
  39. V = np.array([v + i for i in range(n)])
  40.  
  41. B = np.dot(A, V)
  42.  
  43. print("Расширенная матрица A|B:")
  44. for i in range(n):
  45.     print("\t".join(f"{A[i][j]:.4f}" for j in range(n)), "|", f"{B[i]:.4f}")
  46. print()
  47.  
  48. a = [0] * n
  49. b = [0] * n
  50. c = [0] * n
  51. d = B.tolist()
  52. for i in range(n):
  53.     if i > 0:
  54.         a[i] = A[i][i - 1]
  55.     b[i] = -A[i][i]
  56.     if i < n - 1:
  57.         c[i] = A[i][i + 1]
  58.  
  59. X = tridiagonal_algorithm(a, b, c, d)
  60.  
  61. print("Решение СЛАУ:")
  62. print("\t".join(f"{x:.4f}" for x in X))
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement