所以我创建了一个像这样的分段函数:
x= sp.symbols('x')
f = sp.Piecewise(
(1, x==0),
(sp.sin(x)*(x+1)/x, True))
但是如果我用x
来0
,我会得到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
有人可以告诉我我的代码有什么问题以及如何纠正它。谢谢。
答案 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一样)在具有分段函数的微积分中不是很好。