GalWat

Untitled

Dec 1st, 2021
1,111
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. """
  2. Лабораторная работа №2
  3. Кудин Михаил М8О-303Б-19
  4. 17 вариант
  5. """
  6. import time
  7. from math import ceil
  8. from enum import IntEnum
  9.  
  10. import matplotlib.pyplot as plt
  11. from matplotlib.widgets import TextBox
  12. import matplotlib
  13.  
  14.  
  15. class Axis(IntEnum):
  16.     X = 0
  17.     Y = 1
  18.  
  19.  
  20. def create_basis(j_dot, dots):
  21.     def inner(x):
  22.         val = 1
  23.         for dot in dots:
  24.             if dot == j_dot:
  25.                 continue
  26.             val *= (x - dot[Axis.X]) / (j_dot[Axis.X] - dot[Axis.X])
  27.         return val * j_dot[Axis.Y]
  28.  
  29.     return inner
  30.  
  31.  
  32. class Polynomial:
  33.     def __init__(self, dots):
  34.         self.dots = dots
  35.         self.basises = []
  36.         self.recalculate_basises()
  37.  
  38.     def change_dots(self, new_dots):
  39.         self.dots = new_dots
  40.         self.recalculate_basises()
  41.  
  42.     def recalculate_basises(self):
  43.         self.basises = []
  44.  
  45.         for dot in self.dots:
  46.             self.basises.append(create_basis(dot, self.dots))
  47.  
  48.     def values(self, xs):
  49.         vals = []
  50.         for x in xs:
  51.             vals.append(sum([bas(x) for bas in self.basises]))
  52.         return vals
  53.  
  54.  
  55. class App:
  56.     def __init__(self):
  57.         self.object = Polynomial([])
  58.  
  59.         self.fig, self.ax = plt.subplots()
  60.  
  61.         self.ax.set(xlabel='x', ylabel='y')
  62.         self.ax.grid()
  63.         self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.4)
  64.         self.fig.canvas.set_window_title('ЛР 7, Кудин Михаил, вариант 14, интерполяционный многочлен Лагранжа')
  65.  
  66.         self.dot_boxes = []
  67.  
  68.         size = 0.05
  69.  
  70.         left_start = 0.1
  71.         bottom = 0.2
  72.         slide = 0.1
  73.  
  74.         for i in range(6):
  75.             x_box = self.fig.add_axes([left_start + i * slide, bottom, size, size])
  76.             x_txt_box = TextBox(x_box, "x: ")
  77.             x_txt_box.on_submit(self.redraw)
  78.             x_txt_box.set_val("0")
  79.  
  80.             y_box = self.fig.add_axes([left_start + i * slide, bottom - 0.1, size, size])
  81.             y_txt_box = TextBox(y_box, "y: ")
  82.             y_txt_box.on_submit(self.redraw)
  83.             y_txt_box.set_val("0")
  84.  
  85.             self.dot_boxes.append((x_txt_box, y_txt_box))
  86.  
  87.         plt.show()
  88.  
  89.     def get_dots(self):
  90.         values = []
  91.         for box in self.dot_boxes:
  92.             values.append((float(box[0].text), float(box[1].text)))
  93.         return values
  94.  
  95.     def redraw(self, event):
  96.         self.ax.clear()
  97.         self.ax.grid()
  98.  
  99.         dots = self.get_dots()
  100.         min_x = min([dot[0] for dot in dots]) if dots else -1
  101.         max_x = max([dot[0] for dot in dots]) if dots else 4
  102.  
  103.         x_bounds = (min_x, max_x + 0.01)
  104.         step = 0.1
  105.         steps_count = ceil((x_bounds[1] - x_bounds[0]) / step)
  106.         x_range = [x_bounds[0] + step * i for i in range(steps_count)]
  107.  
  108.         self.object.change_dots(dots)
  109.         polynomial_func = self.object.values(x_range)
  110.  
  111.         self.ax.plot(x_range, polynomial_func)
  112.         self.ax.plot([dot[0] for dot in dots], [dot[1] for dot in dots], 'ro')
  113.  
  114.         self.fig.canvas.draw()
  115.  
  116.  
  117. if __name__ == "__main__":
  118.     matplotlib.rcParams['toolbar'] = 'None'
  119.     app = App()
  120.  
RAW Paste Data