我正在构建一个Python计算器,通过使用y
解决eval(function at x)
绘制函数,直到我使用一个带有可移动间断的函数为止。与其返回类似于NaN
的内容,eval只是计算如果它是连续的话,该点会是什么。
例如,如果我计算(x-2)/((x^2)-4)
,在x=2上函数在技术上应该是未定义的,但是使用x=2返回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")
看看突出显示的输出。评价了0.25作为x=2的解决方案。
发布于 2019-12-10 10:27:45
打印的y
值的数字截止值表明您在Python2上。(Python3将显示更多的数字。)
在Python2上,print
ing或str
-ing比Python3更激进地截断浮点数,因此不完全2.0
的值仍然可以显示为2.0
。您的x
实际上不是2.0
,因为累积的舍入错误,所以您的除法并不完全是0/0。它将一个非常小的数字除以一个非常小的数,而舍入误差恰好是计算出来的,所以输出是0.25
或非常接近。
如果您使用print(repr(x))
而不是print(str(x))
,您将看到足够多的数字使舍入错误变得明显。
另外,获取Python 3。
发布于 2019-12-10 11:09:17
这是个有趣的问题。它不能用纯Python来解决--为了正确处理不连续,你需要对表达式做一些代数分析。当然,您可以编写一些函数来实现这一点,但是使用现有的系统(如Sympy (https://sympy.org) )可能会方便得多。
您可能希望在表达式中查找要绘制的不连续性,使用人类使用的任何启发式方法,例如在分母中查找子表达式,并查看它们在任何地方是否为零。另外,您还想看看是否有任何不连续性是可移动的(因为x=2 in (x-2)/ (x **2-4)是可移动的,因为您可以通过让结果= 1/4在x=2处产生连续函数)。最后,您将分别绘制不连续之间的每个段。
总之,这听起来是个伟大的项目。也许像这样的智能绘图仪可以为Sympy或其他项目做出贡献,如果他们还没有的话。
https://stackoverflow.com/questions/59272909
复制