Category Archives: Mathematics

在新加坡的这五年—学术篇

每次提到数学这个词,大家能够想到的就是初等代数,平面几何,组合运算,微积分,线性代数,概率论等方向。但在整个数学领域(Earth of Math)上,还有很多更有意思的领域和研究方向,包括数论,几何,拓扑,分形几何,分析,概率统计,博弈论,代数等诸多方向,每一个方向都有很多优秀的数学家在从事相关研究。

EarthofMath
Earth of Mathematics

当年在数学系的时候,所研究的方向是分形几何(Fractal Geometry)和复动力系统(Complex Dynamics),位于 Earth of Math 的左侧,称之为分形湖泊(Fractal Lakes)。所谓分形,其实是一个粗糙或者零碎的集合形状,可以分成多个部分,且每个部分放大之后与整体有某种相似性,即具有自相似性的性质。而动力系统则是基于某种固定的规则,描述一个空间内的所有点随时间的变化情况,例如钟摆的晃动,水的流动,湖泊里面鱼类的数量。备注:动力系统并不是指汽车的动力系统和发动机引擎,这两者毫无关系。

而复动力系统则是动力系统中的一个分支,研究的是有理函数的迭代性质。所谓函数的迭代,指的是针对有理函数 f(z),考察其定义域的点 z\in \hat{\mathbb{C}}n 次复合,得到 f^{(n)}(z)=f\circ\cdots\circ f(z),进一步可以研究 \lim_{n\rightarrow +\infty}f^{(n)}(z) 的极限。

针对不同的定义域,函数的迭代有着完全不同的研究方法。当时的研究方向是复动力系统(Complex Dynamical Systems)。复动力系统理论的研究始于 1920 年,当时是由数学家 Fatou 和 Julia 研究的,因此复动力系统中的两个重要的集合就是以 Fatou 和 Julia 来命名的,分别称之为 Fatou set 和 Julia Set。随着计算机技术的演进,在上世纪八十年代这些集合可以通过计算机进行可视化,分形几何和复动力系统理论开始蓬勃发展起来。在与双曲几何、分形几何、现代分析学和混沌学等学科发展相互促进的同时,围绕双曲猜想以及 Mandelbrot 集合的研究工作,成为当今复动力系统的研究热点。

举个例子,函数 f(z) = z^{2}+0.7885 e^{ia}a\in[0,2\pi])的 Julia 集合的动图如下:

JuliaSet_1
Julia 集合

当然,科研的时候可不是做一点可视化就算完成任务了,还是需要按部就班的学习各种数学知识和技能。

之前在学校研究动力系统的时候,收集过一些书籍,在此列举给大家,希望对初学者有一定的帮助。One Dimensional Real and Complex Dynamics实与复动力系统)需要学习的资料如下:

基础书籍:

复分析基础:本科生课程。学习数学知识自然需要循序渐进,除了必要的数学分析,高等代数之外,分析学则是动力系统所必备的知识之一。既然是复动力系统,那肯定就要集中于研究复分析,因此本科的复分析则是复动力系统的必修课之一。

(1) Complex Analysis, 3rd Edition, Lars V. Ahlfors

(2) Complex Analysis, Elias M. Stein

进阶复分析:研究生课程

到了研究生阶段,其实也不足以直接上手搞科研,需要进一步地学习黎曼曲面,拟共形映射等专业书籍,才能够为复动力系统的学习打下基础。

(1) Lectures on Riemann Surfaces (GTM 81), Otto Forster

(2) Lectures on Quasiconformal Mappings, Lars V. Ahlfors

实分析基础:本科生课程

研究动力系统,实分析也是其基础知识之一,无论是通过学习 Stein 还是 Rudin 的教材,都是为了进一步地了解基础知识。

(1) Real Analysis and Complex Analysis, Rudin

(2) Real Analysis, Elias M. Stein

专业书籍:

实动力系统:

(1) One Dimensional Dynamics, Welington de Melo & Sebastian VanStrien

这本书难度较大,上手的时候不建议直接看这本书。

OneDimensionalDynamics
One-Dimensional Dynamics

(2) Mathematical Tools for One-Dimensional Dynamics (Cambridge Studies in

Advanced Mathematics), Edson de Faria / Welington de Melo

MathematicalToolsforOneDimensionalDynamics
Mathematical Tools for One-Dimensional Dynamics

复动力系统:

(3) Dynamics in One Complex Variable, John Milnor;Milnor 的教材总是写的清晰明确,容易上手,推荐初学者可以读这本书。

DynamicsinOneComplexVariable
Dynamics in One Complex Variable

(4) Complex Dynamics, Lennart Carleson;Carleson 的教材偏向于分析学,读起来其实也有点难度,还是读 Milnor 的教材相对容易。

ComplexDynamics
Complex Dynamics

(5) Complex Dynamics and Renormalization, Curtis T. McMullen;McMullen 的书适合当做查阅,也不太适合从头到尾读下去。

ComplexDynamicsandRenormalization
Complex Dynamics and Renormalization

(6) Renormalization and 3-Manifolds Which Fiber over the Circle, Curtis T. McMullen

Renormalizationand3Manifolds
Renormalization and 3-Manifolds Which Fiber over the Circle

(7) Iteration of rational functions (GTM 132), Alan F. Beardon

遍历论:

(8) An Introduction to Ergodic Theory (GTM 79), Walters Peter

学术会议

除了日常的科研之外,博士生时不时地可以去参加一下学术会议,不仅可以去参加本方向的学术会议,也可以去参加其它方向的学术会议,只要有一份邀请函即可。

如果是在 NUS 的 IMS(Institute for Mathematical Sciences)举办的学术会议,一般来说只要是在校的研究生都是可以参加的。记得当时参加的第一个学术会议是关于 PDE 的,标题叫做 Hyperbolic Conservation Laws and Kinetic Equations:Theory, Computation, and Applications(1 November – 19 December 2010)。笔者去听这个系列讲座是因为在 2010 年选择了一门 PDE 的研究生课程,而这个讲座则是作为课程的一部分。

IMSWorkshopGroupPhoto2012_6
IMS 的偏微分方程学术会议

笔者参与的另外一个学术会议则是关于动力系统的,标题叫做 Workshop on Non-uniformly Hyperbolic and Neural One-dimensional Dynamics(23 – 27 April 2012),主要是关于非一致双曲动力系统方向的研讨会。笔者记得当时所修的课程应该只有概率论(Probability II)一门课,因此上课的任务不算很重。参会的时间恰好是学期快结束的时候,科研的任务也不算特别繁重。因此,积极参与各种学术会议也算是科研的其中一部分,一来通过参会可以了解当前的学术研究情况,二来可以认识学术界的各种人士,也算是扩大学术交流圈子的好机会。

IMSWorkshopGroupPhoto2012_2
IMS 的动力系统学术会议

既然是学术会议,那自然就有各种各样的 Presentations,学术会议的第一天通常是需要有 IMS 的领导来致辞的,表示学术会议正式开始。每天的学术会议都需要有个 chair 来组织,一天的学术会议基本上是从早到晚,大约从早上 9:30 开始,到下午 4:40 结束。而每个学者汇报时间大约是 50 mins 左右。

IMSWorkshopGroupPhoto2012_3
第一天的研讨会安排

这次的学术会议是关于动力系统方向的,那师兄们自然是需要上台做报告的。当时上场的师兄包括大师兄和二师兄,至于三师兄和我则暂时没有成果可以汇报。两位师兄在 IMS 的报告厅里面做了十分精彩的成果展示,会议之后也有不少同行来与师兄们讨论问题。

IMSWorkshopGroupPhoto2012_4
同门汇报工作

一般来说,每次研讨会的开始和结束都需要有一个仪式,除了 IMS 的领导致辞表示会议开始之外,在茶歇时间(Coffee Break)期间是可以四处走动的,并且在第一次茶歇的时候,全体参会人员都会在 IMS 附近拍照留念,预祝本次研讨会成功举办。

IMSWorkshopGroupPhoto2012_5
Group Photo

论文

读到博士自然需要研究一下相应的课题,例如下面这种就是数学系博士生所研究的课题。​

Question. 是否存在 \ell\geq 4 的偶数和复数 c\in\mathbb{C} 使得 f(z)=z^{\ell}+c 的 Julia 集合 J(f) 是正测度?

针对这个课题,数学系的博士生需要翻阅历史上的相关书籍和论文,阅读其相关论文才能够得到前沿技术和进展。当年花时间阅读的论文主要是几篇 Annals 上面的文章,参考资料也是这几篇文章,不过每一篇文章至少都是 40 页左右,基本上看一篇文章需要花几个月的时间。

1. Combinatorics, geometry and attractors of quasi-quadratic maps,Pages 345-404 from Volume 140 (1994), Issue 2 by Mikhail Lyubich

Paper_1

2. Wild Cantor attractors exist,Pages 97-130 from Volume 143 (1996), Issue 1 by Hendrik Bruin, Gerhard Keller, Tomasz Nowicki, Sebastian van Strien

Paper_2

3. Quadratic Julia sets with positive area,Pages 673-746 from Volume 176 (2012), Issue 2 by Xavier Buff, Arnaud Chéritat

Paper_3

4. Polynomial maps with a Julia set of positive measure,Nowicki, Tomasz, and Sebastian van Strien,arXiv preprint math/9402215(1994).

Paper_4

备注:第 4 篇文章 Polynomial maps with a Julia set of positive measure 里面有错误,通过其证明是无法得到最终结论的,因此是否存在正测度的 Julia 集合一直是未知的。直到 2012 年的第 3 篇文章出来,才算证明了二次多项式存在正测度的 Julia 集合。但是对于高次多项式,是否存在正测度的 Julia 集合则是完全未知的。

在拿到论文和课题之后,那就开始需要研究了。草稿纸也算了一张又一张,论文也打印了一份又一份,科研之路哪有一帆风顺的,基本上都是历经曲折,才能够达到毕业的彼岸。毕业的时候写了一篇文章《科研这条路》,以此来纪念读博五年的生涯。

PlanandReality
理想与现实

参考资料:

  1. 科研这条路
  2. 维基百科:Julia 集合

 

一个数学家的辩白

《一个数学家的辩白》是数学大师 Godfrey Harold Hardy 在 1940 年左右的作品,可以称之为 Hardy 本人的自传和内心独白。Hardy 通过自己多年从事数学科研的经验,对数学,文学,哲学,美学等诸多学科的理解,将其写成了一本小册子。给其余的数学工作者,数学爱好者,以及不了解数学的人一个了解数学家内心的机会。

Hardy的照片
G.H.Hardy 的照片

G.H.Hardy(1877 年 2 月 7 日 – 1947 年 12 月 1 日)是一代数论大师,英国数学家,先后在牛津大学(Oxford)和剑桥大学(Cambridge)担任数学教授,与另一位英国数学家 Littlewood 共同研究数学,其研究领域包括解析数论,三角级数,不等式等诸多方向。对数论领域和分析学领域的贡献巨大,是二十世纪英国分析学派的代表人物之一。

Hardy的数学家族谱
G.H.Hardy 的数学家族谱

在卢昌海《黎曼猜想漫谈》这本书里面,提到了 G.H.Hardy 的一则小故事。当年,Hardy 在一次从丹麦回英国的途中,碰巧遇到暴风肆虐。他很担心小船会沉没,于是在上船前给朋友寄了一张明信片,上面写道:“我证明了黎曼猜想。” 如果哈代不幸遇难,因死无对证,后世将无法否认(当然也没法确认)他真的证明了黎曼猜想。然而,上帝不想让他有这样大的荣耀,所以没有让这条船沉没。

在《一个数学家的辩白》这本书中,Hardy 基于个人经历,向大家展示了一位数学家对数学这门学科的一些看法和观点。下面将会摘录其中的一些语句。

假如真的能把我的雕像塑在伦敦纪念碑上的话,我是希望这座碑高耸入云,以至人们见不到雕像呢,还是希望纪念碑矮得可以使人们对雕像一目了然呢?我会选择前一种,而斯诺博士可能会选择后一种。

如果一个数学家发现自己在写关于数学的东西,他会感到很忧伤的。因为数学家的工作是做实事,比如证明新定理,使数学有所发展,而不是谈论自己或别的数学家干了些什么。政治家蔑视时事评论家;画家蔑视艺术评论家;生理学家、物理学家或数学家一般都有类似的感觉。做事者对评论者的蔑视是最深刻的,总的来看也是最合理的。解释、评论、鉴赏是次等工作。

认为“谦卑”的人做不出优秀的工作。比方说,在任何一个学科里,教授的首要职责之一就是对自己这一学科的重要性以及自己本人在这一学科的重要性进行一点夸大。假如一个人总在问自己:“我所做的事是值得做的吗?”以及“我做这个合适吗?”这都会使自己永远无能而且也让别人泄气。这种人该把眼睛闭上一会儿,更多地考虑自己的学科和自己本人的情况,而不是更多地考虑学科与自己所应得的报酬。这不太困难,因为更加困难的是依靠紧闭眼睛来使自己的学科与自己本人不受他人所嘲笑。

我之所以做我的事,因为这事是,而且是惟一的一件我完全可以做好的事。我是个律师,或者是一个股票经纪人,或者是一个职业板球手,这都是因为我对这一特别的工作有些真正的才能。我做律师,是因为我伶牙俐齿,而且对法律之微妙感兴趣;我做股票经纪人,是因为我对股市行情的判断迅速而准确;我做职业板球手,是因为我挥拍非同一般地好。有人说,我做个诗人或数学家也许更好,但不幸的是,我并没有才能做这样的工作。

我并不认为大多数人能够做出上述那样的辩解,因为多数人什么工作也做不好。可是只要这种辩解说得振振有词,它就很难反驳,事实上只有少数人能进行这样的辩解:也许只有 5% 或 10% 的人可做得不错。而只有极少数人可做得真正好。而能做好两件事的人只有寥寥无几的了。假如一个人有真正的才能,他就应该乐于牺牲几乎所有的一切,以充分发挥自己的才能。

我会设想我是在为那些现在和过去都满怀雄心壮志的人写这本书的。一个人的首要任务,进一步说,一个年轻人的首要任务是能显示雄心壮志。雄心是一种可以合情合理地以许多形式表现出的一种宏大高尚的志向。阿提拉(Attila)和拿破仑的野心中就有某种高尚的志向,但最高尚的雄心壮志是在自己身后留下某种永存的价值。

  在这平坦的沙滩上,
  海洋与大地间,
  我该建起或写些什么,
  来阻止夜幕的降临?
  告诉我神秘的字符,
  去喝退那汹涌的波涛,
  告诉我时间的城堡,
  去规划那更久的白昼。

有很多高尚的动机驱使人们进行某项研究。在这些动机中,最为重要的有三种。 首先(舍此必一事无成)是理智的好奇心,也就是对了解真理的渴望。其次是对自己专业工作的自豪感,只有工作才能使自己得以满足的那种渴望。任何自尊的数学家,当他的工作与其才能不相称时,耻辱感会压倒一切。最后一个就是雄心壮志,期望得到名声、地位甚至随之而来的权力和金钱。

假如理智的好奇心、对专业工作的自豪感和雄心壮志是在研究工作中占支配地位的动机的话,那么,毫无疑问,没有哪个人比一个数学家有更好的机会来满足这些条件了。数学家的研究学科是所有学科中最令人好奇的。没有哪门学科中的真理会像数学那样奇异。数学是最精细与最富有魅力的技艺,而且数学研究提供了展示真正的专业技能的机会。最后我还要说的是,正如历史所充分证明的那样,不论数学内在的本质价值何在,其成就是一切成就中最持久的。

数学家,就像画家、诗人一样,都是模式的创制者。要说数学家的模式比画家、诗人的模式更长久,那是因为数学家的模式由思想组成,而画家以形状和色彩创制模式,诗人则以言语和文字造型。一幅画或许蕴含着某种”意境”,但通常是平凡而无关紧要的;比较之下,诗意要重要得多,不过,像豪斯曼坚持认为的那样,人们习以为常地夸大了诗意的重要性。他说:“我难以确信存在诗意之类的东西⋯⋯诗歌并不在于表述了什么,而在于怎样表述。”

 倾江海之水,洗不净帝王身上的膏香御气。

一个有意义的数学概念,一条严肃的数学定理从下述意义上被认为是“普遍的”。数学概念应该是许多数学构造的要素,应能应用于许多不同种定理的证明。

一个有意义的定理必须具备的第二个特性就是“深刻性”。其概念也不易定义,它与“难度”有关,深刻的思想往往难以掌握,但二者也并不完全一样。毕氏定理及推广所蕴含的概念有一定的深度,但现代数学家绝不会认为它难懂。相反,一个定理可能极为肤浅,但却难以证明–如丢番图(Diophantus)的有关求方程整数解的定理。

纯数学和应用数学的这些差异对它们本身很重要,但与我们关于数学“实用性”的讨论毫无关系。我曾谈到过费马和其他一些伟大的数学家的“真正的”数学,具有永恒美学价值的数学,如最好的希腊数学。它们之所以永恒,是因为其中的精华就像文学中的精英部分,在几千年后还能引起千万人强烈的满足感。

对于我的一生,或者说任何一个与我类似的数学家的情况是:我所做的工作扩充了知识,并且帮助他人在这座知识的大厦上添砖加瓦;而这些添加部分与伟大的数学家们的创新,或任何其他大大小小艺术家们的作品的价值的不同仅仅在于程度而不在于种类。这些数学家和艺术家都在死后留下了某种纪念物。

伽罗瓦 21 岁去世,阿贝尔 27 岁去世,拉曼纽扬 33 岁去世,黎曼 40 岁去世。也有些人确实是在较晚时取得伟大成就的,高斯就是在 55 岁时才发表了他的微分几何学的重要论文(但在此十年前他就已经形成了他的基本思想)。我还不知道有哪一个重要的数学进展是由一个年过半百的人创始的。假如一个年长的人对数学不感兴趣而放弃了它,这种损失不论对数学本身还是他本人来说,都不十分严重。

阅读《一个数学家的辩白》这本书,可以通过字里行间看到作为一个数学家的 Hardy 对数学的热爱,对自己正值花甲之年而无法做出更好的科研而流露出一种淡淡的忧伤。

其实,二十世纪三十年代末以后,Hardy 的学术活动就开始逐渐减少。1939 年第二次世界大战爆发,让 Hardy 感到更加苦闷。四十年代以后,Hardy 很少参与学术活动。1947 年 12 月 1 日,Hardy 在剑桥去世,享年 70 岁。留给大家的除了数学上的各种定理,书籍之外,还留下了这一本小册子,《一个数学家的自白》。

参考书籍:

  1. 《一个数学家的辩白》;
  2. 《黎曼猜想漫谈》。

一代数学大师 Rota 的经验与忠告

意大利裔的美籍数学家 Gian-Carlo Rota(1932 年 4 月 27 日 – 1999 年 4 月 18 日)是一位杰出的组合学家。他曾是研究泛函分析(Functional Analysis)出身,后来由于个人兴趣的转移,成为了一位研究组合数学(Combinatorial Mathematics)的学者。Rota 的职业生涯大部分都在麻省理工学院(MIT)度过,曾担任 MIT 的数学教授与哲学教授。

Rota's Photo 1970
1970 年的 Rota

从数学家族谱(Mathematics Genealogy Project)上面可以看到:Gian-Carlo Rota 的导师是 Jacob T. Schwartz,Rota 于 1956 年在耶鲁大学获得数学博士学位,其博士论文的题目是 Extension Theory of Differential Operators。

Rota的数学家族谱_1
Rota 的数学族谱

在 1997 年,Rota 发表了两篇关于人生经验和忠告的文章,分别是 “Ten Lessons I wish I Had Been Taught” 和 “Ten Lessons for the Survival of a Mathematics Department“。下面就来逐一分享这两篇文章中的一些观点。

Ten Lessons I wish I Had Been Taught

Springer Link Ten Lessons I wish I Had Been Taught
Ten Lessons I wish I Had Been Taught

讲座(Lecturing)

每次讲座或者分享的时候都有几个需要注意的事情。

(a)每次讲座都应该只有一个重点。(Every lecture should make only one main point.)

Every lecture should state one main point and repeat it over and over, like a theme with variations. An audience is like a herd of cows, moving slowly in the direction they are being driven towards. If we make one point, we have a good chance that the audience will take the right direction; if we make several points, then the cows will scatter all over the field. The audience will lose interest and everyone will go back to the thoughts they interrupted in order to come to our lecture.

(b)不要超时。(Never run overtime.)

Running overtime is the one unforgivable error a lecturer can make. After fifty minutes (one micro-century as von Neumann used to say) everybody’s attention will turn elsewhere even if we are trying to prove the Riemann hypothesis. One minute overtime can destroy the best of lectures.

(c)提及听众的成果。(Relate to your audience.)

As you enter the lecture hall, try to spot someone in the audience with whose work you have some familiarity. Quickly rearrange your presentation so as to manage to mention some of that person’s work. In this way, you will guarantee that at least one person will follow with rapt attention, and you will make a friend to boot.

Everyone in the audience has come to listen to your lecture with the secret hope of hearing their work mentioned.

(d)给听众一些值得回忆的东西。(Give them something to take home.)

Most of the time they admit that they have forgotten the subject of the course and all the mathematics I thought I had taught them. However, they will gladly recall some joke, some anecdote, some quirk, some side remark, or some mistake I made.

板书技巧(Blackboard Technique)

(a)开讲前保持黑板干净(Make sure the blackboard is spotless.)

By starting with a spotless blackboard you will subtly convey the impression that the lecture they are about to hear is equally spotless.

(b)从黑板的左上角开始书写(Start writing on the top left-hand corner.

What we write on the blackboard should correspond to what we want an attentive listener to take down in his notebook. It is preferable to write slowly and in a large handwriting, with no abbreviations.

When slides are used instead of the blackboard, the speaker should spend some time explaining each slide, preferably by adding sentences that are inessential, repetitive, or superfluous, so as to allow any member of the audience time to copy our slide. We all fall prey to the illusion that a listener will find the time to read the copy of the slides we hand them after the lecture. This is wishful thinking.

多次公布同样的结果(Publish the Same Result Several Times)

The mathematical community is split into small groups, each one with its own customs, notation, and terminology. It may soon be indispensable to present the same result in several versions, each one accessible to a specific group; the price one might have to pay otherwise is to have our work rediscovered by someone who uses a different language and notation and who will rightly claim it as his own.

说明性的工作反而更有可能被记得(You Are More Likely to Be Remembered by Your Expository Work)

When we think of Hilbert, we think of a few of his great theorems, like his basis theorem. But Hilbert’s name is more often remembered for his work in number theory, his Zahlbericht, his book Foundations of Geometry, and for his text on integral equations.

每个数学家只有少数的招数(Every Mathematician Has Only a Few Tricks)

You admire Erdös’s contributions to mathematics as much as I do, and I felt annoyed when the older mathematician flatly and definitively stated that all of Erdös’s work could be “reduced” to a few tricks which Erdös repeatedly relied on in his proofs. What the number theorist did not realize is that other mathematicians, even the very best, also rely on a few tricks which they use over and over. But on reading the proofs of Hilbert’s striking and deep theorems in invariant theory, it was surprising to verify that Hilbert’s proofs relied on the same few tricks. Even Hilbert had only a few tricks!

别害怕犯错(Do Not Worry about Your Mistakes)

There are two kinds of mistakes. There are fatal mistakes that destroy a theory, but there are also contingent ones, which are useful in testing the stability of a theory.

使用费曼的方法(Use the Feynman Method)

You have to keep a dozen of your favorite problems constantly present in your mind, although by and large they will lay in a dormant state. Every time you hear or read a new trick or a new result, test it against each of your twelve problems to see whether it helps. Every once in a while there will be a hit, and people will say, “How did he do it? He must be a genius!”

不要吝啬你的赞美(Give Lavish Acknowledgments)

I have always felt miffed after reading a paper in which I felt I was not being given proper credit, and it is safe to conjecture that the same happens to everyone else.

写好摘要(Write Informative Introductions)

If we wish our paper to be read, we had better provide our prospective readers with strong motivation to do so. A lengthy introduction, summarizing the history of the subject, giving everybody his due, and perhaps enticingly outlining the content of the paper in a discursive manner, will go some of the way towards getting us a couple of readers.

为老年做好心理准备(Be Prepared for Old Age)

You must realize that after reaching a certain age you are no longer viewed as a person. You become an institution, and you are treated the way institutions are treated. You are expected to behave like a piece of period furniture, an architectural landmark, or an incunabulum.

 

Ten Lessons for the Survival of a Mathematics Department

Springer Link Ten Lessons for the Survival of a Mathematics Department
Ten Lessons for the Survival of a Mathematics Department

不要在其他系讲自己系同事的坏话(Never wash your dirty linen in public)

Departments of a university are like sovereign states: there is no such thing as charity towards one another.

别越级打报告(Never go above the head of your department)

Your letter will be viewed as evidence of disunity in the rank and file of mathematicians. Human nature being what it is, such a dean or provost is likely to remember an unsolicited letter at budget time, and not very kindly at that.

不要进行领域评价(Never Compare Fields)

You are not alone in believing that your own field is better and more promising than those of your colleagues. We all believe the same about our own fields. But our beliefs cancel each other out. Better keep your mouth shut rather than make yourself obnoxious. And remember, when talking to outsiders, have nothing but praise for your colleagues in all fields, even for those in combinatorics. All public shows of disunity are ultimately harmful to the well-being of mathematics.

别看不起别人使用的数学(Remember that the grocery bill is a piece of mathematics too)

The grocery bill, a computer program, and class field theory are three instances of mathematics. Your opinion that some instances may be better than others is most effectively verbalized when you are asked to vote on a tenure decision. At other times, a careless statement of relative values is more likely to turn potential friends of mathematics into enemies of our field. Believe me, we are going to need all the friends we can get.

善待擅长教学的老师(Do not look down on good teachers)

Mathematics is the greatest undertaking of mankind. All mathematicians know this. Yet many people do not share this view. Consequently, mathematics is not as self-supporting a profession in our society as the exercise of poetry was in medieval Ireland. Most of our income will have to come from teaching, and the more students we teach, the more of our friends we can appoint to our department. Those few colleagues who are successful at teaching undergraduate courses should earn our thanks as well as our respect. It is counterproductive to turn up our noses at those who bring home the dough.

学会推销自己的数学成果(Write expository papers)

When I was in graduate school, one of my teachers told me, “When you write a research paper, you are afraid that your result might already be known; but when you write an expository paper, you discover that nothing is known.”

It is not enough for you (or anyone) to have a good product to sell; you must package it right and advertise it properly. Otherwise you will go out of business.

When an engineer knocks at your door with a mathematical question, you should not try to get rid of him or her as quickly as possible.

不要把提问者拒之门外(Do not show your questioners to the door)

What the engineer wants is to be treated with respect and consideration, like the human being he is, and most of all to be listened to with rapt attention. If you do this, he will be likely to hit upon a clever new idea as he explains the problem to you, and you will get some of the credit.

Listening to engineers and other scientists is our duty. You may even learn some interesting new mathematics while doing so.

联合阵线(View the mathematical community as a United Front)

Grade school teachers, high school teachers, administrators and lobbyists are as much mathematicians as you or Hilbert. It is not up to us to make invidious distinctions. They contribute to the well-being of mathematics as much as or more than you or other mathematicians. They are right in feeling left out by snobbish research mathematicians who do not know on which side their bread is buttered. It is our best interest, as well as the interest of justice, to treat all who deal with mathematics in whatever way as equals. By being united we will increase the probability of our survival.

把科学从不可靠中拯救出来(Attack Flakiness)

Flakiness is nowadays creeping into the sciences like a virus through a computer, and it may be the present threat to our civilization. Mathematics can save the world from the invasion of the flakes by unmasking them and by contributing some hard thinking. You and I know that mathematics is not and will never be flaky, by definition.

This is the biggest chance we have had in a long while to make a lasting contribution to the well-being of Science. Let us not botch it as we did with the few other chances we have had in the past.

善待所有人(Learn when to withdraw)

Let me confess to you something I have told very few others (after all, this message will not get around much): I have written some of the papers I like the most while hiding in a closet. When the going gets rough, we have recourse to a way of salvation that is not available to ordinary mortals: we have that Mighty Fortress that is our Mathematics. This is what makes us mathematicians into very special people. The danger is envy from the rest of the world.

When you meet someone who does not know how to differentiate and integrate, be kind, gentle, understanding. Remember, there are lots of people like that out there, and if we are not careful, they will do away with us, as has happened many times before in history to other Very Special People.

参考资料:

  1. Rota, Gian-Carlo. “Ten lessons I wish I had been taught.” Indiscrete thoughts. Birkhäuser, Boston, MA, 1997. 195-203.
  2. Rota, Gian-Carlo. “Ten Lessons for the Survival of a Mathematics Department.” Indiscrete Thoughts. Birkhäuser, Boston, MA, 1997. 204-208.

素数之美

素数的定义

素数是在中小学课本里面就会出现的数学概念,它指的是只能够被 1 和它本身整除的正整数。在正整数中,2, 3, 5, 7, 11 等都是素数。同时,每一个正整数(不小于 2)都可以写成多个素数的乘积,例如 35 = 5 * 7, 10 = 2 * 5。从素数的定义可以看出,判断一个数是否是素数是需要通过“乘法”的。而在数学的研究历程中,数学家们同样也关心由素数之间的加法所产生的奇妙结论。

100以内素数表
100 以内的素数表

哥德巴赫猜想(Goldbach’s Conjecture)

随着徐迟的报告文学《哥德巴赫猜想》的问世,哥德巴赫猜想在国内早已家喻户晓。其中,哥德巴赫猜想包括两个部分:

  1. [Theorem] 每一个大于 7 的奇数都可以写成三个素数之和;
  2. [Conjecture] 每一个大于 6 的偶数都可以写成两个素数之和。
Goldbach_手稿_1
哥德巴赫的手稿

从猜想的陈述来看,如果第 2 部分是正确的,那么可以根据公式 n = (n-3) +3 直接得到第 1 部分是正确的,因此第 2 部分被称为强哥德巴赫猜想,第 1 部分被称为弱哥德巴赫猜想。其中哥德巴赫猜想的第 1 部分已经被彻底解决,而哥德巴赫猜想的第 2 部分目前最好的结果被称为陈氏定理( Chen’s Theorem)。用数学的语言来说,这两个定理的陈述分别是:

[Theorem (Vinogradov)] 假设 N 是一个奇数,令 r(N) = \sum_{p_{1}+p_{2}+p_{3}=N}1 表示关于 N 的计数函数,其中 p_{1}, p_{2}, p_{3} 都是素数。则存在一个一致有界的函数 \Omega(N) \in (c_{1},c_{2})c_{2}>c_{1}>0)对于充分大的奇数 N,有以下式子成立

r(N) = \Omega(N)\cdot \frac{N^{2}}{(\ln(N))^{3}}\cdot\bigg\{1+O\bigg(\frac{\ln\ln(N)}{\ln(N)}\bigg)\bigg\}.

备注:从以上公式可以看出,\lim_{N\rightarrow \infty} r(N) = +\infty. 换句话说,\exists N_{0}, \forall N\geq N_{0}, 弱哥德巴赫猜想成立。

[Theorem (Chen)] 假设 N 是一个偶数,令 r(N)=\sum_{p+n=N}1 表示关于 N 的计数函数,其中 p 是素数,n 表示最多为两个素数的乘积。则当 n 充分大的时候,有以下式子成立:

r(N) >> \Omega(N)\cdot \frac{2N}{(\ln(N))^{2}},

其中 \Omega(N) = \prod_{p>2} \bigg(1-\frac{1}{(p-1)^{2}}\bigg)\prod_{p|N, p>2}\frac{p-1}{p-2}.

备注:

  1. 在哥德巴赫猜想的研究过程中,通常数学家把偶数可表示为 a 个素数的乘积与 b 个素数的乘积之和这个问题,简称为 a + b 问题。所以,陈景润证明的 “1+2” 并不是指 1+2 = 3,而指的是对于每一个充分大的偶数,要么是两个素数之和,要么是一个素数加上两个素数之积。其实可以简单的理解为 p_{1}+p_{2} 或者 p_{1}+p_{2}\cdot p_{3},在这里 p_{1},p_{2},p_{3} 都是素数。从以上公式可以看出,\lim_{N\rightarrow \infty} r(N) = +\infty.
  2. 1920 年,挪威数学家 V.Brun 证明了 “9+9″,开启了数学家研究哥德巴赫猜想之路;1966 年,中国数学家陈景润证明了 “1+2″,把素数的筛法推向了顶峰。

孪生素数猜想(Twin Primes Conjecture)

在上千年的素数研究历程中,除了哥德巴赫猜想,孪生素数(Twin Primes)的研究也是数论中的一个重要课题。所谓孪生素数就是相差为 2 的两个素数,例如 (3,5), (5,7), (11,13),\cdots 等等。因此,就有人提出猜想:孪生素数有无穷多对。换句话说,如果用 p_{n} 表示第 n 个素数,那么孪生素数猜想就是 \liminf_{n\rightarrow +\infty}(p_{n+1}-p_{n})=2. 除了孪生素数本身之外,也有学者猜测,对于所有的正整数 k\geq 1, 形如 (p,p+2k) 的素数对同样有无穷多对。于是,在网上就有人对于有限的素数对进行了计算,让大家更好地看到素数之间的分布情况。

Twin_Prime_2
孪生素数及其推广

下面是部分关于素数间距(小间距,Small Gaps)的结论:

  1. 1940 年,Paul Erdos 证明 \exists c>0 使得 \liminf_{n\rightarrow\infty} \frac{p_{n+1}-p_{n}}{\ln(p_{n})}<c.
  2. 2005 年,Daniel Goldston,Janos Pintz 和 Cem Yildirim 证明 \liminf_{n\rightarrow\infty}\frac{p_{n+1}-p_{n}}{\ln(p_{n})}=0.
  3. 2007 年,上述结果被改进为 \liminf_{n\rightarrow\infty}\frac{p_{n+1}-p_{n}}{\sqrt{\ln(p_{n})}\cdot (\ln\ln(p_{n}))^{2}}=0.
  4. 2013 年,张益唐证明了 \liminf_{n\rightarrow\infty}(p_{n+1}-p_{n}) < 7 * 10^{7},随后这个结果被改进到 246。

除了素数之间的小间距之外,素数之间的大间距(Big Gaps)同样也有很多结论:

  1. 1931 年,Erik Westzynthius 证明 \limsup_{n\rightarrow\infty}\frac{p_{n+1}-p_{n}}{\ln(p_{n})} =\infty.
  2. 2014 年,Kevin Ford, Ben Green, Sergei Konyagin, Terence Tao 和 James Maynard 证明 p_{n+1}-p_{n}>c\cdot \frac{\ln(n)\cdot \ln\ln(n) \cdot \ln\ln\ln\ln(n)}{\ln\ln\ln(n)} 对于某个 c>0 和无穷个 n 成立。

素数定理

在研究素数的过程中,研究素数的分布规律就是这一切的关键所在。其中,素数定理则是描述素数分布的一个重要结论。类似的,关于孪生素数的分布也有一个上界的估计。

[素数定理] 假设 \pi(x) 表示不大于 x 的所有素数的个数,那么 \lim_{x\rightarrow \infty}\pi(x)/(x/\ln(x)) = 1.

[孪生素数个数的上界] 假设 \pi_{2}(x) 表示不大于 x 的所有孪生素数个数,那么存在常数 C>0 使得 \pi_{2}(x)\leq C\cdot x/(\ln(x))^{2}.

备注:从这两个定理可以粗糙地刻画出素数与孪生素数在实数轴的分布情况,并且可以看出孪生素数相对于素数则是少很多的。因为 \lim_{x\rightarrow+\infty}\pi_{2}(x)/\pi(x)=0.

prime_theorem
素数定理
Twin_Prime_Number_1
孪生素数的个数

素数的性质

在中小学的竞赛部分,大家总能够接触到一个关于素数的定理。

[Theorem (Euclid)] 素数有无穷多个。

证明:假设素数是有限个,不妨设为 p_{1},\cdots, p_{n},那么 N = \prod_{i=1}^{n}p_{i}+1 就是合数,但是它却不能被所有的素数 p_{1},\cdots,p_{n} 整除,所以导致矛盾。因此素数是无穷多个。证明完毕。

除此之外,在大学里面学习级数的时候,通常都会研究调和级数(Harmonic Series)的性质。所谓调和级数指的就是所有正整数的倒数和,形如:

S(x) = \sum_{1\leq n\leq x} \frac{1}{n}.

从定积分与级数的关系可以得到 \lim_{x\rightarrow +\infty}S(x) = +\infty 并且 S(x)  = \ln(x) + O(1). 也就是说,所有正整数的倒数和是发散的。

利用这种思路,其实可以分析所有素数的倒数和,也就是说 \sum_{p \text{ prime}} \frac{1}{p}. 通过欧拉公式可以得到:

\sum_{n=1}^{\infty}\frac{1}{n} = \prod_{p\text{ prime}}\bigg(1+\frac{1}{p}+\frac{1}{p^{2}}+\cdots\bigg)= \prod_{p\text{ prime}} \frac{1}{1-\frac{1}{p}},

两边取对数可以得到 \ln\bigg(\sum_{n=1}^{\infty}\frac{1}{n}\bigg) = \sum_{p\text{ prime}} -\ln\bigg(1-\frac{1}{p}\bigg),

由于 -\ln(1-x) = x + O(x^{2}),并且 \sum_{n=1}^{\infty}\frac{1}{n}=+\infty, \sum_{n=1}^{\infty}\frac{1}{n^{2}}=\frac{\pi^{2}}{6}, 可以得到

\ln\bigg(\sum_{n=1}^{\infty}\frac{1}{n} \bigg)= \sum_{p\text{ prime}}\frac{1}{p} + O\bigg(\sum_{p\text{ prime}}\frac{1}{p^{2}}\bigg).

等式的左边是发散的,右侧的第二项是收敛的,因此右侧的第一项(素数的倒数和)是发散的。进一步地,可以得到两个结论:

  1. \sum_{p\text{ prime}, p\leq x} \frac{1}{p} = \ln\ln(x) + O(1);
  2. \prod_{p\text{ prime}, p\leq x}\bigg(1-\frac{1}{p}\bigg)^{-1} = c\cdot\ln(x)+o(1), 这里,c>0 是一个常数。

至此,我们得到了两个级数的定理:

  1. [Theorem] 所有正整数的倒数和是发散的;
  2. [Theorem] 所有素数的倒数和是发散的。

从第 2 个结论同样可以得到素数是无穷多个。于是,就有数学家猜测如果孪生素数的倒数和是发散的,那么孪生素数同样也是无穷多对。但是在 1915 年,数学家 Brun 证明了,孪生素数的倒数和是收敛的,这个收敛的数字也被称为 Brun 常数。

[Theorem] 所有孪生素数的倒数和是收敛的。

证明:通过孪生素数个数的上界公式,可以得到存在 C>0 使得对于充分大的 x,有

\pi_{2}(x) \leq C\cdot \frac{x}{(\ln(x))^{2}}

成立。假设素数序列 p'_{1}, p_{2}',\cdots, p_{n}',\cdots 使得 p, p+2 都是素数,那么 n = \pi_{2}(p_{n}') \leq C\frac{p_{n}'}{(\ln(p_{n}'))^{2}}\leq C\frac{p_{n}'}{(\ln(n))^{2}},进一步可以得到

\frac{1}{p_{n}'} \leq C\frac{1}{n\cdot (\ln(n))^{2}}

对于充分大的 n 成立。而右侧是收敛的,i.e. \sum_{n=2}^{\infty} \frac{1}{n\cdot(\ln(n))^{2}}<+\infty. 因此,孪生素数的倒数和是收敛的。证明完毕。

备注:由于孪生素数的倒数和是收敛的,因此,通过孪生素数的倒数和来证明孪生素数有无穷多对这条路就被封死了。

在研究孪生素数的过程中,其目的是为了研究素数之间的间距究竟能有多小,也就是分析 \liminf_{n\rightarrow+\infty}(p_{n+1}-p_{n}) 的上界。同样的,也可以研究素数之间的间距究竟有多大,并且可以分析其量级大约是多少,此时就需要研究 \limsup_{n\rightarrow+\infty}(p_{n+1}-p_{n}).

[Theorem] 对于充分大的 x 而言,在 [1,x] 内,素数之间的最小间隔 \min_{p_{n}\leq x} (p_{n}-p_{n-1})\leq (1+o(1))\ln(x); 同时,素数之间的最大间隔 \max_{p_{n}\leq x}(p_{n}-p_{n-1})\geq (1+o(1))\ln(x).

证明:考虑区间 [1,x],通过素数定理可以得到在 [1,x] 区间内的素数大约是 \pi(x) \sim x/\ln(x) 个。于是把该区间 [1,x] 切割成长度为 \ln(x) 的子区间,区间的个数为 x/\ln(x), 通过鸽笼原理 (Pigeonhole Principle) 可以得到此定理的结论。

备注:除此之外,证明相邻素数的间隔没有上限还可以用构造法。考虑 n!+2, n!+3, \cdots, n!+nn 个连续的合数,所以两个相邻的素数必在 [n!+2, n!+n] 这个区间两侧。因此相邻素数的间隔没有上限,i.e. \limsup_{n\rightarrow+\infty}(p_{n+1}-p_{n})=+\infty.

Eratosthenes 筛法(Eratosthenes Sieve Method)

Eratosthenes 筛法是数学家 Eratosthenes 提出的一种筛选素数的方法,其思路比较简单:想要筛选出 [2,n] 中的所有素数,则首先把 [2,n] 中的所有正整数按照从小到大的顺序 2, \cdots, n 来排列,然后按照如下步骤执行:

  1. 读取数列中当前最小的数 2,然后把 2 的倍数全部删除;
  2. 读取数列中当前最小的数 3,然后把 3 的倍数全部删除;
  3. 读取数列中当前最小的数 5,然后把 5 的倍数全部删除;(4 已经被第一步去掉了)
  4. 读取数列中当前最小的数 7,然后把 7 的倍数全部删除;(6 已经被第一步去掉了)
  5. 循环以上步骤直到 [2,n] 中所有的数被读取或者被删除。
其算法复杂度为 O(n\ln(n))
埃拉托色尼筛选法
黄色的数为素数

Brun 筛法(Brun Sieve Method)

在数学界发展出各种筛法,其重要目的之一就是为了解决孪生素数猜想和哥德巴赫猜想。除了 Eratosthenes 筛法之外,数学家 V. Brun 也发现了一种筛法,后人称之为 Brun’s Sieve。其目的就是为了估计孪生素数的上界,进一步得到计算孪生素数的倒数和。其主要结论就是 \pi_{2}(x)\leq C\frac{x}{(\ln(x))^{2}}, 其中 C>0 是一个常数,并且 Brun 通过其筛法可以得到哥德巴赫猜想中的 “9+9″,在哥德巴赫猜想的发展中属于里程碑式的工作。

Question. 研究素数究竟有什么用?

Answer. 为了人类智慧的荣耀。

参考文献:

  1.  Small and Large Gaps Between Primes, Terence Tao, Latinos in the Mathematical Sciences Conference, 2015.
  2.  Bounded Gaps Beween Primes, Yitang Zhang, 2013.
  3.  Additive Number Theory, Melvyn B.Nathanson, GTM 164.
  4.  http://mathworld.wolfram.com/TwinPrimes.html.

拉格朗日四平方和定理

拉格朗日四平方和定理

每个正整数均可表示为四个整数的平方和。

Every positive integer is the sum of four squares.

例如:

  • 1=1^{2}+0^{2}+0^{2}+0^{2}
  • 2 = 1^{2}+1^{2}+0^{2}+0^{2}
  • 7 = 2^{2}+1^{2}+1^{2}+1^{2}

证明:可以直接验证如下恒等式

(x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2})\cdot(y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}) = z_{1}^{2}+z_{2}^{2}+z_{3}^{2}+z_{4}^{2},其中

