Advertisement
575

lab3_3

575
Oct 10th, 2022
855
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.36 KB | None | 0 0
  1. #LU-разложение
  2. def get_LU(A):
  3.     n = np.shape(A)[0]
  4.     for i in range(n - 1):
  5.         for j in range(i + 1, n):
  6.             c = A[j][i] / A[i][i]
  7.             A[j][i] = c
  8.             for k in range(i+1, n):
  9.                 A[j][k] -= c * A[i][k]
  10.  
  11.     return A
  12.  
  13. # Решение СЛАУ
  14. def Solve(LU, b):
  15.     n = LU.shape[0]
  16.     x = np.zeros(n)
  17.     y = np.zeros(n)
  18.  
  19.     # Прямой ход: решение Lz=b
  20.     def sum_y(i):
  21.         res = 0
  22.         for k in range(n):
  23.             res += LU[i, k] * y[k]
  24.         return res
  25.  
  26.     for i in range(n):
  27.         y[i] = b[i] - sum_y(i)
  28.  
  29.     # Обратный ход: решение Ux=z
  30.     def sum_x(i):
  31.         res = 0
  32.         for j in range(i, n):
  33.             res += LU[i, j]*x[j]
  34.         return res
  35.  
  36.     for i in reversed(range(n)):
  37.         x[i] = (y[i] - sum_x(i))/LU[i, i]
  38.  
  39.     return x
  40.  
  41. def MNK1(X, f):
  42.     n = np.shape(X)[0]
  43.  
  44.     A = np.array([[n, np.sum(X)],
  45.                  [np.sum(X), np.sum(X*X)]])
  46.     b = np.array([[np.sum(f)],
  47.                   [np.sum(X*f)]])
  48.  
  49.     return Solve(get_LU(A), b)
  50.  
  51. def MNK2(X, f):
  52.     n = np.shape(X)[0]
  53.  
  54.     A = np.array([[n, np.sum(X), np.sum(X*X)],
  55.                   [np.sum(X), np.sum(X*X), np.sum(X*X*X)],
  56.                   [np.sum(X*X), np.sum(X*X*X), np.sum(X*X*X*X)]])
  57.     b = np.array([[np.sum(f)],
  58.                   [np.sum(X*f)],
  59.                   [np.sum(X*X*f)]])
  60.  
  61.     return Solve(get_LU(A), b)
  62.  
  63. def Error(f, polinom):
  64.     return np.sqrt(np.sum((polinom-f)**2))
  65.  
  66. Xi = np.array([-0.7, -0.4, -0.1, 0.2, 0.5, 0.8])
  67. fi = np.array([-0.7754, -0.41152, -0.10017, 0.20136, 0.5236, 0.9273])
  68.  
  69. a1_0, a1_1 = MNK1(Xi, fi)
  70. a2_0, a2_1, a2_2 = MNK2(Xi, fi)
  71.  
  72. x = np.arange(-0.7, 0.8, 0.01)
  73. print("Сумма квадратов ошибок:")
  74. print("Для многочлена 1 степени:", Error(fi, np.array([float(a1_0+a1_1*xk) for xk in Xi])))
  75. print("Для многочлена 2 степени:", Error(fi, np.array([float(a2_0+a2_1*xk+a2_2*xk*xk) for xk in Xi])))
  76.  
  77. plt.figure(figsize=(12, 7))
  78. plt.scatter(Xi, fi, color="black", s=25)
  79. plt.plot(x, [float(a1_0+a1_1*xk) for xk in x], label='Многочлен 1 степени', linewidth=1, color="blue")
  80. plt.plot(x, [float(a2_0+a2_1*xk+a2_2*xk*xk) for xk in x], label='Многочлен 2 степени', linewidth=1, color="red")
  81. plt.grid()
  82. plt.legend()
  83. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement