Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.78 KB | None | 0 0
  1. from tkinter import *
  2. from tkinter import messagebox
  3. from tkinter import ttk
  4. from tkinter import Text
  5. from tkinter import filedialog
  6.  
  7. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
  8. from matplotlib.figure import Figure
  9.  
  10. import numpy as np
  11. import matplotlib
  12.  
  13. from tools import get_x_dots_optimal, get_y_dots_optimal, get_additional_dots, calculate_polynomial
  14.  
  15. matplotlib.use('TkAgg')
  16.  
  17. window_width = 1500
  18. window_height = 900
  19. root = Tk()
  20. root.title("Вычисление первого полинома Ньютона")
  21. root.geometry(f'{window_width}x{window_height}')
  22.  
  23. tab_control = ttk.Notebook(root)
  24.  
  25. reading_console_tab = ttk.Frame(tab_control)
  26. tab_control.add(reading_console_tab, text='Считывание с консоли')
  27. tab_control.pack(expand=1, fill='both')
  28.  
  29. example_tab = ttk.Frame(tab_control)
  30. tab_control.add(example_tab, text='Эталонный пример')
  31. tab_control.pack(expand=1, fill='both')
  32.  
  33. reading_file_tab = ttk.Frame(tab_control)
  34. tab_control.add(reading_file_tab, text='Считывание с файла')
  35. tab_control.pack(expand=1, fill='both')
  36.  
  37. header_label = Label(example_tab, text="Сравнение оптимальных и равномерных узлов"
  38. "\nдля функции 12x^3-8x^2-5x+2",
  39. font=("Arial Bold", 13, 'bold'))
  40. header_label.grid(column=0, row=0)
  41. label_input_iteration = Label(example_tab, text="Выберите n", font=("Arial Bold", 11))
  42. label_input_iteration.grid(column=0, row=1)
  43.  
  44. label_borders = Label(example_tab, text="Введите a и b для оптимальных узлов", font=("Arial Bold", 11))
  45.  
  46. label_borders.grid(column=0, row=2)
  47.  
  48. label_input_set_x_ex = Label(example_tab, text="Введите множество x через пробел", font=("Arial Bold", 11))
  49. label_input_set_x_ex.grid(column=0, row=3)
  50.  
  51. label_input_set_y_ex = Label(example_tab, text="Введите множество y через пробел", font=("Arial Bold", 11))
  52. label_input_set_y_ex.grid(column=0, row=4)
  53.  
  54. label_input_set_y_ex = Label(example_tab, text="Введите точку х, для вычисление P(x)",
  55. font=("Arial Bold", 11))
  56. label_input_set_y_ex.grid(column=0, row=5)
  57.  
  58. count_n = StringVar(root)
  59. count_n.set('4')
  60. count_n_switching_menu = OptionMenu(example_tab, count_n, "4", "8")
  61.  
  62. count_n_switching_menu.grid(column=1, row=1)
  63.  
  64. label_borders = Label(example_tab, text="Введите a и b для оптимальных узлов", font=("Arial Bold", 11))
  65. input_borders = Entry(example_tab, width=20)
  66. label_borders.grid(column=0, row=2)
  67. input_borders.grid(column=1, row=2, pady=10)
  68.  
  69. label_input_set_x_ex = Label(example_tab, text="Введите множество x через пробел", font=("Arial Bold", 11))
  70. input_set_x_ex = Entry(example_tab, width=20)
  71. label_input_set_x_ex.grid(column=0, row=3)
  72. input_set_x_ex.grid(column=1, row=3, pady=10)
  73.  
  74. label_input_set_y_ex = Label(example_tab, text="Введите множество y через пробел", font=("Arial Bold", 11))
  75. input_set_y_ex = Entry(example_tab, width=20)
  76. input_set_y_ex.grid(column=1, row=4, pady=10)
  77. label_input_set_y_ex.grid(column=0, row=4)
  78.  
  79. label_input_set_y_ex = Label(example_tab, text="Введите точку х, для вычисление P(x)", font=("Arial Bold", 11))
  80. input_point_x_ex = Entry(example_tab, width=20)
  81. label_input_set_y_ex.grid(column=0, row=5)
  82. input_point_x_ex.grid(column=1, row=5, pady=10)
  83.  
  84. fig = Figure(figsize=(3, 3), dpi=120)
  85.  
  86. canvas = FigureCanvasTkAgg(fig, master=root) # A tk.DrawingArea.
  87. toolbar = NavigationToolbar2Tk(canvas, root)
  88. canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
  89.  
  90.  
  91. # //////////////
  92.  
  93. def create_draw_from_gui(x_dots, y_dots, nodes_type):
  94. if nodes_type == 0:
  95. lbl = 'Равномерные узлы'
  96. else:
  97. lbl = 'Оптимальные узлы'
  98.  
  99. fig.clear()
  100. ax = fig.add_subplot(111)
  101. ax.plot(x_dots, y_dots, label=lbl)
  102. ax.legend()
  103. canvas.draw_idle()
  104.  
  105.  
  106. def create_draw_file_tab(x_dots, y_dots, nodes_type):
  107. if nodes_type == 0:
  108. lbl = 'Равномерные узлы'
  109. else:
  110. lbl = 'Оптимальные узлы'
  111.  
  112. fig.clear()
  113. ax = fig.add_subplot(111)
  114. ax.plot(x_dots, y_dots, label=lbl)
  115. ax.legend()
  116. canvas.draw_idle()
  117.  
  118.  
  119. def calculate_polynomial_from_gui_interface():
  120. """
  121. Reading data from inputs in the program
  122. :return:
  123. """
  124.  
  125. calculating_type = type_of_polynomial.get()
  126. uniform_nodes_type = 0
  127. optimal_nodes_type = 1
  128.  
  129. print('POLY TYPE', calculating_type)
  130. if calculating_type == uniform_nodes_type:
  131. x_dots_uniform = list(map(float, input_set_x.get().split()))
  132. y_dots_uniform = list(map(float, input_set_y.get().split()))
  133. inputed_x = float(input_point_x.get())
  134.  
  135. new_x_dots = list(np.linspace(x_dots_uniform[0], x_dots_uniform[-1], 100))
  136. new_y_dots = []
  137. for x_dot in new_x_dots:
  138. res = calculate_polynomial(x_dots=x_dots_uniform, y_dots=y_dots_uniform, inputed_x=x_dot,
  139. calculating_type=0)
  140. new_y_dots.append(res)
  141.  
  142. result = calculate_polynomial(x_dots=x_dots_uniform, y_dots=y_dots_uniform, inputed_x=inputed_x,
  143. calculating_type=0)
  144. create_draw_from_gui(new_x_dots, new_y_dots, 0)
  145.  
  146. if calculating_type == uniform_nodes_type:
  147. messagebox.showinfo('Результат', f'Значение полинома P(x) с равномерными узлами '
  148. f'P({inputed_x}) = {result}')
  149. elif calculating_type == optimal_nodes_type:
  150. messagebox.showinfo('Результат', f'Значение полинома P(x) с оптимальными узлами '
  151. f'P({inputed_x}) = {result}')
  152. else:
  153. print('Ошибка')
  154.  
  155. elif calculating_type == optimal_nodes_type:
  156. a, b, count = input_set_x.get().split()
  157. a, b, count = float(a), float(b), int(count)
  158. y_dots_optimal = get_y_dots_optimal(4) # list(map(float, input_set_y.get().split()))
  159. inputed_x = float(input_point_x.get())
  160.  
  161. x_dots_optimal = get_x_dots_optimal(a, b, count)
  162.  
  163. new_x_dots = list(np.linspace(x_dots_optimal[0], x_dots_optimal[-1], 100))
  164. new_y_dots = []
  165. for x_dot in new_x_dots:
  166. res = calculate_polynomial(x_dots=x_dots_optimal, y_dots=y_dots_optimal, inputed_x=x_dot,
  167. calculating_type=1)
  168. new_y_dots.append(res)
  169.  
  170. result = calculate_polynomial(x_dots=x_dots_optimal, y_dots=y_dots_optimal, inputed_x=inputed_x,
  171. calculating_type=1) # switch 1 to variable
  172.  
  173. create_draw_from_gui(new_x_dots, new_y_dots, 1)
  174.  
  175. if calculating_type == uniform_nodes_type:
  176. messagebox.showinfo('Результат', f'Значение полинома P(x) с равномерными узлами '
  177. f'P({inputed_x}) = {result}')
  178. elif calculating_type == optimal_nodes_type:
  179. messagebox.showinfo('Результат', f'Значение полинома P(x) с оптимальными узлами '
  180. f'P({inputed_x}) = {result}')
  181. else:
  182. print('Ошибка')
  183.  
  184.  
  185. # /////
  186.  
  187.  
  188. def pattern_func(x):
  189. return 12 * (x ** 3) - 8 * (x ** 2) - 5 * x + 2
  190.  
  191.  
  192. def create_draw_ex_tab(x_dots_polynomial=None, y_dots_uniform=None, y_dots_optimal=None):
  193. pattern_func_x_dots = np.linspace(-10, 13, 200)
  194. pattern_func_y_dots = []
  195. for x_dot in pattern_func_x_dots:
  196. pattern_func_y_dots.append(pattern_func(x_dot))
  197.  
  198. fig.clear()
  199. ax = fig.add_subplot(111)
  200. if y_dots_uniform is not None:
  201. ax.plot(x_dots_polynomial, y_dots_uniform, label='равномерные узлы')
  202. if y_dots_optimal is not None:
  203. ax.plot(x_dots_polynomial, y_dots_optimal, label='оптимальные узлы')
  204. ax.plot(pattern_func_x_dots, pattern_func_y_dots, label='12x^3-8x^2-5x+2')
  205. ax.legend()
  206. canvas.draw_idle()
  207.  
  208.  
  209. create_draw_ex_tab()
  210.  
  211.  
  212. def calculate_polynomial_from_example_tab():
  213. """
  214. Reading data from inputs in the program
  215. :return:
  216. """
  217.  
  218. a, b = list(map(float, input_borders.get().split()))
  219. count = int(count_n.get())
  220. x_dots_uniform = list(map(float, input_set_x_ex.get().split()))
  221. y_dots_uniform = list(map(float, input_set_y_ex.get().split()))
  222. inputed_x = float(input_point_x_ex.get())
  223.  
  224. x_dots_optimal = get_x_dots_optimal(a, b, count)
  225. y_dots_optimal = get_y_dots_optimal(count)
  226.  
  227. new_x_dots_polynomial, new_y_dots_uniform, new_y_dots_optimal = get_additional_dots(x_dots_uniform=x_dots_uniform,
  228. x_dots_optimal=x_dots_optimal,
  229. y_dots_optimal=y_dots_optimal,
  230. y_dots_uniform=y_dots_uniform)
  231. uniform_nodes = 0
  232. optimal_nodes = 1
  233.  
  234. result_with_optimal = calculate_polynomial(x_dots=x_dots_optimal, y_dots=y_dots_optimal, inputed_x=inputed_x,
  235. calculating_type=optimal_nodes)
  236.  
  237. result_with_uniform = calculate_polynomial(x_dots=x_dots_uniform, y_dots=y_dots_uniform, inputed_x=inputed_x,
  238. calculating_type=uniform_nodes)
  239.  
  240. create_draw_ex_tab(new_x_dots_polynomial, new_y_dots_uniform, new_y_dots_optimal)
  241.  
  242. messagebox.showinfo('Результат', f'Оптимальные узлы P({inputed_x}) = {result_with_optimal}\n'
  243. f'Равномерные узлы P({inputed_x}) = {result_with_uniform}\n'
  244. f'Значение самой функции: {pattern_func(inputed_x)}')
  245.  
  246.  
  247. btn_calculate_polynomial_ex_tab = Button(example_tab, text="Найти значение полинома",
  248. command=calculate_polynomial_from_example_tab,
  249. width=25)
  250.  
  251. btn_calculate_polynomial_ex_tab.grid(column=2, row=5, padx=15, pady=5)
  252.  
  253. # ///////
  254.  
  255. label_input_set_x = Label(reading_console_tab, text="Введите множество x через пробел", font=("Arial Bold", 11))
  256. input_set_x = Entry(reading_console_tab, width=20)
  257. label_input_set_x.grid(column=0, row=0)
  258. input_set_x.grid(column=1, row=0, pady=10)
  259.  
  260. label_input_set_y = Label(reading_console_tab, text="Введите множество y через пробел", font=("Arial Bold", 11))
  261. input_set_y = Entry(reading_console_tab, width=20)
  262. input_set_y.grid(column=1, row=3, pady=10)
  263. label_input_set_y.grid(column=0, row=3)
  264.  
  265. label_input_set_y = Label(reading_console_tab, text="Введите точку х, для вычисление P(x)", font=("Arial Bold", 11))
  266. input_point_x = Entry(reading_console_tab, width=20)
  267. label_input_set_y.grid(column=0, row=4)
  268. input_point_x.grid(column=1, row=4, pady=10)
  269.  
  270. type_of_polynomial = IntVar()
  271. type_of_polynomial.set(0)
  272.  
  273. radio_btn_uniform_nodes = Radiobutton(reading_console_tab, text='Полином с равномерными узлами',
  274. variable=type_of_polynomial, value=0)
  275. radio_btn_optimal_nodes = Radiobutton(reading_console_tab, text='Полином с оптимальными узлами',
  276. variable=type_of_polynomial, value=1)
  277. radio_btn_uniform_nodes.grid(column=0, row=5)
  278. radio_btn_optimal_nodes.grid(column=1, row=5)
  279.  
  280.  
  281. def create_draw(x_dots, y_dots_uniform, y_dots_optimal):
  282. fig.clear()
  283. ax = fig.add_subplot(111)
  284. ax.plot(x_dots, y_dots_uniform, label='uniform')
  285. ax.plot(x_dots, y_dots_optimal, label='optimal')
  286. print('Create_draw_2: y_uni, y_opti', y_dots_uniform, '\n', y_dots_optimal)
  287. ax.legend()
  288. canvas.draw_idle()
  289.  
  290.  
  291. btn_calculate_polynomial = Button(reading_console_tab, text="Найти значение полинома",
  292. command=calculate_polynomial_from_gui_interface,
  293. width=25)
  294.  
  295. btn_calculate_polynomial.grid(column=0, row=6, padx=15, pady=5)
  296.  
  297. # ==================================
  298.  
  299. radio_btn_uniform_nodes = Radiobutton(reading_file_tab, text='Полином с равномерными узлами',
  300. variable=type_of_polynomial, value=0)
  301. radio_btn_optimal_nodes = Radiobutton(reading_file_tab, text='Полином с оптимальными узлами',
  302. variable=type_of_polynomial, value=1)
  303. radio_btn_uniform_nodes.grid(column=0, row=2)
  304. radio_btn_optimal_nodes.grid(column=1, row=2)
  305.  
  306. label_for_add_member = Label(reading_file_tab, text='Считывание с файла', font=("Arial Bold", 12, "bold"))
  307. label_for_add_member.grid(column=0, row=1, pady=1)
  308.  
  309. label_for_add_member = Label(reading_file_tab, text='Считанные с файла значения', font=("Arial Bold", 12))
  310. label_for_add_member.grid(column=0, row=5, pady=1)
  311.  
  312. description_text = Text(reading_file_tab, height=4, width=30, font=("Arial Bold", 11))
  313. description_text.grid(column=0, row=6, padx=5)
  314.  
  315. global_file_path = None
  316.  
  317.  
  318. def chose_file():
  319. file_path = filedialog.askopenfilename()
  320. global global_file_path
  321. global_file_path = file_path
  322.  
  323. with open(file_path, mode='r', encoding='utf8') as f:
  324. x_dots = f.readline()
  325. y_dots = f.readline()
  326. inputed_x = f.readline()
  327. description_text.insert(END, f'x: {x_dots}'
  328. f'y: {y_dots}'
  329. f't: {inputed_x}')
  330.  
  331.  
  332. def calculate_polynomial_from_file():
  333. global global_file_path
  334. with open(global_file_path, mode='r', encoding='utf8') as f:
  335. x_dots = f.readline().split()
  336. y_dots = f.readline().split()
  337. inputed_x = f.readline()
  338.  
  339. calculating_type = type_of_polynomial.get() # 0 - uniform nodes, 1 - optimal nodes
  340. uniform_nodes_type = 0
  341. optimal_nodes_type = 1
  342.  
  343. x_dots = list(map(float, x_dots))
  344. y_dots = list(map(float, y_dots))
  345. inputed_x = float(inputed_x)
  346.  
  347. result = calculate_polynomial(x_dots=x_dots, y_dots=y_dots, inputed_x=inputed_x, calculating_type=calculating_type)
  348.  
  349. new_x_dots = list(np.linspace(x_dots[0], x_dots[-1], 100))
  350. new_y_dots = []
  351. for x_dot in new_x_dots:
  352. res = calculate_polynomial(x_dots=x_dots, y_dots=y_dots, inputed_x=x_dot,
  353. calculating_type=calculating_type)
  354. new_y_dots.append(res)
  355.  
  356. create_draw_file_tab(new_x_dots, new_y_dots, calculating_type)
  357.  
  358. if calculating_type == uniform_nodes_type:
  359. messagebox.showinfo('Результат', f'Значение полинома P(x) с равномерными узлами '
  360. f'P({inputed_x}) = {result}')
  361. elif calculating_type == optimal_nodes_type:
  362. messagebox.showinfo('Результат', f'Значение полинома P(x) с оптимальными узлами '
  363. f'P({inputed_x}) = {result}')
  364. else:
  365. print('Ошибка')
  366.  
  367.  
  368. btn_add_member = Button(reading_file_tab, text="Выбрать файл", command=chose_file,
  369. width=15)
  370. btn_add_member.grid(column=0, row=3, pady=5)
  371.  
  372. btn_add_member = Button(reading_file_tab, text="Найти значение полинома", command=calculate_polynomial_from_file,
  373. width=30)
  374. btn_add_member.grid(column=0, row=4, pady=10)
  375.  
  376. if __name__ == '__main__':
  377. def setup():
  378. input_borders.insert(0, '-5 8')
  379. input_set_x_ex.insert(0, '-5 -2 2 8')
  380. input_set_y_ex.insert(0, '-1673 -116 56 5594')
  381.  
  382.  
  383. setup()
  384.  
  385. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement