gpt4 book ai didi

python - Sympy 符号函数的左侧极限

转载 作者:行者123 更新时间:2023-12-01 01:28:02 24 4
gpt4 key购买 nike

出于学习目的,我正在研究 python 的 sympy 库。我想计算下一个限制:

因此,我有代码:

import sympy as sp
x = sp.Symbol('x')
f = sp.sign(sp.cos(sp.pi/x))
sp.limit(f, x, 2, '-')

但是我遇到了下一个错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-31-56b1fd6b589d> in <module>()
1 x = sp.Symbol('x')
2 f = sp.sign(sp.cos(sp.pi/x))
----> 3 sp.limit(f, x, 2, '-')
~\Anaconda3\lib\site-packages\sympy\series\limits.py in limit(e, z, z0, dir)
47 """
48
---> 49 return Limit(e, z, z0, dir).doit(deep=False)
50
51
~\Anaconda3\lib\site-packages\sympy\series\limits.py in doit(self, **hints)
178
179 try:
--> 180 r = gruntz(e, z, z0, dir)
181 if r is S.NaN:
182 raise PoleError()
~\Anaconda3\lib\site-packages\sympy\series\gruntz.py in gruntz(e, z, z0, dir)
656 else:
657 raise NotImplementedError("dir must be '+' or '-'")
--> 658 r = limitinf(e0, z)
659
660 # This is a bit of a heuristic for nice results... we always rewrite
~\Anaconda3\lib\site-packages\sympy\series\gruntz.py in limitinf(e, x)
426 e = e.subs(x, p)
427 x = p
--> 428 c0, e0 = mrv_leadterm(e, x)
429 sig = sign(e0, x)
430 if sig == 1:
~\Anaconda3\lib\site-packages\sympy\series\gruntz.py in mrv_leadterm(e, x)
511 w = Dummy("w", real=True, positive=True, finite=True)
512 f, logw = rewrite(exps, Omega, x, w)
--> 513 series = calculate_series(f, w, logx=logw)
514 return series.leadterm(w)
515
~\Anaconda3\lib\site-packages\sympy\series\gruntz.py in calculate_series(e, x, logx)
464 from sympy.polys import cancel
465
--> 466 for t in e.lseries(x, logx=logx):
467 t = cancel(t)
468
~\Anaconda3\lib\site-packages\sympy\core\expr.py in yield_lseries(s)
2635 def yield_lseries(s):
2636 """Return terms of lseries one at a time."""
-> 2637 for si in s:
2638 if not si.is_Add:
2639 yield si
~\Anaconda3\lib\site-packages\sympy\core\expr.py in _eval_lseries(self, x, logx)
2700 # terms.
2701 n = 0
-> 2702 series = self._eval_nseries(x, n=n, logx=logx)
2703 if not series.is_Order:
2704 if series.is_Add:
~\Anaconda3\lib\site-packages\sympy\core\function.py in _eval_nseries(self, x, n, logx)
685 cf = Order(arg.as_leading_term(x), x).getn()
686 if cf != 0:
--> 687 nterms = int(nterms / cf)
688 for i in range(nterms):
689 g = self.taylor_term(i, arg, g)
TypeError: unsupported operand type(s) for /: 'int' and 'NoneType'

有什么问题吗?我很容易计算极限,以前没有出现过这样的错误。有办法解决吗?我还没找到。

最佳答案

这是极限计算中的一个错误;如果您以前没有遇到过此类错误,则仅意味着您没有为 SymPy 提供足够复杂的限制。像abs和sign这样的非解析、分段定义的函数给基于级数展开的SymPy算法带来了很多麻烦。它有时给出正确答案,有时给出错误答案,有时根本没有答案。

sign(something) 不起作用时,尝试 something/Abs(something) 是合理的,这在数学上是等效的,但可能效果更好(或更差)在 SymPy 中。

f = sp.cos(sp.pi/x) / sp.Abs(sp.cos(sp.pi/x))
sp.limit(f, x, 2, '-')

不会引发任何异常并立即返回答案:1。不幸的是,答案是错误的......

如果通过用符号y替换pi/x(现在从接近pi/2)来使问题变得更简单>正确),然后 SymPy 得到正确答案:

y = sp.symbols('y')
f = sp.cos(y) / sp.Abs(sp.cos(y))
sp.limit(f, y, sp.pi/2, '+')

返回-1

关于python - Sympy 符号函数的左侧极限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53175387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com