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 中的错误