python - 使用极限定义求分段函数的导数
问题描述
所以我创建了一个这样的分段函数:
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
,这有点正确(在isx = 0
的导数处f
)0
:
sp.diff(f, x).subs(x,0)
0
有人可以告诉我我的代码有什么问题以及如何纠正它。谢谢。
解决方案
平等==
是结构上的平等,而不是数学上的平等。它立即评估为 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 一样)在分段函数的微积分中不是很好。
推荐阅读
- android - 材质底部导航底部图标空间bug
- sql - 根据 SQL (Oracle) 中的预定义日期范围对记录进行分组
- javascript - 如果部分中的摘要块为空,则隐藏 Squarespace 页面部分
- reactjs - 将 Word 转换为 React 降价
- flutter - 将一个变量值传递给颤振中的另一个变量
- scala - 以 SQL 表达式作为参数值的异常
- python - 在写方法中获取字段名称在odoo中出错
- reactjs - React JS:动态替换输入中的字符串(实时)
- c++ - 进程在向量中返回 -1073741819 (0xC0000005)
- sql - Openquery 错误“关键字事务附近的语法不正确”