SymPy 渐近线怪癖以及如何绕过它
SymPy asymptote quirk and how to get around it
今天我偶然发现了 SymPy 的一个奇怪功能。假设我们尝试在函数的渐近线上求值:
>>from sympy import *
>>
>>x = Symbol("x")
>>N(cot(x),subs={x: 0})
cot(x)
它returns既不是 NaN,也不是错误或异常,而是函数本身!
我的问题:
1. 我怎样才能自动检测到我偶然发现了渐近线(除了对结果调用 type() 之外)?
2. 这个设计决定背后的动机是什么?
要回答问题问题 1,您可以自动尝试使结果成为 float()
,如下所示:
try:
result=float(N(cot(x),subs={x: 0}))
except Exception as e:
plus=limit(cot(x), x, 0, '+')
minus=limit(cot(x), x, 0, '-')
func=str(inspect.trace()[-1][0].f_locals['result'])
if plus==minus:
print("Function %s has a point discontinuity at the point specified. An approximation of the function taking the limit of both sides is %s" % (func,plus))
else:
print("Function %s has a jump discontinuity at the point specified" % func)
(感谢this question about inspecting locals)
在表达式上使用 subs
而不是作为 N
的参数:
In [3]: N(cot(x).subs(x,0))
Out[3]: zoo
这可能是 sympy 中的错误
今天我偶然发现了 SymPy 的一个奇怪功能。假设我们尝试在函数的渐近线上求值:
>>from sympy import *
>>
>>x = Symbol("x")
>>N(cot(x),subs={x: 0})
cot(x)
它returns既不是 NaN,也不是错误或异常,而是函数本身!
我的问题:
1. 我怎样才能自动检测到我偶然发现了渐近线(除了对结果调用 type() 之外)?
2. 这个设计决定背后的动机是什么?
要回答问题问题 1,您可以自动尝试使结果成为 float()
,如下所示:
try:
result=float(N(cot(x),subs={x: 0}))
except Exception as e:
plus=limit(cot(x), x, 0, '+')
minus=limit(cot(x), x, 0, '-')
func=str(inspect.trace()[-1][0].f_locals['result'])
if plus==minus:
print("Function %s has a point discontinuity at the point specified. An approximation of the function taking the limit of both sides is %s" % (func,plus))
else:
print("Function %s has a jump discontinuity at the point specified" % func)
(感谢this question about inspecting locals)
在表达式上使用 subs
而不是作为 N
的参数:
In [3]: N(cot(x).subs(x,0))
Out[3]: zoo
这可能是 sympy 中的错误