我正在尝试让Sympy找到这个序列的极限
((-1)**(n))*(2**(-n))
使用PyCharm调试器和IPython控制台。
python模块是:
import numpy as np
from plotly.graph_objs import Scatter, Figure
from sympy import Symbol, srepr, limit_seq, oo
from sympy.abc import n
import plotly.plotly as py
py.sign_in('****', '****************')
sym_func = 1 + ((-1)**(n))*(2**(-n))
def rng_func(i):
try:
return 1 + np.power(-1, i)/(np.power(2,i))
except ZeroDivisionError as e:
raise ValueError('Invalid inputs') from e
class Sequence(object):
def __init__(self, i):
self.sum = 0
self.dom = np.arange(1, i + 1, 1)
self.rng = np.array([])
self.is_positive = True
self.is_alternating = True
for i in self.dom:
rng_val = rng_func(i)
self.rng = np.append(self.rng, [rng_val])
self.sum += rng_val
sign_array = np.sign(self.rng)
for i in self.dom:
if self.rng[i - 1] <= 0:
self.is_positive = False
break
for i in self.dom:
if sign_array[0] == -1:
alt_sign = np.power(-1, i)
else:
alt_sign = np.power(-1, i-1)
if alt_sign != sign_array[i-1]:
self.is_alternating = False
break
seq = Sequence(10)
data = [Scatter(x=seq.dom, y=seq.rng)]
fig = Figure(data=data)
py.image.save_as(fig, filename='plots/I3.png')
IPython控制台:
Connected to pydev debugger (build 171.4424.56)
Backend Qt5Agg is interactive backend. Turning interactive mode on.
import sys; print('Python %s on %s' % (sys.version, sys.platform))
Python 3.5.2 |Anaconda custom (64-bit)| (default, Jul 2 2016, 17:53:06)
Type "copyright", "credits" or "license" for more information.
IPython 5.1.0 -- An enhanced Interactive Python.
In[1]: limit_seq(((-1)**(n))*(2**(-n)), n)
In[2]: limit_seq((1**(n))*(2**(-n)), n)
Out[3]:
0
我的问题是为什么Sympy没有返回In [1]的限制值:但是对于In [2]:?差异是分子中的1对-1。 在Sympy中创建交替符号有不同的方法吗?
答案 0 :(得分:1)
截至目前(SymPy 1.1.1),limit_seq
不支持振荡序列,例如(-1)**n
的振荡序列。它的documentation以某种技术方式说明了这一点:
这些术语应该建立在不确定的n上的有理函数,无限总和和不确定的产品上。如果所有产品量词的范围都是渐近正的,则该术语是可以接受的。每个可接受的术语都是渐近单调的。
作为解决方法,您可以使用:
def mylimit_seq(seq, n):
n_ = Dummy("n", integer=True, positive=True)
L1 = limit_seq(seq.subs(n, 2*n_), n_)
L2 = limit_seq(seq.subs(n, 2*n_ + 1), n_)
if L1 == L2:
return L1
然后mylimit_seq((-1)**n * 2**(-n), n)
返回0.
在将来的版本中,limit_seq
将适用于此类序列。您也可以通过从GitHub克隆SymPy来获得此功能。
答案 1 :(得分:0)
我将系列分为偶数项和奇数项,我反映了包含关于x轴的奇数项的系列。这个系列成为: (1)*(2 **( - n)),然后与包含偶数项的系列相同。
计算限制的函数保持不变:
def mylimit_seq(seq, n):
try:
L1 = limit_seq(seq.subs(n, 2*n), n)
L2 = limit_seq(seq.subs(n, 2*n + 1), n)
except:
return np.NaN
if L1 == L2:
return L1
else:
return np.NaN