用Python学《微积分B》(常数项级数)

来源:互联网 发布:网站程序员培训中心 编辑:程序博客网 时间:2024/06/11 18:37


  “级数”(Series)是什么?“级数”有什么用处?“级数”与微积分有什么联系?带着这几个问题,本文将从通俗的角度来谈谈我对“级数”的理解,并进行一些知识扩展,最后附上《微积分B》课后练习的答案。


一、级数是什么


  关于级数的定义,除了教科书,也可以看看“Wiki - Series”。此外,“Math is Fun”对无穷级数(Infinite Series)的讲解比较有趣,值得一看。在此,我也借用“Math is Fun”上对级数的定义:
  “Series is the sum of infinite terms, it sounds like it is the list of numbers, but it is actually when we add them up.”
  这句话是说:级数就是无穷多项的和,它看起来像是“数的列表”,实际上它是这个无穷列表中各项的和。从这句话可以看出:
  1)级数是一个极限问题。
  2)级数不是数列。
  3)级数中的和是一个形式和。
  前面说过:微分和积分都是极限问题。慢慢地,可以把级数与微积分扯上了。事实上,级数的全称为“无穷级数”(Infinite Series),这个名字更贴切。
1,级数的通项
  级数有两种表示形式:

a1+a2+a3+

  或者
n=1an

  其中,an 就是级数的通项。而数列 {an} 的通项也是 an ,从中是否能体会到“级数与数列”的异同?
2,部分和(the kth partial sum)
Sk=n=1kan=a1+a2+a3++ak

  很明显,Sk 是有限项和,而级数本身是无穷项的和,两者是很大差异的。
3,形式和
  举一个栗子:
S=1+(1)+1+(1)+1+

  对它分割:
S=[1+(1)]+[1+(1)]+[1+(1)]+

  如果按照有限项来理解,分割之后 S 有两种取值: 0, 1 , 即刚好配对(偶数项)取 0, 余一项(奇数项)则取 1 。 但是,级数表示的是无穷项的和,我们不知道它到底是奇数项还是偶数项,或者说,它既可以是奇数项也可以是偶数项,那么,我们可以说“S既等于0也等于1”吗?
  显然不能!
  我们不能简单地按“有限项”来理解级数中的和。事实上,级数起源于“无限项的和是否可以产生有限大小的结果”,原话是“the idea that such a potentially infinite summation could produce a finite result”。
4,逆向思考
  看一下这个经典的“正方形分割”问题:
这里写图片描述
假设正方形边长为1,Rn - rest 表示第n次分割后剩余的面积,则
Rn=(12)n

取极限,
limn+Rn=limn+(12)n=0

反过来想,
R1+R2+R3+

这不就是级数吗?!


二、级数的“敛散性”


  既然级数表示“无限项的和(sum)”,那么我们首要关心的就是:这个 sum 是有限的还是无限的?是确定的值还是不确定的值?换成数学术语来表达就是:级数的“敛散性”。如果某级数有确定的、有限大小的值,那么该级数收敛;否则,该级数发散。
1,收敛级数的必要条件

n=1anLlimnan=0

2,收敛级数的线性性质
n=1(αun+βvn)=αn=1un+βn=1vn

3,Cauthy收敛准则
  前面两条可以说都是级数收敛的必要条件,而Cauthy收敛准则是级数收敛的充要条件。它的简要表述如下:
级数n=1an 收敛的充要条件(if and only if)是:
ε,N,s.t.n>N,p1,|an+1+an+2+an+3++an+p|<ε

  它的英文名为:Cauthy’s Convergence Criterion,可以点击这个链接查看Wiki对它的描述。
  Cauthy收敛准则的意义非常重大,它将“无穷项问题转化为了有限项问题”。Cauthy收敛准则是由第一章的数列的“Cauthy-极限存在准则”推导出来的。


三、正项级数


  顾名思义,正项级数的通项 an0。很明显,正项级数Sn 单调增加,而又有“单调有界数列必收敛”,因此,对于正项级数的收敛问题可以转化为部分和 Sn 的有界问题(充要条件)。
1,经典的正项级数
1)几何级数(geometric series)

1+12+14+18+116+=012n

2)调和级数(harmonic series)
1+12+13+14+15+=11n

3)p级数(p series)
11np

2,正项级数的敛散性判别方法
  常用的正项级数敛散性判别方法有:比较审敛法、比值审敛法、根值审敛法和积分审敛法。其中,比较审敛法和比值审敛法都是与已知敛散性的级数进行比较,特别是p级数。
3,积分审敛法
  积分审敛法拿出来特别说明一下,它可以串联本节的多个知识点,而且也反映了积分与级数之间的联系。
1)定理
  设 1an 是正项级数,函数f(x)在 [1,+) 非负单减,且 f(n)=an ,则级数 1an 与无穷积分 +1f(x)dx 的敛散性一致。
2)证明
  根据积分的定义(面积法)和函数的单调性,有:
an+1=f(n+1)=f(n+1)n+1n1dx=n+1nf(n+1)dxn+1nf(x)dxan

注:这个不等式我在“定积分”一节已经用画图表示过:Exercise 7-1-5
k=1nak+1n+11f(x)dxk=1nak

  左边的不等式表示:如果这个无穷积分收敛,那么级数的部分和有上界。而右边的不等式表示:如果这个积分发散(趋于 ),那么级数的部分和无上界(也趋于)。至此,证明完毕!
  这个证明的过程非常有意思:它反映了级数的通项与函数、级数的部分和与变上限积分、级数与无穷积分的联系。
3)意义
  积分审敛法将级数敛散性问题转变为无穷积分敛散性问题,开辟了一条新的道路。相对于研究求和来说,有了Newton-Leibniz公式,研究积分要更简单。
4)扩展
  前面将“级数收敛的必要条件”时说:级数收敛,则通项的极限为0。现在就来给出一个“反例”,即通项为0时,级数不收敛。
  以调和级数为例,根据“积分审敛法”,几何级数的敛散性与下列无穷积分一致:
11n11xdx

  又有
1xdx=ln(x)+C

  很明显,limn1n=0,而 F(x)=ln(x) 发散。此外,从这个例子还可以看出,(变上限)积分的变化(斜率,导数)比原函数缓和:
ln(x)<(1x)

  甚至有,原函数单减,而(变上限)积分函数单增的情况。
  再扩展一下,如果是下列级数呢?
11nln(n)or11nln2(n)

  同样用积分审敛法,可知前者发散,后者收敛


四、任意项级数与绝对收敛


  通项大于或等于0的级数是正项级数,推广到更一般地,就叫任意项级数。对于任意项级数,它的性质没有正项级数好研究,但是,一些特殊的级数也是有规律的,比如下面所说的“交错级数”。
1,交错级数(alternating series)

112+1314+15=1(1)n1n=ln(2)

  这就是交错调和级数
1+1315+1719+=1(1)n12n1=π4

注:交错级数收敛的充要条件是Leibniz Test,此外,Leibniz在估算π的时候,也用的了交错级数 —— Leibniz formula for PI
2,绝对收敛和条件收敛
  我们知道,正项级数的敛散性比任意项级数的敛散性更好判断,那么,很容易想到,将任意项级数的通项取绝对值,将其变为正项级数来研究。
1)绝对收敛定理
  如果级数n=1|an| 收敛,那么级数n=1an 必定收敛。
  直观上,|Sn|Sn,绝对收敛是比收敛更高级别的收敛。
2)条件收敛
  绝对收敛是收敛的充分非必要条件,那么介于中间地带的情况呢?即:n=1an 收敛,而n=1|an| 不收敛。这就是条件收敛。


五、级数与微积分的联系


1,级数与积分的联系
  级数与积分的联系就比较明显啦。前面在讲正项级数的“积分审敛法”时已经介绍过了,级数与无穷积分的各种联系,这里不再累述。
2,级数与微分的联系
  级数和微分(导数)都是极限问题,那么它们之间有什么联系呢?
  先联想一下,在微分中有没有什么求和的问题?还真有,而且在微分学中占了很重要的分量,那就是“Taylor公式”。

k=0nf(n)(a)k(xa)k=f(a)+f(a)(xa)+f′′(a)2!(xa)2++f(n)(a)n!(xa)n

  想象一下,如果将Taylor公式一直展开下去 n ,那不就是一种级数吗?!
  再想一下,Taylor公式的作用是可以近似任意函数或曲线,那么级数的其中的一个作用就是用简单函数的组合来近似的表示复杂的或非初等函数。


