数值化地计算向量序列的极限之前,先思考如下结论
定理1 无穷序列{xk}⊂Rn\{\boldsymbol{x}_k\}\subset\text{ℝ}^n{xk}⊂Rn收敛,当且仅当对任意ε>0\varepsilon>0ε>0存在N∈NN\in\text{N}N∈N,对所有n,m>Nn,m>Nn,m>N,
∥xn−xm∥<ε.\lVert\boldsymbol{x}_n-\boldsymbol{x}_m\rVert<\varepsilon.∥xn−xm∥<ε.
利用本定理,可数值化地计算收敛序列{xk}\{\boldsymbol{x}_k\}{xk}的极限:给定容错误差ε>0\varepsilon>0ε>0,譬如取ε=10−6\varepsilon=10^{-6}ε=10−6。从一个适当的NNN值起步,譬如取N=103N=10^3N=103。从大于NNN的整数任取nnn和mmm,检测是否∥xn−xm∥<ε\lVert\boldsymbol{x}_n-\boldsymbol{x}_m\rVert<\varepsilon∥xn−xm∥<ε。若是,则取n,mn,mn,m中的较大者为kkk,并以xk\boldsymbol{x}_kxk作为序列极限的近似值返回并停机。否则,扩大NNN。譬如,扩大10倍,重复上述的过程。直至检测到有n,m>Nn,m>Nn,m>N,使得∥xn−xm∥<ε\lVert\boldsymbol{x}_n-\boldsymbol{x}_m\rVert<\varepsilon∥xn−xm∥<ε。然而,这一过程不能因为没有检测到∥xn−xm∥<ε\lVert\boldsymbol{x}_n-\boldsymbol{x}_m\rVert<\varepsilon∥xn−xm∥<ε而一直持续下去,所以必须设置一个最大迭代次数iii,譬如说i=10i=10i=10(此时,N=1013N=10^{13}N=1013)。当i=10i=10i=10时仍未检测到∥xn−xm∥<ε\lVert\boldsymbol{x}_n-\boldsymbol{x}_m\rVert<\varepsilon∥xn−xm∥<ε则说明序列收敛速度非常低或根本就是一个发散序列,应停机并宣告计算无效。在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表示序列通项xk\boldsymbol{x}_kxk,命名参数eps表示容错误差ε\varepsilonε,缺省值为10−610^{-6}10−6。
第5~7行执行初始化操作:第5行设置初始步长N=103N=10^3N=103为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。循环往复,直至
i>10或∥xn−xm∥<εi>10\text{或}\lVert\boldsymbol{x}_n-\boldsymbol{x}_m\rVert<\varepsiloni>10或∥xn−xm∥<ε
为真。
循环结束后,若在12行测得i>10,意味着N=1013N=10^{13}N=1013以后的元素差的范数仍大于容错误差ε\varepsilonε,故认为该序列不收敛,第13行返回math模块中表示非数值常量nan。否则,即
∥xn−xm∥<ε\lVert\boldsymbol{x}_n-\boldsymbol{x}_m\rVert<\varepsilon∥xn−xm∥<ε
根据定理1判断序列{xk}\{\boldsymbol{x}_k\}{xk}收敛,第14行将较大下标元素作为极限的近似值返回。
例1 考虑序列
(1){sinkk}\{\frac{\sin{k}}{k}\}{ksink};
(2){(k−1kk+1k)}\left\{\begin{pmatrix}
\frac{k-1}{k}\\\frac{k+1}{k}
\end{pmatrix}\right\}{(kk−1kk+1)};
(3){k}\{k\}{k}。
用上述程序中定义的函数limit判断其是否收敛,若是则计算极限的近似值。
解:(1)我们知道sink\sin{k}sink是一个有界量,而kkk是一个无穷大量,两者之比为无穷小量,即limk→∞sinkk=0\lim\limits_{k\rightarrow\infty}\frac{\sin{k}}{k}=0k→∞limksink=0;
(2)根据例1.7的计算知limk→∞(k−1kk+1k)=(11)\lim\limits_{k\rightarrow\infty}\begin{pmatrix}
\frac{k-1}{k}\\\frac{k+1}{k}
\end{pmatrix}=\begin{pmatrix}
1\\1\end{pmatrix}k→∞lim(kk−1kk+1)=(11);
(3)序列{k}\{k\}{k}是一个发散的序列。
下列代码验证以上结果。
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)的极限向量(11)\begin{pmatrix}
1\\1\end{pmatrix}(11)的近似值,最后一行表示序列(3)无极限。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!