Как я могу уменьшить значение, если есть OverflowError? - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь построить график (в matplotlib) и динамически изменить значение numpy .linspace, когда значение Y превышает некоторое заданное число. Это происходит гладко до тех пор, пока значение, вычисленное для данного аргумента X, не вызовет OverflowError. Я пытался использовать try и кроме, но, похоже, это не решает мою проблему. Тем не менее, программа просто аварийно завершает работу.

Вот функция для определения начальных и конечных чисел linspace numpy.

def zkDef():
    global zk

    x = 200
    value = 10000
    while(value > 1000):
        value = eval(funcWzor.get())
        x -= 1

    zk = x

И в другой функции, часть которой, определяющая аргументы, передана matplotlib fun c:

    x = np.linspace(-zk, zk, 1001)
    y = np.vectorize(f)
    a.plot(x, y(x), '-r')

Чтобы вызвать ошибку OverflowError, я просто набираю функцию 3 ** (x ** 2) на входной поверхности "Wzor funkcji:".

Вот весь код, если необходимо:

from math import *
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import *
from matplotlib.figure import *
import tkinter
import numpy as np


def zkDef():
    global zk

    x = 200
    value = 10000
    while(value > 1000):
        value = eval(funcWzor.get())
        x -= 1

    zk = x

def f(x):
    return eval(funcWzor.get())

def proceed():
    zkDef()
    plot2(window)

def plot(window):
    global canvas, a, figure

    figure = Figure(figsize=(10, 10))
    a = figure.add_subplot(111)
    a.set_title("Wykres funkcji", fontsize=16)
    a.set_ylabel("Y", fontsize=14)
    a.set_xlabel("X", fontsize=14)
    canvas = FigureCanvasTkAgg(figure, master=window)
    canvas.get_tk_widget().pack()
    NavigationToolbar2Tk(canvas, plotWindow)
    canvas.draw()
    a.cla()

def plot2(window):
    global canvas, a, figure, x
    a.cla()
    x = np.linspace(-zk, zk, 1001)
    y = np.vectorize(f)
    a.plot(x, y(x), '-r')

    canvas.draw()

def createRoot(window):
    global root, var, plotWindow, zakrA, zakrB, funcWzor
    root = tkinter.Frame(window)
    root.pack()
    plotWindow = tkinter.Frame(root)
    plotWindow.grid(row=10, column=0, columnspan=2)

    btn = tkinter.Button(root, text="Akceptuj", font=("Arial", 30), bg="green", command=proceed)
    btn.grid(column=0, row=1, columnspan=2)

    #zakrT = tkinter.Label(root, text="Zakres: ", font=("Arial", 20))
    #zakrT.grid(column=0, row=2, columnspan=2)
    #zakrAT = tkinter.Label(root, text="a = ", font=("Arial", 20))
    #zakrAT.grid(column=0, row=3)
    #zakrA = tkinter.Entry(root)
    #zakrA.grid(column=1, row=3)
    #zakrBT = tkinter.Label(root, text="b = ", font=("Arial", 20))
    #zakrBT.grid(column=0, row=4)
    #zakrB = tkinter.Entry(root)
    #zakrB.grid(column=1, row=4)
    funcDefT = tkinter.Label(root, text="Wzor funkcji: ", font=("Arial", 20))
    funcDefT.grid(column=0, columnspan=2, row=5)
    funcWzor = tkinter.Entry(root)
    funcWzor.configure(width = 100)
    funcWzor.grid(column=0, columnspan=2, row=6)

window = tkinter.Tk()
window.title("Darboux")
window.resizable(height=None, width=None)

createRoot(window)
plot(window)

window.mainloop()
...