六、Python求级数


  Sympy支持级数和非级数求和(sum)运算,也可以直接用它的Sum类。Sum类的功能还是比较丰富的,支持很多级数运算,比如:“is_absolutely_convergent()”函数和“is_convergent()” 函数,可以直接判断一个级数是否收敛。
注:Sympy除了求和,类似的也提供了累乘计算类 —— Product。
  好了,现在开始用sympy来求解课后练习,看看是不是很爽。

from sympy import *init_printing()#Exercise 8-1-3n = Symbol('n', integer=True)expr1 = 3 / (2 ** n) - 4 / (3 ** n)expr2 = 1 / (n ** 2) - 1 / nexpr3 = 1 / n - 1 / (n + 3)expr4 = (n - 100) / nSum(expr1, (n, 1, oo)).is_convergent(), Sum(expr2, (n, 1, oo)).is_convergent(), \Sum(expr3, (n, 1, oo)).is_convergent(), Sum(expr4, (n, 1, oo)).is_convergent()

(True,False,True,False)


#Exercise 8-1-4n = Symbol('n', integer=True)expr1 = 1 / (n ** 2)expr2 = (2 * n + 1) / (n ** 2 * (n + 1) ** 2)#expr3 = sin(n * pi / 6)expr4 = ln(1 + 1 / n)Sum(expr1, (n, 1, oo)).is_convergent(), Sum(expr2, (n, 1, oo)).is_convergent(), \Sum(expr4, (n, 1, oo)).is_convergent(), #Sum(expr4, (n, 1, oo)).is_convergent()

(True,True,False)


#Exercise 8-1-5n = Symbol('n', integer=True)expr1 = 3 ** (-1 / n)expr2 = log(n * (2 * n + 1) / ((n + 1) * (2 * n - 1)))expr3 = (log(n)) ** (-1 / n)#expr4 = sqrt(n + 2) - 2 * sqrt(n + 1) + sqrt(n)Sum(expr1, (n, 1, oo)).is_convergent(), Sum(expr2, (n, 1, oo)).is_convergent(), \Sum(expr3, (n, 2, oo)).is_convergent(), #Sum(expr4, (n, 1, oo)).is_convergent()

(False,False,False)


#Exercise 8-1-6n = Symbol('n', integer=True)expr1 = 1 / (2 * n - 1)expr2 = 1 / sqrt((2 * n - 1) * (2 * n + 1))expr3 = 1 / (2 * n - 1) ** 2expr4 = 1 / (n * sqrt(n + 1))Sum(expr1, (n, 1, oo)).is_convergent(), Sum(expr2, (n, 1, oo)).is_convergent(), \Sum(expr3, (n, 2, oo)).is_convergent(), Sum(expr4, (n, 1, oo)).is_convergent()

(False,False,True,True)


#Exercise 8-1-2bn = Symbol('n', integer=True)expr = 1 / (n * (n + 1) * (n + 2))Sum(expr, (n, 1, oo)), Sum(expr, (n, 1, oo)).doit()

(n=11n(n+1)(n+2),14)


#Exercise 8-1-3bn = Symbol('n', integer=True)expr = 1 / ((3 * n + 1) * (3 * n - 2))Sum(expr, (n, 1, oo)), Sum(expr, (n, 1, oo)).doit().evalf()

(n=11(3n2)(3n+1),0.333333333333333)


#Exercise 8-1-4bn = Symbol('n', integer=True)expr = n / factorial(n + 1)Sum(expr, (n, 1, oo)), Sum(expr, (n, 1, oo)).doit()

(n=1n(n+1)!,1)


#Exercise 8-1-5bn = Symbol('n', integer=True)expr = (-1) ** (n - 1) * (2 * n + 1) / (n ** 2 + n)Sum(expr, (n, 1, oo)), Sum(expr, (n, 1, oo)).doit()

(n=1(1)n1n2+n(2n+1),1)

#Exercise 8-1-6bfrom sympy import *init_printing()i, n = symbols('i n', integer=True)expr = 2 / (2 ** i + 1)prod = Product(expr, (i, 1, n+1))sum = Sum(prod, (n, 1, oo))prod, sum, sum.evalf()

(i=1n+122i+1,n=1i=1n+122i+1,0.333333333333333)

#Exercise 8-1-7bn = Symbol('n', integer=True)expr = (2 * n - 1) / 2 ** nSum(expr, (n, 1, oo)), Sum(expr, (n, 1, oo)).doit()

(n=12n(2n1),3)

原创粉丝点击