数值化地计算向量序列的极限之前,先思考如下结论
定理1 无穷序列收敛,当且仅当对任意存在,对所有,
利用本定理,可数值化地计算收敛序列的极限:给定容错误差,譬如取。从一个适当的值起步,譬如取。从大于的整数任取和,检测是否。若是,则取中的较大者为,并以作为序列极限的近似值返回并停机。否则,扩大。譬如,扩大10倍,重复上述的过程。直至检测到有,使得。然而,这一过程不能因为没有检测到而一直持续下去,所以必须设置一个最大迭代次数,譬如说(此时,)。当时仍未检测到则说明序列收敛速度非常低或根本就是一个发散序列,应停机并宣告计算无效。在Python中我们将此计算过程实现为以下的函数。
import numpy as np #导入numpy
from math import nan #导入非数值常量nan
from scipy.stats import randint #导入整数均匀分布randint
def limit(x,eps=1e-6): #x为序列通项,eps为容错误差
N=10**3 #初始步长N=1000
m,n=N+randint.rvs(1,10**2,size=2) #m和n大于N的随机数
i=1 #迭代次数
while i<=10 and np.linalg.norm(x(n)-x(m))>=eps: #迭代
N*=10 #下一个步长
m,n=N+randint.rvs(1,10**2,size=2) #m和n大于N的随机数
i+=1 #迭代次数自增1
if i>10: #N>1000*10^10
return nan
return x(max(m,n))
程序的第4~14定义函数limit。该函数有两个参数:x表示序列通项,命名参数eps表示容错误差,缺省值为。
第5~7行执行初始化操作:第5行设置初始步长为N。第6行调用randint函数(第3行导入),产生2个介于1~100之间的随机整数,加上N后赋予m和n。第7行迭代次数i初始化为1。
第8~11行的while循环进行迭代:第9行将步长N增大10倍。第10行产生2个1~100之间的整数,加上N后赋予m,n,作为大于N的序列下标。第11行将迭代次数自增1。循环往复,直至
为真。
循环结束后,若在12行测得i>10,意味着以后的元素差的范数仍大于容错误差,故认为该序列不收敛,第13行返回math模块中表示非数值常量nan。否则,即
根据定理1判断序列收敛,第14行将较大下标元素作为极限的近似值返回。
例1 考虑序列
(1);
(2);
(3)。
用上述程序中定义的函数limit判断其是否收敛,若是则计算极限的近似值。
解:(1)我们知道是一个有界量,而是一个无穷大量,两者之比为无穷小量,即;
(2)根据例1.7的计算知;
(3)序列是一个发散的序列。
下列代码验证以上结果。
import numpy as np #导入numpy
x=lambda k:np.array([np.sin(k)/k]) #序列(1)的通项
print('%.1f'%limit(x)) #计算极限
x=lambda k:np.array([(k-1)/k,(k+1)/k]) #序列(2)的通项
print(limit(x)) #计算极限
x=lambda k:k #序列(3)的通项
print(limit(x)) #计算极限
程序的2、4、6行分别用lambda运算符定义序列(1)、(2)和(3)的通项。第3、5、7行调用limit函数分别计算各序列极限。运行程序,输出
0.0
[0.9999006 1.0000994]
nan
第1行表示序列(1)收敛于0,第2行表示序列(2)的极限向量的近似值,最后一行表示序列(3)无极限。