Advertisement
myloyo

№4 интерполяционный многочлен методом кубического сплайна

Oct 24th, 2024 (edited)
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.30 KB | None | 0 0
  1. import numpy as np
  2.  
  3. # Функция для метода Гаусса
  4. def gauss_method(A, b):
  5.     n = len(b)
  6.     # Прямой ход
  7.     for i in range(n):
  8.         # Поиск максимального элемента для избежания деления на малые числа
  9.         max_row = i + np.argmax(np.abs(A[i:, i]))
  10.         A[[i, max_row]] = A[[max_row, i]]  # Меняем строки
  11.         b[[i, max_row]] = b[[max_row, i]]
  12.  
  13.         # Нормализуем строку
  14.         div = A[i, i]
  15.         A[i] /= div
  16.         b[i] /= div
  17.  
  18.         # Вычитаем текущую строку из нижележащих
  19.         for j in range(i + 1, n):
  20.             factor = A[j, i]
  21.             A[j] -= factor * A[i]
  22.             b[j] -= factor * b[i]
  23.  
  24.     # Печать состояния матрицы после прямого хода
  25.     print(f"\nМатрица после прямого хода:")
  26.     extended_matrix = np.hstack([A, b.reshape(-1, 1)])
  27.     for row in extended_matrix:
  28.         for elem in row:
  29.             print(f"{elem:>7.2f}", end=" ")
  30.         print()
  31.  
  32.     # обратный ход
  33.     x = np.zeros(n)
  34.     for i in range(n - 1, -1, -1):
  35.         x[i] = (b[i] - np.dot(A[i, i + 1:], x[i + 1:])) / A[i, i]
  36.  
  37.     print("\nОбратный ход:")
  38.     for elem in x:
  39.         print(f"{elem:>7.2f}", end=" ")
  40.     print()
  41.  
  42.     return x
  43.  
  44. x = [0, 1, 2, 3]
  45. f = [8, 9, 16, 43]
  46. n = len(x) - 1
  47.  
  48. # расширенная матрица СЛАУ
  49. A = np.zeros((4 * n, 4 * n))
  50. b = np.zeros(4 * n)
  51.  
  52.  
  53. # высчитываем значения, сначала в узлах a_i = f(x_i)
  54. row = 0
  55. for i in range(n):
  56.     A[row, 4 * i] = 1
  57.     b[row] = f[i]
  58.     row += 1
  59.  
  60. # затем на концах отрезков
  61. for i in range(n):
  62.     h = x[i + 1] - x[i]
  63.     A[row, 4 * i] = 1
  64.     A[row, 4 * i + 1] = h
  65.     A[row, 4 * i + 2] = h ** 2
  66.     A[row, 4 * i + 3] = h ** 3
  67.     b[row] = f[i + 1]
  68.     row += 1
  69.  
  70. # уравнения для непрерывности первой производной
  71. for i in range(n - 1):
  72.     h = x[i + 1] - x[i]
  73.     A[row, 4 * i + 1] = 1
  74.     A[row, 4 * i + 2] = 2 * h
  75.     A[row, 4 * i + 3] = 3 * h ** 2
  76.     A[row, 4 * (i + 1) + 1] = -1
  77.     row += 1
  78.  
  79. # уравнения для непрерывности второй производной
  80. for i in range(n - 1):
  81.     h = x[i + 1] - x[i]
  82.     A[row, 4 * i + 2] = 2
  83.     A[row, 4 * i + 3] = 6 * h
  84.     A[row, 4 * (i + 1) + 2] = -2
  85.     row += 1
  86.  
  87. # граничные условия: вторая производная на концах равна 0
  88. A[row, 2] = 2
  89. row += 1
  90. A[row, 4 * (n - 1) + 2] = 2
  91. A[row, 4 * (n - 1) + 3] = 6 * (x[n] - x[n - 1])
  92.  
  93. print("Таблица функции:")
  94. for i in range(len(x)):
  95.     print(f"{x[i]:>7.2f}", end=" ")
  96. print()
  97. for i in range(len(f)):
  98.     print(f"{f[i]:>7.2f}", end=" ")
  99. print()
  100.  
  101. print("\nРасширенная матрица СЛАУ:")
  102. extended_matrix = np.hstack([A, b.reshape(-1, 1)])
  103. for row in extended_matrix:
  104.     for elem in row:
  105.         print(f"{elem:>7.2f}", end=" ")
  106.     print()
  107.  
  108. A_copy = A.copy()
  109. b_copy = b.copy()
  110. solution = gauss_method(A_copy, b_copy)
  111.  
  112. print("\nРешение СЛАУ:")
  113. for elem in solution:
  114.     print(f"{elem:>7.2f}", end=" ")
  115. print()
  116.  
  117.  
  118. # функция для вычисления значения сплайна в точке x
  119. def spline_value(x_val, coeffs, x_points, index):
  120.     a, b, c, d = coeffs[4 * index: 4 * index + 4]
  121.     h = x_val - x_points[index]
  122.     return a + b * h + c * h ** 2 + d * h ** 3
  123.  
  124.  
  125. # точки для интерполяции (узлы, середины, конец отрезков)
  126. interp_points = []
  127. for i in range(n):
  128.     interp_points.append(x[i])
  129.     interp_points.append((x[i] + x[i + 1]) / 2)
  130. interp_points.append(x[n])
  131.  
  132. # вычисление значений интерполяции
  133. interp_values = []
  134. for point in interp_points:
  135.     index = min(n - 1, max(0, np.searchsorted(x, point) - 1))
  136.     interp_values.append(spline_value(point, solution, x, index))
  137.  
  138. # Вывод результатов с форматированием
  139. print("\nТаблица интерполянты:")
  140. for point in interp_points:
  141.     print(f"{point:>7.2f}", end=" ")
  142. print()
  143. for value in interp_values:
  144.     print(f"{value:>7.2f}", end=" ")
  145. print()
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement