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

时间:2018-11-07 17:11:54

标签: python limit sympy derivative

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

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

但是如果我用x0,我会得到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的派生词是{{1 }}):

0

有人可以告诉我我的代码有什么问题以及如何纠正它。谢谢。

1 个答案:

答案 0 :(得分:1)

相等==是结构相等,不是数学相等。它一次计算为True或False,没有“等到我们知道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一样)在具有分段函数的微积分中不是很好。