\begin{cases} z_{1}=x_{1}y_{1}+x_{2}y_{2}+x_{3}y_{3}+x_{4}y_{4} \\ z_{2}=x_{1}y_{2}-x_{2}y_{1}-x_{3}y_{4}+x_{4}y_{3} \\ z_{3}=x_{1}y_{3}-x_{3}y_{1}+x_{2}y_{4}-x_{4}y_{2} \\ z_{4}=x_{1}y_{4}-x_{4}y_{1}-x_{2}y_{3}+x_{3}y_{2}\end{cases}

由于 1 与 2 都明显满足这个定理,那么只需要考虑大于 2 的正整数。而这些正整数都可以分解成素数的乘积,因此,只需要证明该定理对所有的素数成立,则使用以上恒等式就可以得到最终的结论。假设 p 是一个奇素数。

由于 \{a^{2}:a\in\{0,1,\cdots,(p-1)/2\}\} 里面有 (p+1)/2 个不同的同余类,\{-b^{2}-1: b\in \{0,1,\cdots,(p-1)/2\}\} 里面也有 (p+1)/2 个不同的同余类,但是素数 p 的同余类只有 p 个,因此存在正整数 a,b\in \{0,1,\cdots, (p-1)/2\} 满足 a^{2}\equiv -b^{2}-1 (\mod p)。也就是说 a^{2}+b^{2}+1^{2}+0^{2}\equiv 0(\mod p)。令 n\in\mathbb{Z} 满足 np=a^{2}+b^{2}+1,则有 p\leq np\leq 2(p-1)^{2}/4+1<p^{2}。于是,1\leq n<p

因此存在一个 1\leq n<p 使得 np = a^{2}+b^{2}+1^{2}+0^{2} 是四个整数的平方和。于是必定存在一个最小的正整数 m 使得 1\leq m\leq n<p 使得 mp 为四个整数的平方和,不妨设为 mp=x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2}

Claim. m=1

proof of the claim. 反证法,假设 1<m\leq n<p 成立。令 y_{i}=x_{i}(\mod m) 对于 i\in\{1,2,3,4\} 成立,并且 -m/2<y_{i}\leq m/2。因此,y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}\equiv(x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2})\equiv mp \equiv 0(\mod m)。令 mr = y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}。因此,mr\leq 4(m/2)^{2}=m^{2}

如果 r =m,通过以上不等式得知 r=m 等价于 y_{i}=m/2 对于 i\in\{1,2,3,4\} 都成立。此时,mp = x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2}\equiv 4(m/2)^{2} \equiv 0 (\mod m^{2})。因此,pm 的倍数,这与 p 是素数,m>1 矛盾。所以,r<m 成立。i.e. 1\leq r<m\leq n<p 成立。

进一步地,(mp)\cdot(mr) = (x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2})\cdot(y_{1}^{2}+y_{2}^{2}+y_{3}^{2}+y_{4}^{2}) = z_{1}^{2}+z_{2}^{2}+z_{3}^{2}+z_{4}^{2},这里的 z_{i} 正如恒定式里面所定义的。由于 y_{i}\equiv x_{i}(\mod m),并且 \sum_{i=1}^{4}x_{i}^{2}\equiv 0(\mod m)。因此,z_{i}\equiv 0(\mod m) 对于 i\in\{1,2,3,4\} 都成立。所以,z_{i}=w_{i}mw_{i}\in\mathbb{Z} 对于 i\in\{1,2,3,4\} 都成立。通过 (mp)\cdot(mr) = \sum_{i=1}^{4}z_{i}^{2} 可以得到 pr=\sum_{i=1}^{4}w_{i}^{2} 成立。但是,1\leq r<m 这与 m 的最小性假设矛盾了。

因此,m=1,Claim 证明完毕。

于是,对于所有的奇素数,都可以表示为四个整数的平方之和。根据之前的分析,可以得到对于所有的正整数,都可以表示为四个整数的平方之和。Lagrange 定理证明完毕。

参考文献

  1. GTM 164, Additive Number Theory, Melvyn B.Nathanson, 1996.

传染病的数学模型

近期,国内的疫情闹得沸沸扬扬,很多省市自治区都出现了流感的患者。回想起之前在学校的时候曾经研究过微分方程和动力系统,于是整理一下相关的数学模型,分享给各位读者。笔者并不是研究这个领域的专家,并且这篇文章只是从微分方程角度出发,分析方程的性质,不一定适用于真实环境,而且真实环境比这个也复杂得多。

关于传染病的数学模型,在许多年前数学界早已做过研究,根据传染病的传播速度不同,空间范围各异,传播途径多样,动力学机理等各种因素,对传染病模型按照传染病的类型划分为 SI,SIR,SIRS,SEIR 模型。如果是按照连续时间来划分,那么这些模型基本上可以划分为常微分方程(Ordinary Differential Equation),偏微分方程(Partial Differential Equation)等多种方程模型;如果是基于离散的时间来划分,那么就是所谓的差分方程(Difference Equation)。

在本文中,将会主要介绍常微分方程中的一些传染病数学模型。在介绍方程之前,首先要介绍一些常用的符号:在时间戳 t 上,可以定义以下几种人群:

  • 易感者(susceptible):用符号 S(t) 来表示;
  • 感染者(infective):用符号 I(t) 来表示;
  • 康复者(Recoverd):用符号 R(t) 来表示;

其次,在时间戳 t 上,总人口是 N(t)=S(t)+I(t)+R(t)。如果暂时不考虑人口增加和死亡的情况,那么 N(t)\equiv N 是一个恒定的常数值。

除此之外,

  • r 表示在单位时间内感染者接触到的易感者人数;
  • 传染率:\beta 表示感染者接触到易感者之后,易感者得病的概率;
  • 康复率:\gamma 表示感染者康复的概率,有可能变成易感者(可再感染),也有可能变成康复者(不再感染)。

在进行下面的分析之前,先讲一个常微分方程的解。

Claim. 假设 x=x(t) 是关于 t 的一个方程,且满足 \frac{dx}{dt} + a_{1}x + a_{2}x^{2}=0x(0)=x_{0},那么它的解是:x(t) = \frac{e^{-a_{1}t}}{\frac{1}{x_{0}}-\frac{a_{2}}{a_{1}}(e^{-a_{1}t}-1)}.

Proof. 证明如下:

通过 \frac{dx}{dt}+a_{1}x+a_{2}x^{2}=0 可以得到 -\frac{d}{dt}\bigg(\frac{1}{x}\bigg) + a_{1}\bigg(\frac{1}{x}\bigg)+a_{2}=0;令 y = 1/x,得到 \frac{dy}{dt}-a_{1}y=a_{2}。所以,\frac{d}{dt}(e^{-a_{1}t}y) = a_{2}e^{-a_{1}t},两边积分可以得到 e^{-a_{1}t}y-y_{0}=\bigg(-\frac{a_{2}}{a_{1}}\bigg)(e^{-a_{1}t}-1),其中 y_{0}=1/x_{0}。求解之后得到:x(t) = e^{-a_{1}t}/\bigg(\frac{1}{x_{0}}-\frac{a_{2}}{a_{1}}(e^{-a_{1}t}-1)\bigg)

SI 模型(Susceptible-Infective Model)

在 SI 模型里面,只考虑了易感者和感染者,并且感染者不能够恢复,此类病症有 HIV 等;

SI_model_1
SI Model

其微分方程就是:

\begin{cases}\frac{dS}{dt} = -\frac{r\beta I}{N} S \\ \frac{dI}{dt}=\frac{r\beta I}{N}S \end{cases}

初始条件就是 S(0)=S_{0}I(0) = I_{0},并且 S(t)+I(t)=N 对于所有的 t\geq 0 都成立。

于是,把 S = N - I 代入第二个微分方程可以得到:\frac{dI}{dt} - r\beta I + \frac{r\beta}{N}I^{2}=0。因此根据前面所提到的常微分方程的解可以得到:

I(t) = \frac{NI_{0}}{I_{0}+(N-I_{0})e^{-r\beta t}}.

这个就是所谓的逻辑回归函数,而在机器学习领域,最简单的逻辑回归函数就是 \sigma(x) = 1/(1+e^{-x}) 这个定义。而 I(t) 只是做了一些坐标轴的平移和压缩而已。由于 \lim_{t\rightarrow +\infty}e^{-t}=0,所以,\lim_{t\rightarrow +\infty}I(t) = N,从而 \lim_{t\rightarrow +\infty}S(t) = 0

通过数值模拟可以进一步知道:

SI_model_graph_1
SI model 的数值模拟(一)

简单来看,在 SI 模型的假设下,全部人群到最后都会被感染。

SIS 模型(Susceptible-Infectious-Susceptible Model)

除了 HIV 这种比较严重的病之外,还有很多小病是可以恢复并且反复感染的,例如日常的感冒,发烧等。在这种情况下,感染者就有一定的几率重新转化成易感者。如下图所示:

SIS_model_1
SIS model

其微分方程就是:

\begin{cases} \frac{dS}{dt} = -r \beta S\frac{I}{N} + \gamma I \\ \frac{dI}{dt}=r\beta S \frac{I}{N} - \gamma I \end{cases},其初始条件就是 S(0)=S_{0}I(0)=I_{0}.

使用同样的方法,把 S=N-I 代入第二个微分方程可以得到:\frac{dI}{dt} - (r\beta - \gamma)I + \frac{r\beta}{N}I^{2}=0. 通过之前的 Claim 可以得到解为:

