首页 > 解决方案 > 使用极限定义求分段函数的导数

问题描述

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

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

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

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,这有点正确(在isx = 0的导数处f0

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

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

标签: pythonsympyderivative

解决方案


平等==是结构上的平等,而不是数学上的平等。它立即评估为 True 或 False,没有“等到我们知道 x 的值”。对象Symbol('x')和对象Integer(0)在结构上不相等,因此Symbol('x') == Integer(0)为 False。请参阅SymPy 陷阱。您的意思是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 一样)在分段函数的微积分中不是很好。


推荐阅读