光是粒子又如何,光是波又如何?

之前我们讨论了能够在很大程度上说明光是粒子的实验:光电效应为什么能够证明光的粒子性。那当然,也有大量的实验佐证光是波——把光看作是介质上的振动,然后依赖介质上的Newton力学来理解光的行为。那么,为什么光不能就是这样的东西:在解释不同的实验的时候用不同的模型呢?这样有什么不可以呢?

首先,有其他实验可以很大程度上证明光的传播不需要介质。例如Michelson-Morley实验(请自行Wikipedia之)证明如果有介质并且这个介质的运动速度通过伽利略变换进入光的传播速度的话,那么,实验结果和理论结果不符合。再例如,有实验证明光是可以在真空中传播的:你想确认一下这个事实的话,只要看一下天空,看到太阳月亮星星就是这个证明——你想中间有多少什么都没有的路光要走啊。当然,你仍然可以怀疑说,这个看起来测量起来什么粒子都没有的“真空”其实不是真空,还是有某种介质的。于是,你就可以设计一个情景来让这个“介质”有自身的速度,这时候,再来测量光的行为,就回到了Michelson-Morley实验。因此,Michelson-Morley实验很大程度上说明:光的传播不需要介质,如果有介质则这个介质很神奇——其自身运动的速度不怎么影响光的传播。

既然没有介质,那么,把光看作介质上的振动,并且这个振动的传播符合Newton定律就不太行了,那怎么来建立光的心智模型?

接着,我们回顾一下那些启发了光的经典介质波的模型的实验。例如,光的折射和反射。声波、水波都会出现折射和反射,也就是一个振动传过来遇到了界面,界面上的介质会被这个传过来的振动激发,由于是不同的介质,这个受激发的振动可能会被传播到其他方向上去。如果是同一种介质,其实也会发生这个受激发振动的事情,只不过,那个时候,跑向各个方向的受激发振动刚好相互抵消。而当存在不同介质的界面的时候,某些方向上的振动会被加强而不是相互抵消。这个把介质上的多个粒子受激发振动看作新的波源然后做叠加的做法叫做惠更斯-菲涅耳原理(其本质还是波的Newton力学),或者去看看Feynman的《QED:光和物质的奇妙理论》。当然,其实,光的折射和反射也可以用直线传播的小球和半透膜的模型来解释:把光看作小球,每次遇到半透膜(开了很多小孔的筛子?)就有可能被弹回,也有可能透过。这个称作光的随机性粒子模型(有的时候也被称作几率波粒子模型)。

那我们再来看光的干涉和衍射。衍射现象是指,在光的传播路径上,有障碍物,可是,你仍然在障碍物的后续路径上观察到了光。如果光是直线传播的小球,就不太可能有这个现象了。而波的惠更斯-菲涅耳原理就可以解释这个现象,在此略过这个解释。光的干涉现象是指来自于两个振动源的光在同时能够达到的区域会出现暗条纹和明条纹。暗条纹的意思是,对于打开任何一个光源就能够照亮的区域,当同时打开两个光源的时候,反而不变暗。当然,这个时候,对光源有一定的要求。但是,这件事情用光的粒子模型是很不可理解的:你在玩植物大战僵尸的豌豆射手或者用机枪打仗,发现,有一个地方用一个豌豆射手或者一个机枪手都可以打到,但是,当你放上两个豌豆射手或者两个机枪手的时候,就打不到了。这是不可能的事情。如果是这样,就没有火力覆盖了。

那么,把光看作是介质上的振动是怎么来理解光的干涉的呢?说一个光源传过来的振动和另一个光源传过来的振动可能在振幅上不匹配,例如一个是振动最低点也就是波谷的时候,另一个正好传过来一个振动最高点也就是波峰,正好这两个振动的矢量叠加相互抵消,于是,没有照亮。这个解释非常漂亮。

那问题来了,到底我们应该把光看作是粒子还是满足Newton定律的介质上的振动波呢?我们能不能在讨论某些实验例如折射反射光电效应的时候,把光看做粒子(当然,这时候,我们也要问这个粒子是不是满足粒子的Newton定律。问题留在这里,以后再说),而在讨论折射反射衍射干涉的时候,把光看作是满足Newton定律的介质上的振动波呢?万一遇到新的现象怎么办,用什么方式来描述?或者每次都先试试用两个理论之一的结果和实验比较一下,对上了,对这个现象就用这个理论?

第一、科学的目标是希望对于给定的现象,我们的理论模型能够给出来一个结果的预期,然后和实验相比较。因此,每次来凑一凑试一试显然是不行的。如果能够对现象做一个完善的分类,遇到现象就知道用哪一个模型,倒是也可以接受。不过,这个分类,在光这个现象上,我没有见过。

第二,科学的原则有一条,希望用更少的并且相互不冲突的更具有一致性的理论来解释更多的现象。因此,用两条看起来相互冲突的理论来解释同一种东西的不同的现象是不够的,就算上面提到的完善的分类存在的话。而且,将来,我们会看到,有一个光的新的理论,它能够同时解释上面所有的现象。

顺便,我们怎么知道是同一种东西呢?只要我们做实验的时候产生光的机制是一样的,然后用来做以上两类实验就可以。另外,在这里,我特意扔掉了光的波的模型,而用更加复杂的“满足Newton定律的介质上的振动波”的模型。将来我们会知道新的模型还是一个光的波的模型,只不过不符合Newton定律,而且是振幅波,而不是几率波。后面为了语言的简单,我把这个“满足Newton定律的介质上的振动波”的模型简称为经典波模型。

那么,到底怎么办?什么样的模型可以即具有粒子性,也就是确实是一颗一颗打过来的,不会再一次把能量分离成为某个最小单位以下的,强度增加就意味着增加粒子数量的,这样的粒子,还具有波性,也就是可以发生干涉和衍射的这样的波?

再一次提醒注意这个干涉的不可思议性:如果我们用一颗一颗粒子来解释的话,就意味着有一个地方打开两个粒子源中的任意一个粒子源的时候粒子能够到达,但是同时打开粒子却不能达到。

更进一步,这个实验还可以这样做:保证在整个实验中每次仅有一个粒子,也就是一份能量,在整个实验环境中。具体的做法大概来说是这样,制备一个单光子光源,在这个光子的光路上放上分光的仪器使得这个光子可能走两条路中的一条——例如放置一个双缝或者一个偏振分束器。

这样来做,这个实验结果就更加不可思议了:空间中每次只有一个粒子,如果说不能到达某个一条路就能到达的点,也就是说,好像这两条路上的光子影响了彼此,可是,真的仅仅有一个光子啊,自己和自己是怎么影响怎么抵消的呢?回到波的模型,可以把波看作是振动分成几个部分传播到不同的路径上,将来再一次合起来,自然就可以相互抵消。可是,光子不能再一次分成更小的能量单位啊!

注意,把光看作几率波的模型也不能解释这个单光子干涉现象:要么走路径1,能够到达;要么走路径2,还是能够到达,则合起来就是能够到达,绝对不会出现不能到达的情况,除非路径1和路径2的“几率”是一个矢量,能够想振动幅度一样被加起来。

这里最大的矛盾,或者说将来的出路,就在于:一方面,光子不能分成更小的单位,不能同时走很多条路径,因此不能把不同路径上的“振动幅度”像经典波一样叠加起来;另一方面,在数学上,经典波的把来自于不同路径上的同时传播过来的波相互叠加起来,确实能够描述实验现象。

怎么办?难道我们需要一个在数学上满足“波的叠加”的但是在物理上是一个个不可再分的小球的模型来理解光子的行为?一个个的小球怎么会具有波呢?除了看作概率,就像前面的半透膜,可是概率解释不了干涉,还可以看作波,怎么可能呢?

实际上,光的心智模型正是这样的满足“波的叠加”的小球。有更多的实验会提出来挑战很大程度上说明,只有这样的模型,才能够解释这些实验现象。例如,这几个实验:
能看到光是多么神奇的事情啊
光过玻璃是一件多么神奇的事情啊
光过三个偏振片和男人女人过三道门的对比

Feynman说过,只要你能够明白双缝干涉,那么,你就明白了量子力学,并且如果你没有被量子力学苦恼过,那么,你就是不明白量子力学,更有你只要宣称明白了量子力学,那么,你就没有明白。

学习量子力学主要就是为了搞清楚为什么这个理论是这个样子的,理解上的主要困难在哪里,而不是仅仅学会怎么算。就像Feynman在《QED:光和物质的奇妙理论》,《Feynman物理学第三卷》以及吴金闪的《二态系统的量子力学》里面所强调的一样。怎么算,不好意思,你需要至少学习一个理论物理专业的硕士,甚至博士。

具体现象的知识固然有意义,但是,本文最大的目的是跟你一起从具体的科学现象的思考中体会什么是科学,体会量子力学的神奇和困难之处。

吴金闪简介

最近受读书人“逼迫”要给我自己做一个比较完整的介绍。尽管十分不愿意,不过,整理一下也好,索性就把整理的东西也发在这里得了。

这是我经常用的一个文字版简介:吴金闪,毕业于The University of British Columbia‎和北京师范大学,任职于北京师范大学系统科学学院。研究工作涉及量子输运(非平衡统计)、量子力学基本问题、量子博弈、博弈论、投入产出分析、科学学、理解型学习,系统科学。一直在实践融合学科边界的研究和教学。

下面是一个以上信息的图形的版本。

其中,我还加入了我的邮件签名档:
Live to make a difference(活着就是为了搞出点不一样)
Be ambitious, be determined (有野望,持之如初)
World spins on dreamers like you(世界因你的梦想而转)
See through connections(洞澈联系)
Teach Less, Learn More (教的更少,学得更多)
Learning for understanding the world and ourselves(为了理解世界和自己而教和学)
Don’t tell me facts, let me think; Don’t teach me knowledge, let me learn (不要告诉我事实,让我想想;不要教给我知识,让我学习)

以及我认为自己的优势或者说立足之本,除了一些知识,更加重要的是:我喜欢并且善于去用来自于科学的方式(尊重测量、用数学来构建模型和表达思考、尽可能少的假设和模型来解释尽可能多的现象,不断地追问为什么也就是批判性思维,并且在合适的地方切分)问新的问题或者给问题提出来新的分析方法,而且在这之中,最重要的就是通过仔细思考这个问题内部因素之间的关系,来找到具有类似的关系的其它问题并解借鉴这样的问题的分析方法。这也就是系联性思考。这,再加上运用系联性思考来达到看到树木更看到森林,就是系统科学的典型思维方式。

大部分这些思维方式,都是来自于物理学的训练。因此,顺便,推荐所有对科学,不管是自然的科学还是社会的科学,感兴趣的学习者,无论如何,都学点物理学,而且,要从学习物理知识中学会体会物理学的大图景:典型对象、典型问题、典型思维方式、典型分析方法、和世界以及其他学科的关系。

如果你想了解我更多,有网站的渠道:“吴金闪的工作和思考”、“Big Physics研究小组”、“汉字结构网”、“吴金闪在北京师范大学的主页”,有书:《教的更少,学得更多》、《量子力学》、《系统科学导引》、《小学数学这样学》(正在出版中),有微信公众号“为了理解而教和学”,有视频课程《系统科学导引——概论》《量子力学无基础入门》《概念地图与理解型学习》,还有读书人讲书的视频:“为增加对世界的理解而读书”、“网络科学”、“链接”、“爆发”、“二态系统的量子力学”、“系统科学导引”、“物理定律的本性”、“QED:光和物质的奇妙理论”、“物理学的进化”;有研究论文,见“吴金闪在北京师范大学的主页”。

获取sci-hub数据

sci-hub是学术论文检索网站,提供了从文章doi等信息找到文章下载地址(这些地址又被libgen网站收集和保存)的信息。当然,这些文章基本上是有版权的。因此,实际上sci-hub和libgen是法律的边缘:没有直接保存原文(有的文件可能有原文,不清楚),但是提供了原文下载地址的集合。不过,我真的很喜欢这个网站的理念:知识应该属于全人类,应该尽量方便大家的获取。当然,也应该给写作、制作和出版这些知识的载体——也就是文章和书——的人一些利益。所以,我自己的文章和书的处理方式是在网上免费提供没有经过出版社处理的全文,但是经过出版社处理的文档,我不管。

最近纯粹出于好奇和学术研究兴趣,想看看sci-hub和libgen这个网站在促进学术交流上的效果,还想顺便用来匹配一下一堆我们自己有的文章的doi,就去找了找下载获取sci-hub和libgen数据的方法

首先,这个数据分成三个部分:第一、保存下载地址的文件,通常是torrent文件。第二、保存文章题录数据(metadata)的文件,通常是MySQL database dump文件。第三、提供这个网站的服务的源程序。第三部分仅仅在制作镜像的时候需要使用,就不需要下载了。这三部分文件都可以直接从libgen的主页上获取。

其次,获取了文件之后,需要从torrent文件的信息里面来下载和存储相应的文件。

接着,需要把题录数据和下载的文章对应整合起来。

最后,内部使用,也可以把libgen的服务系统建起来,或者自己做一个检索系统。

ProjectQ和IBMQ量子计算机

IBMQ提供了使用量子计算机的接口,ProjectQ用Python语言提供了一套量子计算描述语言,能够用于包含IBMQ真实量子计算机以及量子的经典模拟(通过算符运算)在内的多个后台。

由于教学(让学生做习题并且能够在实际量子计算机上验证)和研究(考虑量子博弈的真人实验)的需要,需要用量子计算机。就学习了一下。发现,非常简单易用,也很有系统性。

首先,在量子计算中,最基本的量子单位是自旋。于是,自旋的状态(二维Hilbert空间矢量)和算符(二维Hilbert空间矢量上的算符,例如Pauli矩阵、Hadamard门、围绕Z轴的旋转、测量等),就是这个ProjectQ的基本单元。当然,一些常用的高级功能例如CNOT门,以及Hadamard门和CNOT合起来的作用——称作纠缠算符等,也在ProjectQ中做了实现。

具体的文档见ProjectQIBMQ上的说明。下面用一个例子来说明一下整体结构,这样以后再一次学习起来简单。

这是我试着编写的程序quantum.py:

  1. 导入后台(模拟器、IBMQ、tex)和算符(H、测量、CNOT)

  2. from projectq import MainEngine
    from projectq.ops import H, Measure, CNOT
    from projectq.backends import CircuitDrawer
    import projectq.setups.ibm
    from projectq.backends import IBMBackend

  3. 这部分接收程序运行参数,在这里就是决定用什么后台。

  4. import sys, getopt

    def main(argv):
    s=1 #indicator of running this program via simulator or not
    tex=0 #indicator of converting this program into tex or not
    IBMQ=0 #indicator of running this program via IBMQ or not
    #take parameters from command-line input
    try:
    opts, args = getopt.getopt(argv, "s:", ["tex=", "IBMQ="])
    except getopt.GetoptError:
    print ("Error: please use the command as quantum.py -s --tex --IBMQ ")
    sys.exit(2)
    for opt, arg in opts:
    if opt == "-h":
    print("quantum.py -r --tex --IBMQ ")
    sys.exit()
    elif opt =="-s":
    s = int(arg) #when s=1, we need to run this program via simulator
    elif opt == "--IBMQ":
    IBMQ = int(arg) # when tex=1, we need to convert this program into a tex file
    s = 0 #when tex=1, we set s=0 (not to run this program in force)
    elif opt == "--tex":
    tex = int(arg) # when tex=1, we need to convert this program into a tex file
    s = 0 #when tex=1, we set s=0 (not to run this program in force)
    IBMQ = 0 #when tex=1, we set IBMQ=0 (not to run this program in force)
    #parameter input ends here

  5. 按照运行参数,开辟一个针对相应后台的环境。在这个环境之上,所有的命令不再需要关心后台的问题。

  6. # create a main compiler engine
    if(tex):
    drawing_engine = CircuitDrawer()
    eng = MainEngine(drawing_engine)
    elif(s):
    eng = MainEngine()
    elif(IBMQ):
    eng = MainEngine(IBMBackend(use_hardware=True, num_runs=1024, verbose=False, device='ibmqx4'))
    # allocate 2 qubit

  7. 在环境里面初始化qubit,并且把需要的算符一个个作用到这些个qubit上。

  8. qunum = eng.allocate_qureg(2)

    # put qubit 1 in superposition
    H | qunum[0]
    # put the two qubit in engtanglement
    CNOT | (qunum[0],qunum[1])
    # measure
    Measure | (qunum[0],qunum[1])

  9. 运行这些初始化状态和算符。

  10. eng.flush()

  11. 输出结果。

  12. if(tex):
    print(drawing_engine.get_latex())
    if(s):
    print("q1={}".format(int(qunum[0])))
    print("q2={}".format(int(qunum[1])))
    if(IBMQ):
    # access the probabilities via the back-end:
    results = eng.backend.get_probabilities(qunum)
    for state in results:
    print("Measured {} with p = {}.".format(state, results[state]))
    # return one (random) measurement outcome.
    return [int(q) for q in qunum]

最后运行python quantum.py就可以在不同的后台运行了。如果需要在IBMQ上运行,需要IBMQ的帐号和密码。

数学和科学、生活

今天这个例子就发生在上一个帖子的作者——一个差不多懂了系联性思考的硕士学生身上。同样非常有借鉴意义。我整理出来,分享在这里。

我用doodle设立了一个投票来确定这个学期的研究小组讨论时间。需要每一个参与讨论的人来参加这个投票,提供对自己来说可以实现的时间,然后,doodle就会做好一张网页表格,把每一个选项放在列上,每一个参与者的选择放在行上。我这个创建投票的人只需要看这张表就可以确定一个对所有人或者大多数人都能够用的时间了。

然后,这个学生选了三个选项。我就很好奇。问:为什么这样选啊?具体选择什么当然我也关心,不过我更好奇为什么这样选,真的只有这三个时间是可行的对这个学生来说?经过一番努力的沟通,发现,这个学生是这样来理解这个投票的。所谓投票就是在一堆选项中选自己最喜欢的,然后,最后,统计每一个选项有多少人喜欢,创建人选择得票最多的就行了。

确实,一般的称为“投票”的东西确实如此。

然后,学生意识到,可能我这么问,则表示这个背后的确定最后的选项的过程可能并不是这样。就说,我觉得可能这个doodle的程序不是这样运作的,得去想想这个程序如何运作。

另两个学生这时候提示,确定讨论时间的运算,实际上是在做集合的交集:把每一个参与者的集合拿过来,计算所有人的交集。

于是,首先,这个程序背后的算法不用去猜的,那就是计算交集,而且这个计算的人,就是我,doodle仅仅提供这张大表而已。

其次,更加根本的问题是,数学描述、数学计算过程或者软件系统背后的算法,都是为了解决某个具体问题的。我们只需要从问题开始思考,而不是从计算过程、软件算法开始思考。如果这个算法或者过程不能解决这个问题,那么,是算法和过程错了,而不是问题错了。

在具体这个问题上,就是你只需要思考确定一群人讨论的时间是什么样一个问题就可以了:由于首先的要求是要找到满足绝大多数人的选项,而不是选择所有人合起来最喜欢的选项,集合的并是最好的数学描述,而不是数票数。当然,如果每一个参与者把自己的喜好完全地揭示出来,则数票数和求集合的并是等价的。但是,一旦参与者用数票数的思路来提供信息——也就是仅仅选择自己最喜欢的选项而不是所有可能的选项(当然,将来还可以做更复杂的赋权),则两者就不等价了。结果上,很有可能这个参与者的最喜欢的选项被完全忽视。

因此,除了没有从问题开始思考,从情景开始思考,而是去猜背后可能的计算过程或者算法,还有另一个层面的问题:套路。当一个学生面对一个叫做“投票”的问题的时候,很可能就会直接套用投票的思路,而不去思考实际问题和情景。套路,真的要不得啊。面对任何具体问题,都要去思考,这个问题中有哪些因素,这些因素决定了我们必须用什么样的计算或者分析,而不是生搬硬套。

后来,我发现,这样来做会议时间投票的人还不少。看来,看不到“数学就是对问题和思考的表达,对问题里面的关系的描述”的人,还是真不少啊。可能大多数人的思考方式,真的是套路——先看看有没有一个自己知道如何应对的相似的,尽管可能仅仅是名以上、名字上相似,而不是关系上相似,问题,然后把这个问题里面的应对方式直接照搬过来。

顺便,关于这个问题,我们正在设计一个实验研究:一个情景A,一个情景B,两者具有一定相似性,但是,如果真的想明白则两者不一样,而且,我们保证实验参与者真的两者都是之前就了解的,甚至教过的学过的,然后我们来让实验参与者做决策。在这里,我们想探讨两个问题,知道(学过的能通过考试的)到能用(能够面对实际情景)的距离,以及基于套路而不是基于理性思考的决策的普遍性。将来我来报高这个研究结果。

用这个例子,来体现什么是数学,以及数学和科学、生活的关系。