I(t) = \frac{N(r\beta-\gamma)}{r\beta}/\bigg(\bigg(\frac{N(r\beta-\gamma)}{I_{0}r\beta}-1\bigg)e^{-(r\beta-\gamma)t}+1\bigg).

从而可以得到 \lim_{t\rightarrow +\infty} I(t) = N(r\beta - \gamma)/(r\beta)\lim_{t\rightarrow +\infty} S(t) = (N\gamma)/(r\beta). 这个方程同样也是逻辑回归方程,只是它的渐近线与之前的 SI 模型有所不同。

SIS_model_graph_1
SIS model 的数值模拟(二)

SIR 模型(Susceptible-Infectious-Recovered Model)

有的时候,感染者在康复了之后,就有了抗体,于是后续就不再会获得此类病症,这种时候,考虑 SIS 模型就不合适了,需要考虑 SIR 模型。此类病症有麻疹,腮腺炎,风疹等。

SIR_model_1
SIR model

其微分方程是:\begin{cases} \frac{dS}{dt}=-r\beta S \frac{I}{N} \\ \frac{dI}{dt}=r\beta S\frac{I}{N} - \gamma I \\ \frac{dR}{dt}=\gamma I\end{cases}。其初始条件是 S(0)=S_{0}, I(0)=I_{0}, R(0)=R_{0},并且 S(t), I(t), R(t)\geq 0S(t) +I(t)+R(t)=N 对于所有的 t\geq 0 都成立。

对于这类方程,就不能够得到其解析解了,只能够从它的动力系统开始进行分析,得到解的信息。根据第一个微分方程可以得到:\frac{dS}{dt} = -r\beta S\frac{I}{N}<0,于是 S(t) 是一个严格递减函数。同时,0\leq S(t)\leq N 对于所有的 t\geq 0 都成立,于是存在 S_{\infty}\in[0,\infty] 使得 \lim_{t\rightarrow \infty}S(t)=S_{\infty}.

通过第一个微分方程和第二个微分方程可以得到:\frac{d(S+I)}{dt} = -\gamma I,因此对它两边积分得到 \int_{0}^{T} \frac{d(S+I)}{dt} = -\gamma \int_{0}^{T}I(t)dt. 左侧等于 S(T) + I(T) - S(0) - I(0),上界是 4N,因此令 T\rightarrow \infty 可以得到 \int_{0}^{\infty}I(t) dt\leq 4N/\gamma. 而 I(t)\geq 0 且是连续可微函数,因此 \lim_{t\rightarrow \infty}I(t) = 0。这意味着所有的感染人群都将康复。

由于 S(t) 是严格单调递减函数,因此从第二个微分方程可以得到:当 S(t) = N\gamma/(r\beta) 时,感染人数 I(t) 达到最大值。

SIR_model_graph_1
SIR model 的数值模拟(一)
SIR_model_graph_2
SIR model 的数值模拟(二)

其余模型

在以上的 SI,SIS,SIR 模型中,还可以把死亡因素考虑进去。除此之外,还有 SIRS 模型,SEIR 模型等,在这里就不再做赘述。有兴趣的读者可以参阅相关的参考书籍。

参考文献

  1. Introduction to SEIR Models, Nakul Chitnis, Workshop on Mathematical Models of Climate Variability, Environmental Change and Infectious Diseases, Trieste, Italy, 2017

 

用 Python 来研究数学 — SymPy 符号工具包介绍

SymPy 的简单介绍

SymPy 是一个符号计算的 Python 库,完全由 Python 写成,为许多数值分析,符号计算提供了重要的工具。SymPy 的第一个版本于 2007 年开源,并且经历了十几个版本的迭代,在 2019 年已经基于修正的 BSD 许可证开源了 1.4 版本。SymPy 的开源地址和官方网站分别是:

  1. GitHub 链接:https://github.com/sympy/sympy
  2. SymPy 官方网站:https://www.sympy.org/en/index.html
sympy_logo
SymPy 的 logo

SymPy 的 1.4 版本文档中,可以看出,SymPy 可以支持很多初等数学,高等数学,甚至研究生数学的符号计算。在初等数学和高等数学中,SymPy 可以支持的内容包括但不限于:

  1. 基础计算(Basic Operations);
  2. 公式简化(Simplification);
  3. 微积分(Calculus);
  4. 解方程(Solver);
  5. 矩阵(Matrices);
  6. 几何(geometry);
  7. 级数(Series);

在更多的数学领域中,SymPy 可以支持的内容包括但不限于:

  1. 范畴论(Category Theory);
  2. 微分几何(Differential Geometry);
  3. 常微分方程(ODE);
  4. 偏微分方程(PDE);
  5. 傅立叶变换(Fourier Transform);
  6. 集合论(Set Theory);
  7. 逻辑计算(Logic Theory)。
sympy_tutorial
SymPy 的教学目录

SymPy 的工具库介绍

SymPy 的基础计算

在数学中,基础的计算包括实数和复数的加减乘除,那么就需要在程序中描述出实数与复数。著名的欧拉公式

e^{i\pi}+1 = 0

正好用到了数学中最常见的五个实数。在 SymPy 里面,e, i, \pi, \infty 是用以下符号来表示的:其中 sympy.exp() 表示以 e 为底的函数。

sympy.exp(1), sympy.I, sympy.pi, sympy.oo

而想要计算欧拉公式的话,只需要输入下面的公式即可:

>>> sympy.exp(sympy.I * sympy.pi) + 1
0

如果需要看 e, \pi 的小数值,可以使用 evalf() 函数,其中 evalf() 函数里面的值表示有效数字的位数。例如下面就是精确到 10 位有效数字。当然,也可以不输入。

>>> sympy.E.evalf(10)
2.718281828
>>> sympy.E.evalf()
2.71828182845905
>>> sympy.pi.evalf(10)
3.141592654
>>> sympy.pi.evalf()
3.14159265358979

除此之外,如果需要查看某个实数的有效数字,也是类似操作的:

>>> expr = sympy.sqrt(8)
>>> expr.evalf()
2.82842712474619

而对于实数的加减乘除,则可以如下操作:

>>> x, y= sympy.symbols("x y")
>>> x + y
x + y
>>> x - y
x - y
>>> x * y
x*y
>>> x / y
x/y

而对于复数的加减乘除,则是类似的操作,令两个复数分别是 z_{1} = x_{1} + i y_{1}z_{2} = x_{2} + i y_{2}

>>> x1, y1, x2, y2 = sympy.symbols("x1 y1 x2 y2")
>>> z1 = x1 + y1 * sympy.I
x1 + I*y1
>>>  z2 = x2 + y2 * sympy.I
x2 + I*y2
>>> z1 + z2
x1 + x2 + I*y1 + I*y2
>>> z1 - z2
x1 - x2 + I*y1 - I*y2
>>> z1 * z2
(x1 + I*y1)*(x2 + I*y2)
>>> z1 / z2
(x1 + I*y1)/(x2 + I*y2)

对于多项式而言,有的时候我们希望将其展开,有的时候则需要将其合并,最终将其简化成最简单的形式。

>>> sympy.expand((x+1)**2)
x**2 + 2*x + 1
>>> sympy.expand((x+1)**5)
x**5 + 5*x**4 + 10*x**3 + 10*x**2 + 5*x + 1
>>> sympy.factor(x**3+1)
(x + 1)*(x**2 - x + 1)
>>> sympy.factor(x**2+3*x+2)
(x + 1)*(x + 2)
>>> sympy.simplify(x**2 + x + 1 - x)
x**2 + 1
>>> sympy.simplify(sympy.sin(x)**2 + sympy.cos(x)**2)
1

在多变量的场景下,SymPy 也可以对其中的某个变量合并同类项,同时还可以计算某个变量的某个次数所对应的系数是多少,例如:

>>> expr = x*y + x - 3 + 2*x**2 - x**2 + x**3 + y**2 + x**2*y**2
>>> sympy.collect(expr,x)
x**3 + x**2*(y**2 + 1) + x*(y + 1) + y**2 - 3
>>> sympy.collect(expr,y)
x**3 + x**2 + x*y + x + y**2*(x**2 + 1) - 3
>>> expr.coeff(x, 2)
y**2 + 1
>>> expr.coeff(y, 1)
x

有理函数形如 f(x) = p(x)/q(x),其中 p(x)q(x) 都是多项式。一般情况下,我们希望对有理函数进行简化,合并或者分解的数学计算。

在需要合并的情形下,如果想把有理函数处理成标准格式 p(x)/q(x) 并且去除公因子,那么可以使用 cancel 函数。另一个类似的就是 together 函数,但是不同之处在于 cancel 会消除公因子,together 不会消除公因子。例如:

expr = \frac{x^{2}+3x+2}{x^{2}+x}

>>> expr = (x**2 + 3*x + 2)/(x**2 + x)
>>> sympy.cancel(expr)
(x + 2)/x
>>> sympy.together(expr)
(x**2 + 3*x + 2)/(x*(x + 1))

除了合并和消除公因子之外,有的时候还希望对分子和分母进行因式分解,例如:

expr = (x**2 + 3*x + 2)/(x**2 + x)
>>> sympy.factor(expr)
(x + 2)/x
>>> expr = (x**3 + 3*x**2 + 2*x)/(x**5+x)
>>> sympy.factor(expr)
(x + 1)*(x + 2)/(x**4 + 1)
>>> expr = x**2 + (2*x+1)/(x**3+1)
>>> sympy.factor(expr)
(x**5 + x**2 + 2*x + 1)/((x + 1)*(x**2 - x + 1))

合并的反面就是部分分式展开(Partial Fraction Decomposition),它是把有理函数分解成多个次数较低的有理函数和的形式。这里需要用 apart 函数:

>>> expr = (x**4 + 3*x**2 + 2*x)/(x**2+x)
>>> sympy.apart(expr)
x**2 - x + 4 - 2/(x + 1)
>>> expr = (x**5 + 1)/(x**3+1)
>>> sympy.apart(expr)
x**2 - (x - 1)/(x**2 - x + 1)

在 SymPy 里面,同样支持各种各样的三角函数,例如:三角函数的简化函数 trigsimp,三角函数的展开 expand_trig,

>>> expr = sympy.sin(x)**2 + sympy.cos(x)**2
>>> sympy.trigsimp(expr)
1
>>> sympy.expand_trig(sympy.sin(x+y))
sin(x)*cos(y) + sin(y)*cos(x)
>>> sympy.expand_trig(sympy.cos(x+y))
-sin(x)*sin(y) + cos(x)*cos(y)
>>> sympy.trigsimp(sympy.sin(x)*sympy.cos(y) + sympy.sin(y)*sympy.cos(x))
sin(x + y)
>>> sympy.trigsimp(-sympy.sin(x)*sympy.sin(y) + sympy.cos(x)*sympy.cos(y))
cos(x + y)

同样的,在乘幂上面,同样有简化函数 powsimp,效果与之前提到的 simplify 一样。除此之外,还可以根据底数来做合并,即分别使用 expand_power_exp 函数与 expand_power_base 函数。

>>> sympy.powsimp(x**z*y**z*x**z)
x**(2*z)*y**z
>>> sympy.simplify(x**z*y**z*x**z)
x**(2*z)*y**z
>>> sympy.expand_power_exp(x**(y + z))
x**y*x**z
>>> sympy.expand_power_base(x**(y + z))
x**(y + z)

作为指数的反函数对数,sympy 也是有着类似的展开合并函数,expand_log,logcombine 承担了这样的角色。

\ln(xy) = \ln(x) + \ln(y)

\ln(x/y) = \ln(x) - \ln(y)

>>> sympy.expand_log(sympy.log(x*y), force=True)
log(x) + log(y)
>>> sympy.expand_log(sympy.log(x/y), force=True)
log(x) - log(y)

 

SymPy 的微积分工具

下面,我们会从一个最基本的函数 f(x) = 1/x 出发,来介绍 SymPy 的各种函数使用方法。如果想进行变量替换,例如把 x 变成 y,那么可以使用 substitution 方法。除此之外,有的时候也希望能够得到函数 f 在某个点的取值,例如 f(1) = 1/1 = 1,那么可以把参数换成 1 即可得到函数的取值。例如,

>>> import sympy
>>> x = sympy.Symbol("x")
>>> f = 1 / x
1/x
>>> y = sympy.Symbol("y")
>>> f = f.subs(x,y)
1/y
>>> f = f.subs(y,1)
1

在微积分里面,最常见的概念就是极限,SymPy 里面的极限函数就是 limit。使用方法如下:

>>> f = 1/x
>>> sympy.limit(f,x,0)
oo
>>> sympy.limit(f,x,2)
1/2
>>> sympy.limit(f,x,sympy.oo)
0
>>> g = x * sympy.log(x)
>>> sympy.limit(g,x,0)
0

对于函数 f(x) = 1/x 而言,它的导数计算函数是 diff,n 阶导数也可以用这个函数算。

>>> f = 1/x
>>> sympy.diff(f,x)
-1/x**2
>>> sympy.diff(f,x,2)
2/x**3
>>> sympy.diff(f,x,3)
-6/x**4
>>> sympy.diff(f,x,4)
24/x**5

提到 n 阶导数,就必须要提一下 Taylor Series 了。对于常见函数的 Taylor Series,SymPy 也是有非常简便的方法,那就是 series 函数。其参数包括 expr, x, x0, n, dir,分别对应着表达式,函数的自变量,Taylor Series 的中心点,n 表示阶数,dir 表示方向,包括”+-“,”-“,”+”,分别表示 x\rightarrow x0, x\rightarrow x0^{-}, x\rightarrow x0^{+}

sympy.series.series.series(exprx=Nonex0=0n=6dir='+') >>> g = sympy.cos(x) >>> sympy.series(g, x) 1 - x**2/2 + x**4/24 + O(x**6) >>> sympy.series(g, x, x0=1, n=10) cos(1) - (x - 1)*sin(1) - (x - 1)**2*cos(1)/2 + (x - 1)**3*sin(1)/6 + (x - 1)**4*cos(1)/24 - (x - 1)**5*sin(1)/120 - (x - 1)**6*cos(1)/720 + (x - 1)**7*sin(1)/5040 + (x - 1)**8*cos(1)/40320 - (x - 1)**9*sin(1)/362880 + O((x - 1)**10, (x, 1))

积分的计算函数是 integrate,包括定积分与不定积分:

\int\frac{1}{x}dx = \ln(x)+C

\int_{1}^{2}\frac{1}{x}dx = \ln(2)

>>> f = 1/x
>>> sympy.integrate(f,x)
log(x)
>>> sympy.integrate(f, (x,1,2))
log(2)

对于广义积分而言,就需要用到 \infty 这个概念了,但是在 SymPy 里面的写法还是一样的。

\int_{-\infty}^{0}e^{-x^{2}}dx=\frac{\sqrt{\pi}}{2}

\int_{0}^{+\infty}e^{-x}dx = 1

\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}e^{-x^{2}-y^{2}}dxdy = \pi

>>> g = sympy.exp(-x**2)
>>> sympy.integrate(g, (x,-sympy.oo,0))
sqrt(pi)/2
>>> g = sympy.exp(-x)
>>> sympy.integrate(g, (x, 0, sympy.oo))
1
>>> h = sympy.exp(-x**2 - y**2)
>>> sympy.integrate(h, (x,-sympy.oo, sympy.oo), (y, -sympy.oo, sympy.oo))
pi

 

SymPy 的方程工具

在初等数学中,通常都存在一元一次方程,一元二次方程等,并且在不同的域上有着不同的解。SymPy 里面的相应函数就是 solveset,根据定义域的不同,可以获得完全不同的解。

\{x\in\mathbb{R}: x^{3}-1=0\}

\{x\in\mathbb{C}:x^{3}-1=0\}

\{x\in\mathbb{R}:e^{x}-x=0\}

\{x\in\mathbb{R}:e^{x}-1=0\}

\{x\in\mathbb{C}:e^{x}-1=0\}

>>> sympy.solveset(sympy.Eq(x**3,1), x, domain=sympy.S.Reals)
{1}
>>> sympy.solveset(sympy.Eq(x**3,1), x, domain=sympy.S.Complexes)
{1, -1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2}
>>> sympy.solveset(sympy.Eq(x**3 - 1,0), x, domain=sympy.S.Reals)
{1}
>>> sympy.solveset(sympy.Eq(x**3 - 1,0), x, domain=sympy.S.Complexes)
{1, -1/2 - sqrt(3)*I/2, -1/2 + sqrt(3)*I/2}
>>> sympy.solveset(sympy.exp(x),x)
EmptySet()
>>> sympy.solveset(sympy.exp(x)-1,x,domain=sympy.S.Reals)
{0}
>>> sympy.solveset(sympy.exp(x)-1,x,domain=sympy.S.Complexes)
ImageSet(Lambda(_n, 2*_n*I*pi), Integers)

在这里,Lambda 表示的是数学公式,第一个是自变量,第二个是函数,最后是自变量的定义域。

在线性代数中,最常见的还是多元一次方程组,那么解法是一样的:

\begin{cases}x+y-10=0 \\ x-y-2=0\end{cases}

>>> sympy.solve([x+y-10, x-y-2], [x,y])
{x: 6, y: 4}

对于三角函数,也是类似的写法:

\begin{cases} \sin(x-y)=0 \\ \cos(x+y)=0 \end{cases}

>>> sympy.solve([sympy.sin(x-y), sympy.cos(x+y)], [x,y])
[(-pi/4, 3*pi/4), (pi/4, pi/4), (3*pi/4, 3*pi/4), (5*pi/4, pi/4)]

 

SymPy 的矩阵工具

在矩阵论中,最常见的就是单位矩阵了,而单位矩阵只与一个参数有关,那就是矩阵的大小。下面就是 3*3,3*2,2*3 大小的矩阵。

>>> sympy.eye(3)
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
>>> sympy.eye(3,2)
Matrix([
[1, 0],
[0, 1],
[0, 0]])
>>> sympy.eye(2,3)
Matrix([
[1, 0, 0],
[0, 1, 0]])

另外还有全零和全一矩阵,意思就是矩阵中的所有值全部是零和一。

>>> sympy.ones(2,3)
Matrix([
[1, 1, 1],
[1, 1, 1]])
>>> sympy.zeros(3,2)
Matrix([
[0, 0],
[0, 0],
[0, 0]])

而对角矩阵也可以使用 diag 轻松获得:

>>> sympy.diag(1,1,2)
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 2]])

而矩阵的加法,减法,乘法,逆运算,转置,行列式,SymPy 都是可以支持的:

A = \left(\begin{array}{cc} 1 & 1 \\ 0 & 2 \end{array}\right)

B = \left(\begin{array}{cc} 1 & 0 \\ 1 & 1 \end{array}\right)

>>> A = sympy.Matrix([[1,1],[0,2]])
>>> B = sympy.Matrix([[1,0],[1,1]])
>>> A
Matrix([
[1, 1],
[0, 2]])
>>> B
Matrix([
[1, 0],
[1, 1]])
>>> A + B
Matrix([
[2, 1],
[1, 3]])
>>> A - B
Matrix([
[ 0, 1],
[-1, 1]])
>>> A * B
Matrix([
[2, 1],
[2, 2]])
>>> A * B**-1
Matrix([
[ 0, 1],
[-2, 2]])
>>> B**-1
Matrix([
[ 1, 0],
[-1, 1]])
>>> A.T
Matrix([
[1, 0],
[1, 2]])
>>> A.det()
2

在某些情况下,需要对矩阵进行加上一行或者加上一列的操作,在这里就可以使用 row_insert 或者 col_insert 函数:第一个参数表示插入的位置,第二个参数就是相应的行向量或者列向量。而在删除上就很简单了,直接使用 row_del 或者 col_del 即可。

>>> A
Matrix([
[1, 1],
[0, 2]])
>>> A.row_insert(1, sympy.Matrix([[10,10]]))
Matrix([
[ 1, 1],
[10, 10],
[ 0, 2]])
>>> A.col_insert(0, sympy.Matrix([3,3]))
Matrix([
[3, 1, 1],
[3, 0, 2]])
>>> A.row_del(0)
>>> A
Matrix([[0, 2]])
>>> A.col_del(1)
>>> A
Matrix([[0]])

在对角化方面,同样可以使用 eigenvals(),eigenvecs(), diagonalize() 函数:

>>> A
Matrix([
[1, 1],
[0, 2]])
>>> A.eigenvals()
{2: 1, 1: 1}
>>> A.eigenvects()
[(1, 1, [Matrix([
[1],
[0]])]), (2, 1, [Matrix([
[1],
[1]])])]
>>> A.diagonalize()
(Matrix([
[1, 1],
[0, 1]]), Matrix([
[1, 0],
[0, 2]]))

在 eigenvals() 返回的结果中,第一个表示特征值,第二个表示该特征值的重数。在特征向量 eigenvecs() 中,第一个表示特征值,第二个表示特征值的重数,第三个表示特征向量。在对角化 diagonalize() 中,第一个矩阵表示 P,第二个矩阵表示 DA = P*D*P^{-1}

在矩阵中,最常见的还是多元一次方程的解。如果要求 Ax =b 的解,可以有以下方案:

>>> A = sympy.Matrix([[1,1],[0,2]])
>>> A
Matrix([
[1, 1],
[0, 2]])
>>> b = sympy.Matrix([3,5])
>>> b
Matrix([
[3],
[5]])
>>> A**-1*b
Matrix([
[1/2],
[5/2]])
>>> sympy.linsolve((A,b))
{(1/2, 5/2)}
>>> sympy.linsolve((A,b),[x,y])
{(1/2, 5/2)}

 

SymPy 的集合论工具

集合论可以说是数学的基础,在任何数学的方向上都能够看到集合论的身影。在 SymPy 里面,有一个类叫做 sympy.sets.sets.set。在集合论里面,常见的就是边界,补集,包含,并集,交集等常见的操作。但是感觉 SymPy 中的集合论操作主要集中在实数域或者复数域上。

对于闭区间 I=[0,1] 和开区间 J = (0,1) 而言,在 SymPy 中使用以下方法来表示:

I = sympy.Interval(0,1)
J = sympy.Interval.open(0,1)
K = sympy.Interval(0.5,2)

其开始和结束的点可以分别使用 start 和 end 来表示:

>>> I.start
0
>>> I.end
1

其长度用 measure 来表示:

>>> I.measure
1

其闭包用 closure 来表示:

>>> I.closure
Interval(0, 1)

其内点用 interior 来表示:

>>> I.interior
Interval.open(0, 1)

判断其边界条件可以使用 left_open 或者 right_open 来做:

>>> I.left_open
False
>>> I.right_open
False

对于两个集合之间的操作,可以参考以下方法:

I = sympy.Interval(0,1)
K = sympy.Interval(0.5,2)
>>> I.intersect(K)
Interval(0.500000000000000, 1)
>>> I.union(K)
Interval(0, 2)
>>> I-K
Interval.Ropen(0, 0.500000000000000)
>>> K-I
Interval.Lopen(1, 2)
>>> I.symmetric_difference(K)
Union(Interval.Ropen(0, 0.500000000000000), Interval.Lopen(1, 2))

实数集 \mathbb{R} 在 SymPy 中用 sympy.S.Reals 来表示,自然数使用 sympy.S.Naturals,非负整数用 sympy.S.Naturals0,整数用 sympy.S.Integers 来表示。补集的计算可以用减号,也可以使用 complement 函数。

>>> sympy.S.Reals
Reals
>>> sympy.S.Reals-I
Union(Interval.open(-oo, 0), Interval.open(1, oo))
>>> I.complement(sympy.S.Reals)
Union(Interval.open(-oo, 0), Interval.open(1, oo))
>>> sympy.S.Reals.complement(I)
EmptySet()
>>> I.complement(K)
Interval.Lopen(1, 2)
>>> I.complement(sympy.S.Reals)
Union(Interval.open(-oo, 0), Interval.open(1, oo))

 

SymPy 的逻辑工具

在逻辑运算中,我们可以使用 A, B, C 来代表元素。&, |, ~, >> 分别表示 AND,OR,NOT,imply。而逻辑运算同样可以使用 sympy.simplify_logic 简化。

A, B, C = sympy.symbols("A B C")
>>> sympy.simplify_logic(A | (A & B))
A
>>> sympy.simplify_logic((A>>B) & (B>>A))
(A & B) | (~A & ~B)
>>> A>>B
Implies(A, B)

 

SymPy 的级数工具

SymPy 的级数工具有一部分放在具体数学(Concrete Mathematics)章节了。有的时候,我们希望计算某个级数是发散的,还是收敛的,就可以使用 is_convergence 函数。考虑最常见的级数:

\sum_{n=1}^{\infty}\frac{1}{n} = +\infty

\sum_{n=1}^{\infty}\frac{1}{n^{2}} = \frac{\pi^{2}}{6}

>>> n = sympy.Symbol("n", integer=True)
>>> sympy.Sum(1/n, (n,1,sympy.oo)).is_convergent()
False
>>> sympy.Sum(1/n**2, (n,1,sympy.oo)).is_convergent()
True

如果想计算出收敛级数的值,加上 doit() 函数即可;如果想计算有效数字,加上 evalf() 函数即可。

>>> sympy.Sum(1/n**2, (n,1,sympy.oo)).evalf()
1.64493406684823
>>> sympy.Sum(1/n**2, (n,1,sympy.oo)).doit()
pi**2/6
>>> sympy.Sum(1/n**3, (n,1,sympy.oo)).evalf()
1.20205690315959
>>> sympy.Sum(1/n**3, (n,1,sympy.oo)).doit()
zeta(3)

除了加法之外,SymPy 也支持连乘,其符号是 sympy.Product,考虑

\prod_{n=1}^{+\infty}\frac{n}{n+1}

\prod_{n=1}^{+\infty}\cos\left(\frac{\pi}{n}\right)

>>> sympy.Product(n/(n+1), (n,1,sympy.oo)).is_convergent()
False
>>> sympy.Product(sympy.cos(sympy.pi/n), (n, 1, sympy.oo)).is_convergent()
True

 

SymPy 的 ODE 工具

在常微分方程(Ordinary Differential Equation)中,最常见的就是解方程,而解方程主要是靠 dsolve 函数。例如想求解以下的常微分方程:

df/dx + f(x) = 0,

d^{2}f/dx^{2} + f(x) = 0

d^{3}f/dx^{3} + f(x) = 0

可以使用 dsolve 函数:

>>> f = sympy.Function('f')
>>> sympy.dsolve(sympy.Derivative(f(x),x) + f(x), f(x))
Eq(f(x), C1*exp(-x))
>>> sympy.dsolve(sympy.Derivative(f(x),x,2) + f(x), f(x))
Eq(f(x), C1*sin(x) + C2*cos(x))
>>> sympy.dsolve(sympy.Derivative(f(x),x,3) + f(x), f(x))
Eq(f(x), C3*exp(-x) + (C1*sin(sqrt(3)*x/2) + C2*cos(sqrt(3)*x/2))*sqrt(exp(x)))

而常微分方程对于不同的方程类型也有着不同的解法,可以使用 classify_ode 来判断常微分方程的类型:

>>> sympy.classify_ode(sympy.Derivative(f(x),x) + f(x), f(x))
('separable', '1st_exact', '1st_linear', 'almost_linear', '1st_power_series', 'lie_group', 'nth_linear_constant_coeff_homogeneous', 'separable_Integral', '1st_exact_Integral', '1st_linear_Integral', 'almost_linear_Integral')
>>> sympy.classify_ode(sympy.Derivative(f(x),x,2) + f(x), f(x))
('nth_linear_constant_coeff_homogeneous', '2nd_power_series_ordinary')
>>> sympy.classify_ode(sympy.Derivative(f(x),x,3) + f(x), f(x))
('nth_linear_constant_coeff_homogeneous',)

 

SymPy 的 PDE 工具

在偏微分方程(Partitial Differential Equation)中,同样可以直接求解和判断偏微分方程的类型,分别使用函数 pdsolve() 和 classify_pde()。假设 f = f(x,y) 是一个二元函数,分别满足以下偏微分方程:

\partial f/\partial x + \partial f/\partial y =0

\partial f/\partial x + \partial f/\partial y + f = 0

\partial f/\partial x + \partial f/\partial y + f + 10 = 0

>>> f = sympy.Function("f")(x,y)
>>> sympy.pdsolve(sympy.Derivative(f,x)+sympy.Derivative(f,y),f)
Eq(f(x, y), F(x - y))
>>> sympy.pdsolve(f.diff(x)+f.diff(y)+f,f)
Eq(f(x, y), F(x - y)*exp(-x/2 - y/2))
>>> sympy.pdsolve(f.diff(x)+f.diff(y)+f+10,f)
Eq(f(x, y), F(x - y)*exp(-x/2 - y/2) - 10)

查看类型就用 classify_pde() 函数:

>>> sympy.classify_pde(f.diff(x)+f.diff(y)+f)
('1st_linear_constant_coeff_homogeneous',)
>>> sympy.classify_pde(f.diff(x)+f.diff(y)+f+10,f)
('1st_linear_constant_coeff', '1st_linear_constant_coeff_Integral')
>>> sympy.classify_pde(f.diff(x)+f.diff(y)+f+10,f)
('1st_linear_constant_coeff', '1st_linear_constant_coeff_Integral')

不过目前的 PDE 解法貌似只支持一阶偏导数,二阶或者以上的偏导数就不支持了。

 

SymPy 的数论工具

在数论中,素数就是一个最基本的概念之一。而素数的批量计算,比较快的方法就是筛法(sieve method)。在 sympy 中,同样有 sympy.sieve 这个工具,用于计算素数。如果想输出前100个素数,那么

>>> sympy.sieve._reset()
>>> sympy.sieve.extend_to_no(100)
>>> sympy.sieve._list
array('l', [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631])

如果想输出一个区间内的所有素数,可以使用 primerange(a,b) 函数:

>>> [i for i in sympy.sieve.primerange(10,100)]
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

search() 函数是为了计算某个数附近是第几个素数:

>>> sympy.sieve.search(10)
(4, 5)
>>> sympy.sieve.search(11)
(5, 5)

如果只想获得第 n 个素数,则使用函数 sympy.ntheory.generate.prime(n) 即可。如果是希望计算 x 后面的下一个素数,使用 sympy.ntheory.generate.nextprime(x) 即可。判断 x 是否是素数,可以使用 sympy.ntheory.generate.isprime(x)。

>>> sympy.ntheory.generate.prime(10)
29
>>> sympy.ntheory.generate.nextprime(10)
11
>>> sympy.ntheory.generate.nextprime(11)
13
>>> sympy.ntheory.generate.isprime(11)
True
>>> sympy.ntheory.generate.isprime(12)
False

除此之外,SymPy 的数论方法还有很多,需要读者根据 SymPy 的官方文档自行探索。

 

SymPy 的范畴论工具

SymPy 还支持范畴论(Category Theory)的一些计算方法,在这里简要地列举一下。

>>> A = sympy.categories.Object("A")
>>> B = sympy.categories.Object("B")
>>> f = sympy.categories.NamedMorphism(A,B,"f")
>>> f.domain
Object("A")
>>> f.codomain
Object("B")

由于范畴论是数学的“黑话”,因此其余方法留给范畴论的科研人员自行翻阅。

总结:

整体来看,SymPy 是一个非常卓越的 Python 开源符号计算库。在符号计算领域,不仅支持常见的微积分,线性代数,几何运算,还支持集合论,微分方程,数论等诸多数学方向。后续笔者将会持续跟进并研究这一卓越的开源工具库。

 

参考文献:

  1. Meurer A, Smith C P, Paprocki M, et al. SymPy: symbolic computing in Python[J]. PeerJ Computer Science, 2017, 3: e103.
  2. GitHub:https://github.com/sympy/sympy
  3. SymPy:https://www.sympy.org/en/index.html
  4. Sympy 维基百科:https://en.wikipedia.org/wiki/SymPy
  5. GreatX’s Blog:数值 Python:符号计算:https://vlight.me/2018/04/01/Numerical-Python-Symbolic-Computing/
  6. SymPy 符号计算-让Python帮我们推公式:https://zhuanlan.zhihu.com/p/83822118
  7. Python 科学计算利器—SymPy库:https://www.jianshu.com/p/339c91ae9f41