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

问题描述 投票:-1回答:2

我正在构建一个Python图形计算器,通过使用y求解eval(function at x)来绘制函数。直到我使用具有可移动不连续点的函数为止,此函数都起作用。 eval不会返回类似NaN的结果,而只是评估点would连续的点。]

例如,如果我评估(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

我正在构建一个Python图形计算器,通过使用eval(x处的函数)求解y来绘制函数,直到我使用具有可移动不连续点的函数为止。而不是返回...

python math eval
2个回答
2
投票

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


0
投票

这是一个有趣的问题。在纯Python中真的无法解决它-要正确处理不连续性,您需要对表达式进行一些代数分析。当然,您可以编写一些函数来做到这一点,但是使用诸如Sympy(print(str(x)))之类的现有系统可能会更加方便。

© www.soinside.com 2019 - 2024. All rights reserved.