使用极限定义求分段函数的导数

Find the derivative of a piecewise function using the limit definition

所以我创建了一个这样的分段函数:

x= sp.symbols('x')
f = sp.Piecewise(
        (1, x==0),
        (sp.sin(x)*(x+1)/x, True))

但是如果我用 0 代替 x 我会得到 nan:

f.subs(x,0)
nan

所以第一个问题是为什么 == 不能很好地与 sympy.Piecewise 一起使用? 嗯,我改成这样:

f = sp.Piecewise(
        (sp.sin(x)*(x+1)/x, sp.And(x < 0, x > 0)),
        (1, True))

而且效果还不错。
接下来我想做的是使用它在 x = 0 中的定义来计算函数的导数:我需要计算一个极限:

所以我需要在 x = 0 中计算它,我这样编码:

Δx = sp.symbols('Δx')
expr = f.subs(x, Δx)/Δx
sp.limit(expr, Δx, 0)

但它输出 oo ,这意味着无穷大。这有点不对,因为如果我调用 diff 函数,我将获得 0,这是真的(在 x = 0 f 的导数是 0):

sp.diff(f, x).subs(x,0)
0

谁能告诉我我的代码有什么问题,我该如何更正它。谢谢。

等式==是结构上的等式,不是数学上的等式。它立即评估为 True 或 False,没有 "wait until we know the value of x"。对象 Symbol('x') 和对象 Integer(0) 在结构上不相等,因此 Symbol('x') == Integer(0) 为 False。参见 SymPy gotchas。你的意思是关系 Eq(x, 0) 表示等式关系,在我们对 x 了解更多之前,它不会被评估为布尔值。所以,使用

f = sp.Piecewise(
    (1, sp.Eq(x, 0)),
    (sp.sin(x)*(x+1)/x, True))

其次,导数(0处)的定义是(f(Δx) - f(0))/Δx的极限,而你没有减去f(0)

expr = (f.subs(x, Δx) - f.subs(x, 0))/Δx
sp.limit(expr, Δx, 0)

结果为1,其实是正确的。 (导数是 1,不是 0)。

顺便说一句,

>>> sp.diff(f, x).subs(x, 0)
0

是错误的,因为 SymPy(与其他 CAS 一样)在分段函数微积分方面不是很好。