Python的eval()忽略不连续性吗?

时间:2019-12-10 17:54:43

标签: python math eval

我正在构建一个Python图形计算器,通过使用y解决eval(function at x)来绘制函数,直到我使用具有可移动不连续性的函数为止。 eval不会返回诸如NaN之类的东西,而只是评估连续的点将会

例如,如果我评估(x-2)/((x^2)-4),则该函数在技术上应该在x = 2时未定义,但是在x = 2处使用eval()会返回0.25而不是NaN,如果功能是连续的(通常是极限)。

我是否可以解决此问题并确定任何可移动的不连续性?本质上,如果分母为零

使用代码编辑:

COMPUTATION_DISTANCE = 0.001
# THE DISTANCE BETWEEN EACH X VALUE WHEN PLOTTING POINTS. EVENTUALLY WE CONNECT A LINE BETWEEN ALL POINTS SEPERATED BY A VALUE OF COMPUTATION_DISTANCE.
# IF THE GRAPH IS ZOOMED,  MULTIPLY THIS COMPUTATION DISTANCE BY A FACTOR OF THAT ZOOM
ASYMPTOTE = 2.0

#formula = "(x+2)**2" #just a fake formula to begin
formula = "(x-2)/((x**2)-4)" #just a fake formula to begin
view_size = 8.0




    def draw_graph(event):
        global alreadyGraphedDeriv #to prevent infinite loop of graphing deriv
        alreadyGraphedDeriv = False
        canvas.delete("all") #clear existing graph
        draw_grid()
        y_previous = 0.0
        x = view_size * -1 #start at the negative of the view_size. so x =-8. then the loop wil keep repeating until x =+8 giving u all the x values. the loop takes care of the y values
        while x <= view_size:
            try: 
                y = eval(formula) #evaluate y at every point x
                print(str(x) + ", " + str(y))
                #if(y>1000000000000 or y < 1000000000000): #finding asymptotes
                    #print("Asymptote at (" + str(x) + ", " + str(y) + ") ")

            except ValueError:
                y = 1000000000
                x = COMPUTATION_DISTANCE * view_size
                print('Value error')
                if eval(formula) < 0:
                    y *= -1
            except:
                print_formula("SYNTAX ERROR   ")
                print("syntax error")
                break
            try:
                draw_line(x - COMPUTATION_DISTANCE * view_size, y_previous, x, y, "black") #(previous x, previous y, new x, new y, color)
            except:
                print_formula("NON-INT PWR (dbl click ^)   ")
                break
            y_previous = y
            x += COMPUTATION_DISTANCE * view_size
            #print(" " + str(x - COMPUTATION_DISTANCE * view_size) + " " + str(y_previous) + " " + str(x) + " " + str(y) +  " black") 
            #(previous x, previous y, new x, new y, color)

        if alreadyGraphedDeriv is False:
            alreadyGraphedDeriv = True
            draw_derivative("event")

看看突出显示的输出。对于x = 2,它的评估值为0.25。

enter image description here

2 个答案:

答案 0 :(得分:2)

打印出的y值的数字截止表明您正在使用Python2。(Python 3会显示更多数字。)

在Python 2上,printstr插入浮点数比在Python 3上截断的截断要积极一些,因此不太正确 {{ 1}}仍可以显示为2.0。由于累积的舍入误差,您的2.0并不是真正的x,因此您的除法不是十分 0/0。它会将一个很小的数字除以一个很小的数字,并且舍入误差会产生,因此输出为2.0或非常接近。

如果您用0.25而不是print(repr(x)),则将看到足够多的数字以使舍入误差显而易见。

另外,获取Python 3。

答案 1 :(得分:0)

这是一个有趣的问题。在纯Python中,这实际上并不能解决-要正确处理不连续性,您需要对表达式进行一些代数分析。当然,您可以编写一些函数来做到这一点,但是为此使用诸如Sympy(https://sympy.org)之类的现有系统可能要方便得多。

您可能想应用人类会使用的任何启发式方法来查找要绘制的表达式中的不连续性。在分母中查找子表达式,看看它们在任何地方是否为零。此外,您还想查看是否可以删除任何不连续部分(因为x = 2 in(x-2)/(x ** 2-4-4)是可删除的,因为您可以通过使结果= 1/4来创建连续函数在x = 2)。最后,您将分别绘制不连续之间的每个线段。

总而言之,这听起来像是一个很棒的项目。也许像这样的智能绘图仪可以为Sympy或其他项目做出贡献,如果他们还没有的话。