Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 10, 2019 19:03:53

sunnydayxo
Зарегистрирован: 2019-06-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите пожалуйста с кодом.

Программа решает уравнение тремя способами.Нужно построить график с точками из каждого способа.
Без кода для построения графика программа идеально работает.

 # * - 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()

Офлайн

#2 Авг. 11, 2019 00:27:31

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Помогите пожалуйста с кодом.

1) вы забыли tk.mainloop() в конце, но даже без этого у меня работает, но крашится при закрытии окна ( с mainloop() ожидаемо все нормально завершается)
2) я давно уже работал с matplotlib, но помню что не получается вот так вот легко взять pyplot и то что он будет легко отрисовывать вам график по стороннему сигналу. Тут либо надо прям вставлять график в окно вашей программы, либо усложнять схему взаимодействия, как вариант использовать пример из документации matplotlib про периодическое обновление графика. Я на этом примере строил программу монитора, которая по http данные запрашивала в момент циклического опроса.
3) и я думаю что наверняка есть другие решения



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Авг. 11, 2019 12:10:15

sunnydayxo
Зарегистрирован: 2019-06-08
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите пожалуйста с кодом.

1)Да, неудачно скопировал просто.
2)Пробовал методом вставки в интерфейс, правда делал это по статье 12года,может поэтому не получилось…
3)Пробовал так же с помощью anaconda IPython,но так же не вышло.Два дня промучился, просто построить графики, да,легко,но чтобы по данным которые получаются при решении тремя способами,вообще никак…

JOHN_16

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version