使用极限定义求分段函数的导数
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 一样)在分段函数微积分方面不是很好。
所以我创建了一个这样的分段函数:
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 一样)在分段函数微积分方面不是很好。