Sephinroth

Interpolation (pol, Lagrange, Newton)

Sep 30th, 2020 (edited)
807
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3.  
  4. def main():
  5.     #максимальный индекс узловой точки
  6.     '''
  7.    n = int(input("n = "))
  8.    
  9.    #таблица узлов
  10.    nodes_x = np.empty(n+1)
  11.    nodes_f = np.empty(n+1)
  12.    for i in range(n+1):
  13.        nodes_x[i] = int(input("x[" + str(i) + "] ="))
  14.        nodes_f[i] = int(input("f_" + str(i) + " = "))
  15.    '''
  16.     n = 4
  17.     nodes_x = np.array([1, 2, 3, 4, 5])
  18.     nodes_f = np.array([1, 16, 81, 256, 625])  
  19.     print("\nУзловые точки\n")
  20.     print(nodes_x, end='\n')
  21.     print(nodes_f, end='\n')
  22.    
  23.     #polynomial(nodes_x, nodes_f, n)
  24.    
  25.     #построение неузловых точек для формы Лагранжа
  26.     x_to_plot = np.linspace(nodes_x[0], nodes_x[n], n*2+1)
  27.     y_to_plot = [lagrange(nodes_x, nodes_f, i) for i in x_to_plot]
  28.     print('\nЗначения функции в неузловых точках, согласно интерполянте в форме Лагранжа\n')
  29.     print(x_to_plot)
  30.     print(y_to_plot)    
  31.     plt.plot(nodes_x, nodes_f, 'o', x_to_plot, y_to_plot)
  32.     plt.suptitle("Интерполирующий многочлен")
  33.     plt.grid(True)
  34.     plt.show()
  35.    
  36.     y_to_plot.clear()
  37.    
  38.     y_to_plot = [newton(nodes_x, nodes_f, i, n) for i in
  39.                  x_to_plot]
  40.     print("\nЗначение функции в неузловых точках, согласно интерполянте в форме Ньютона\n")
  41.     print(x_to_plot)
  42.     print(y_to_plot)    
  43.    
  44. ####################################################################    
  45. def polynomial(nodes_x, nodes_f, n):    
  46.     #матрица иксов для слау
  47.     matrix = np.zeros((n+1, n+1))
  48.     for i in range(n+1):
  49.         for j in range(n+1):
  50.             matrix[i][j] = np.power(nodes_x[i], n+1-j)
  51.     print (matrix, "@")
  52.    
  53.     #вектор-столбец для слау
  54.     vector = np.zeros((n+1, 1))
  55.     for i in range(n+1):
  56.         vector[i] = nodes_f[i]
  57.     print (vector, "@")
  58. ####################################################################
  59.  
  60. ####################################################################    
  61. def lagrange(x, f, t):
  62.     L = 0
  63.     for i in range(len(f)):
  64.         const_1 = 1
  65.         const_2 = 1
  66.         for j in range(len(x)):
  67.             if j != i:
  68.                 const_1 *= (t - x[j])
  69.                 const_2 *= (x[i] - x[j])
  70.         L += (f[i] * const_1 / const_2)
  71.     return L    
  72. ####################################################################    
  73.  
  74. ####################################################################    
  75. def newton(x, y, r, n):
  76.     #x — узловые точки
  77.     #y — значения функции в узловых точках
  78.     #r — точка x, для которой находится значение функции
  79.     x.astype(float)
  80.     y.astype(float)
  81.     s = y[0]
  82.     for k in range(1, n+1):
  83.         temp = 1
  84.         for i in range(k):
  85.             temp *= (r - x[i])
  86.         temp *= fk(x, y, k)    
  87.         s += temp
  88.     return s
  89. ####################################################################    
  90.  
  91. ####################################################################    
  92. #разделенные разности
  93. def fk(x, y, k):
  94.     x.astype(float)
  95.     y.astype(float)
  96.     ans = 0
  97.     for i in range(k+1):
  98.         d = 1
  99.         for j in range(k+1):
  100.             if j != i:
  101.                 d *= (x[i] - x[j])
  102.         ans += y[i] / d        
  103.     return ans
  104. ####################################################################    
  105.  
  106.  
  107.  
  108. if __name__ == "__main__":
  109.     main()
RAW Paste Data