Форум сайта python.su
0
Программа решает уравнение тремя способами.Нужно построить график с точками из каждого способа.
Без кода для построения графика программа идеально работает.
# * - coding: utf-8 - *- # подключение библиотеки tkinter from tkinter import * # импорт математической библиотеки from math import * # описание функции def du (x,y): return 1/(cos(x))-y*tan(x) def fx (x_0,y_0,x_k,n_1): # шаг интегрирования h= (x_k-x_0) /n_1 #Аналитический метод for i in range (0,n_1): y3=cos(x_0)+sin(x_0) print("Аналитический метод", y3) #Метод Эйлера for i in range (0,n_1): y1=y_0+h*du (x_0,y_0) x1=x_0+h x_0=x1 y_0=y1 print("euler", y1) return y1 def rk (x_0,y_0,x_k,n_1): h= (x_k-x_0) /n_1 # метод рунге-кутта for i in range (0,n_1): k1=h*du (x_0,y_0) k2=h*du (x_0+h/2,y_0+k1/2) k3=h*du (x_0+h/2,y_0+k2/2) k4=h*du (x_0+h,y_0+k3) y1=y_0+ (k1+2*k2+2*k3+k4) /6 x_0=x_0+h y_0=y1 print("Runge-kutta", y1) return y1 def calc_y1 (): # начальные условия x0 = float (x0_entry. get ()) y0 = float (y0_entry. get ()) y3=0 # конечная точка xk = float (xk_entry. get ()) # число разбиений n = int (n_entry. get ()) # использование обработки исключений. Сначала выполняется ветвь try try: y1 = "%.3f" % fx (x0,y0,xk,n) y2 = "%.3f" % rk (x0,y0,xk,n) # если во время выполнения try возникает исключение, # то дальнейшее выполнение try прекращается и выполняется ветвь except except: y1 = "?" y2 = "?" y1_label.configure(text=y1) y2_label.configure(text=y2) # создание экземпляра класса Tk, отвечающего за создание окон root=Tk () # определение заголовка окна root. title ("Задание 1") frame = Frame (root) frame. pack () t1_label = Label (frame, bg='tan', text="Численное решение дифференциального уравнения первого порядка", font='arial 12') t1_label. grid (row=0, column=0, columnspan=5, padx=25,pady=5) # создание окна ввода величины начального значения числа X x0_entry = Entry (frame, width=10) x0_entry. grid (row=1, column=2,pady=5) x0_lebel = Label (frame, text="Начальное значение X: ") x0_lebel. grid (row=1, column=1,pady=5) # создание окна ввода величины начального значения числа Y y0_entry = Entry (frame, width=10) y0_entry. grid (row=2, column=2,pady=5) y0_lebel = Label (frame, text="Начальное значение Y: ") y0_lebel. grid (row=2, column=1,pady=5) # оздание окна ввода величины конечной точки xk_entry = Entry (frame, width=10) xk_entry. grid (row=1, column=4,pady=5) xk_lebel = Label (frame, text="Конечное значение Х: ") xk_lebel. grid (row=1, column=3,pady=5) # создание окна ввода величины точности интегрирования) n_entry = Entry (frame, width=10) n_entry. grid (row=2, column=4,pady=5) n_lebel = Label (frame, text="Число разбиений: ") n_lebel. grid (row=2, column=3,pady=5) # создание поля вывода ответа (метод эйлера) y1_label = Label (frame, text="?") y1_label. grid (row=3, column=1,padx=5,pady=5) y1_lebel = Label (frame, text="Метод Рунге-Кутта 4го порядка:") y1_lebel. grid (row=4, column=0,padx=5,pady=5) # создание поля вывода ответа (метод рунге-кутта) y2_label = Label (frame, text="?") y2_label. grid (row=4, column=1,padx=5,pady=5) y2_lebel = Label (frame, text=" Метод Эйлера: ") y2_lebel. grid (row=3, column=0,padx=5,pady=5) # создание кнопки вычисления значения интеграла eval_button = Button (frame,bg='coral', text="Вычислить", width=10,command=calc_y1) eval_button. grid (row=4, column=3,padx=5,pady=5) # создание кнопки закрытия приложения exit_button = Button (frame, bg='coral', text="Выход", width=10,command=root. destroy) exit_button. grid (row=4, column=4,padx=5,pady=5) # непосредственное создание окна
# sphinx_gallery_thumbnail_number = 3 import matplotlib.pyplot as plt import numpy as np # * - coding: utf-8 - *- # подключение библиотеки tkinter from tkinter import * # импорт математической библиотеки from math import * # описание функции def du (x,y): return 1/(cos(x))-y*tan(x) def fx (x_0,y_0,x_k,n_1): # шаг интегрирования h= (x_k-x_0) /n_1 #Аналитический метод for i in range (0,n_1): y3=cos(x_0)+sin(x_0) list.append(y3) print("Аналитический метод", y3) #Метод Эйлера for i in range (0,n_1): y1=y_0+h*du (x_0,y_0) x1=x_0+h x_0=x1 y_0=y1 ylist.append(y1) print("euler", y1) return y1 def rk (x_0,y_0,x_k,n_1): h= (x_k-x_0) /n_1 # метод рунге-кутта for i in range (0,n_1): k1=h*du (x_0,y_0) k2=h*du (x_0+h/2,y_0+k1/2) k3=h*du (x_0+h/2,y_0+k2/2) k4=h*du (x_0+h,y_0+k3) y1=y_0+ (k1+2*k2+2*k3+k4) /6 x_0=x_0+h y_0=y1 lst.append(y1) print("Runge-kutta", y1) return y1 def calc_y1 (): # начальные условия x0 = float (x0_entry. get ()) y0 = float (y0_entry. get ()) y3=0 # конечная точка xk = float (xk_entry. get ()) # число разбиений n = int (n_entry. get ()) # использование обработки исключений. Сначала выполняется ветвь try try: y1 = "%.3f" % fx (x0,y0,xk,n) y2 = "%.3f" % rk (x0,y0,xk,n) # если во время выполнения try возникает исключение, # то дальнейшее выполнение try прекращается и выполняется ветвь except except: y1 = "?" y2 = "?" y1_label.configure(text=y1) y2_label.configure(text=y2) # создание экземпляра класса Tk, отвечающего за создание окон root=Tk () # определение заголовка окна root. title ("Задание 1") frame = Frame (root) frame. pack () t1_label = Label (frame, bg='tan', text="Численное решение дифференциального уравнения первого порядка", font='arial 12') t1_label. grid (row=0, column=0, columnspan=5, padx=25,pady=5) # создание окна ввода величины начального значения числа X x0_entry = Entry (frame, width=10) x0_entry. grid (row=1, column=2,pady=5) x0_lebel = Label (frame, text="Начальное значение X: ") x0_lebel. grid (row=1, column=1,pady=5) # создание окна ввода величины начального значения числа Y y0_entry = Entry (frame, width=10) y0_entry. grid (row=2, column=2,pady=5) y0_lebel = Label (frame, text="Начальное значение Y: ") y0_lebel. grid (row=2, column=1,pady=5) # оздание окна ввода величины конечной точки xk_entry = Entry (frame, width=10) xk_entry. grid (row=1, column=4,pady=5) xk_lebel = Label (frame, text="Конечное значение Х: ") xk_lebel. grid (row=1, column=3,pady=5) # создание окна ввода величины точности интегрирования) n_entry = Entry (frame, width=10) n_entry. grid (row=2, column=4,pady=5) n_lebel = Label (frame, text="Число разбиений: ") n_lebel. grid (row=2, column=3,pady=5) # создание поля вывода ответа (метод эйлера) y1_label = Label (frame, text="?") y1_label. grid (row=3, column=1,padx=5,pady=5) y1_lebel = Label (frame, text="Метод Рунге-Кутта 4го порядка:") y1_lebel. grid (row=4, column=0,padx=5,pady=5) # создание поля вывода ответа (метод рунге-кутта) y2_label = Label (frame, text="?") y2_label. grid (row=4, column=1,padx=5,pady=5) y2_lebel = Label (frame, text=" Метод Эйлера: ") y2_lebel. grid (row=3, column=0,padx=5,pady=5) # создание кнопки вычисления значения интеграла eval_button = Button (frame,bg='coral', text="Вычислить", width=10,command=calc_y1) eval_button. grid (row=4, column=3,padx=5,pady=5) # создание кнопки закрытия приложения exit_button = Button (frame, bg='coral', text="Выход", width=10,command=root. destroy) exit_button. grid (row=4, column=4,padx=5,pady=5) # непосредственное создание окна plt.rc('font',**{'family':'verdana'}) plt.xlabel("ось абцисс") plt.ylabel("ось ординат") plt.plot(xlist, list, "d-", label="аналитический метод") plt.plot(xlist, ylist, "b-", label="метод Эйлера") plt.plot(xlist, lst, "g-", label="Рунге-Кутта 4-го порядка") plt.legend() plt.grid() plt.show()
Офлайн
221
1) вы забыли tk.mainloop() в конце, но даже без этого у меня работает, но крашится при закрытии окна ( с mainloop() ожидаемо все нормально завершается)
2) я давно уже работал с matplotlib, но помню что не получается вот так вот легко взять pyplot и то что он будет легко отрисовывать вам график по стороннему сигналу. Тут либо надо прям вставлять график в окно вашей программы, либо усложнять схему взаимодействия, как вариант использовать пример из документации matplotlib про периодическое обновление графика. Я на этом примере строил программу монитора, которая по http данные запрашивала в момент циклического опроса.
3) и я думаю что наверняка есть другие решения
Офлайн
0
1)Да, неудачно скопировал просто.
2)Пробовал методом вставки в интерфейс, правда делал это по статье 12года,может поэтому не получилось…
3)Пробовал так же с помощью anaconda IPython,но так же не вышло.Два дня промучился, просто построить графики, да,легко,но чтобы по данным которые получаются при решении тремя способами,вообще никак…
JOHN_16
Офлайн