Advertisement
Tvor0zhok

Interpolate Lagrange

Sep 26th, 2021 (edited)
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. ##########################################
  2. #
  3. # ЧИСЛЕННЫЕ МЕТОДЫ. ПОСТРОЕНИЕ И АНАЛИЗ
  4. # ЗАДАНИЕ №1
  5. #
  6. ##########################################
  7.  
  8. #!/usr/bin/env python
  9. # -*- coding: utf-8 -*-
  10. # vim:fileencoding=utf-8
  11.  
  12. import matplotlib.pyplot as plt
  13. from math import sqrt, sin, log, ceil
  14.  
  15. # вычисление значения функции f_k(x) в точке x
  16. def f (k: int, x: float):
  17. if sin(k * x) > 0:
  18. return log(sin(k*x)) / k / k / k
  19. else:
  20. return 0
  21.  
  22.  
  23. # интерполяция методом Лагранжа (вычисление PL(x0))
  24. def PL (n0 : int, x : [float], y : [float], x0 : float):
  25. y0 = 0.0
  26.  
  27. for i in range(n0):
  28. l = 1.0
  29.  
  30. for j in range(n0):
  31. if i == j:
  32. continue
  33. else:
  34. l *= (x0 - x[j]) / (x[i] - x[j])
  35.  
  36. y0 += l*y[i]
  37.  
  38. return y0
  39.  
  40. # заданная точность EPS и N = N(EPS) - число итераций при суммировании ряда
  41. EPS = 1e-5
  42. N = ceil(sqrt(1 / 2 / EPS))
  43.  
  44. # отрезок [a, b] и число точек n0
  45. n0 = 11
  46. a = 1; b = 2
  47.  
  48. # шаг изменения точек x из [a, b]
  49. h = (b - a) / (n0 - 1)
  50.  
  51. # узлы интерполирования и значения функции
  52. x = [a + i*h for i in range(n0)]
  53. y = [0.0 for i in range(n0)]
  54.  
  55. # подсчет значений
  56. for i in range(n0):
  57. for j in range(1, N + 1):
  58. y[i] += f(j, x[i])
  59.  
  60. # создаём координатную плоскость
  61. fig = plt.subplots()
  62. # узлы интерполирования (точки (x, y)) изображаются на рисунке
  63. plt.scatter(x, y)
  64.  
  65. # увеличиваем число точек чтобы графики были точными и красивыми
  66. # ищем новое число точек таким образом, чтобы оно было больше заданного числа count
  67. count = 101; n = n0
  68.  
  69. while n < count:
  70. n += n - 1
  71. h /= 2.0
  72.  
  73. # точки, по которым будет строиться графики
  74.  
  75. xnew = [a + i*h for i in range(n)] # координаты x
  76. ynew1 = [PL(n0, x, y, x0) for x0 in xnew] # значения PL(x), x <- xnew
  77. ynew2 = [0.0 for i in range(n)] # значения f(x), x <- xnew
  78.  
  79. for i in range(n):
  80. for j in range(1, N + 1):
  81. ynew2[i] += f(j, xnew[i])
  82.  
  83. # рисуем графики (соединяя точки прямыми)
  84.  
  85. plt.plot(xnew, ynew1) # график многочлена Лагранжа
  86. plt.plot(xnew, ynew2) # график функции
  87.  
  88. # показываем график
  89. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement