William Rowan Hamilton · 1805–1865

哈密顿

他刻在桥上的那行字,如今在每一台游戏机里转动

i2=j2=k2=ijk=1i^2 = j^2 = k^2 = ijk = -1
四元数 · 1843 年 10 月 16 日,他把这行字刻在了布鲁姆桥的石头上

威廉·罗恩·哈密顿生于都柏林,三岁被送到特里姆的叔父家——那位教区牧师兼语言学家按自己的办法把他养成了神童,据说他十来岁时已能对付十来种语言。转向数学的契机是 1818 年的一场比试:美国心算神童泽拉·科尔本来都柏林表演,十三岁的哈密顿上去跟他比,输了,回家开始读书。十七岁那年他读拉普拉斯的《天体力学》,挑出其中一处错误,被引荐到皇家天文学家布林克利面前;布林克利的评语是,这个年轻人不是将会成为、而是已经是这个时代的第一流数学家。1827 年,学位还没拿到,他就被聘为三一学院的安德鲁斯天文学教授与爱尔兰皇家天文学家,二十二岁搬进敦辛克天文台,此后一生住在那里。

他做成的第一件大事在光学:一束光线的全部行为,可以由一个函数导出。1832 年他从这套理论里推出一个谁也没见过的现象——某些晶体会把一束光折成一个圆锥;劳埃德当年底就在实验室里把它做了出来。随后他把同一套想法搬进力学:一个函数 H,两组一阶方程。十九世纪的人把这看作拉格朗日力学的改写,直到量子力学开张,薛定谔方程里那个算符就叫哈密顿量。而他自己认为最要紧的是另一件事:复数可以写成一对实数,加减乘除样样对得上,在平面上转动自如——那么三维空间呢?他找了十三年三元数的乘法,儿子们记得每天早餐都要问一句「爸爸,你会乘三元数了吗」。1843 年 10 月 16 日,他陪妻子沿皇家运河去皇家爱尔兰学会开会,走到布鲁姆桥时忽然想通:三个数不够,要四个;而且必须放弃 ab = ba。他掏出小刀,把 i² = j² = k² = ijk = −1 刻上桥石。此后二十二年他几乎只做四元数,直到去世。「向量」与「标量」这两个词,就是他在这些工作里造的。

哈密顿肖像
照片,1885 年印本 · 美国国会图书馆藏,Wikimedia Commons,公有领域

生平

  1. 1805
    生于都柏林

    三岁起随叔父在特里姆长大,先被当成语言神童养,十三岁与心算神童科尔本比试落败后转向数学。

  2. 1822
    在《天体力学》里挑出一处错误

    十七岁。皇家天文学家布林克利评语:这个年轻人不是将会成为、而是已经是这个时代的第一流数学家。

  3. 1827
    二十二岁当上爱尔兰皇家天文学家

    学位尚未拿到就受聘为安德鲁斯天文学教授,搬进敦辛克天文台,住到去世。

  4. 1832
    预言圆锥折射

    从他的光线系统理论推出:某些晶体会把一束光折成圆锥。劳埃德当年底做实验证实,他因此于 1835 年受封爵士。

  5. 1835
    《论动力学中的一般方法》

    一个函数 H 与两组一阶方程。七十年后,量子力学里那个算符沿用了他的名字。

  6. 1843
    布鲁姆桥:i² = j² = k² = ijk = −1

    十月十六日,寻找三元数乘法的第十三年。他放弃了交换律,用四个数解决了三维旋转。原刻痕早已不存,1958 年在桥上立了铭牌。

  7. 1857
    二十面体游戏

    十二面体的二十个顶点各标一座城市,求一条每城恰过一次的闭路。他把它卖给伦敦玩具商得二十五英镑,玩具没卖动——今天它叫哈密顿回路,是 NP 完全问题。

  8. 1865
    卒于敦辛克天文台

    六十岁。遗稿《四元数原理》次年由其子整理出版。

展品厅

绝大多数展品都可以亲手把玩——这是本馆的立馆之本;少数以叙述为主的,做成故事展签。

镇馆之宝 · 亲手玩

万向节死锁:三个角度不够用

把机头拉到 90°,三根转轴塌成两根。

detJ=cosθ\det J = \cos\theta

用偏航、俯仰、滚转三个角度描述姿态,是最直觉的办法,也是几乎每个引擎最初都会选的办法。代价藏在一个特定姿势里:机头朝正上方时,最外层的偏航轴与最内层的滚转轴指向同一个方向,三层万向环有两层重合,能表达的转动从三维塌成二维——飞机在那一瞬间丢掉一个自由度,操纵杆推下去要么没反应,要么猛地翻一下。这不是程序写错了,是这套表示法自身的洞:把三个角速度换算成真实角速度的那个矩阵,行列式恰好是 cos(俯仰角),在 ±90° 处归零。阿波罗飞船的惯性平台就只装了三个万向环(第四个太重,砍了),宇航员得盯着显示器上标出的禁区绕开它;迈克尔·柯林斯为此留下一句话:圣诞节送我第四个万向环吧。

拖动三个角度,看俯仰逼近 90° 时两个环如何重合、行列式如何归零

把俯仰拉到 ±90°,看最外层与最内层的环如何重合。同一个姿态换成四元数,只是一根轴加一个角——转到哪里都不会退化。

三个虚数单位,和一条被放弃的定律

ij = k,而 ji = −k——乘法第一次不再可交换。

ij=k,ji=kij = k,\quad ji = -k

复数能把平面上的旋转变成一次乘法,这件事太好用了,所以人人都想把它搬到三维:找两个新的虚数单位,凑一个三元数。哈密顿找了十三年,找不到——今天知道那是不可能的,三维实除代数不存在。他在桥上想通的是两处让步:维数要四个,而乘法必须放弃交换律。代价换来的是一整套干净的规则:三个虚数单位排成一个圈,顺着箭头乘得正号,逆着乘得负号。旋转的合成从此就是四元数的乘法,而乘法不可交换,恰恰对应着「先偏航再俯仰」与「先俯仰再偏航」本来就是两个不同的姿势。

左项
右项

ij = k,而 ji = −k——换个次序就换个符号。这正是三维旋转的脾气:先偏航再俯仰,和先俯仰再偏航,本来就是两个姿势。

slerp:球面上最短的那条弧

两个姿态之间怎么过渡?沿着球面走测地线。

slerp(t)=sin((1t)Ω)sinΩq0+sin(tΩ)sinΩq1\mathrm{slerp}(t) = \frac{\sin((1-t)\Omega)}{\sin\Omega}\,q_0 + \frac{\sin(t\Omega)}{\sin\Omega}\,q_1

镜头从一个角度摇到另一个角度、骨骼动画在两帧之间补间,要的都是「匀速、走最短路」。把两个四元数直接线性插值再归一化,方向是对的,快慢却不均——中段会明显拖慢。slerp 沿球面上的大圆走,转过的角度随 t 线性增长,看上去才是一次干净的转身。这里还有一个天天有人踩的坑:q 与 −q 表示同一个姿态(这是半角写法的代价),插值前若不检查两者的点积、必要时把其中一个取反,物体会绕远路转 350°,而不是就近转 10°——症状就是镜头偶尔猛地翻一整圈。

两条路径叠在同一条大圆上——lerp 的方向没错,错的是快慢:等间距的 t 取样在中段拉开、两头挤作一团,快慢比 1.56,而 slerp 恒为 1.00。

相空间:能量为什么会漏

同一个步长,显式欧拉让摆越荡越高,辛欧拉不会。

q˙=Hp,p˙=Hq\dot q = \frac{\partial H}{\partial p},\quad \dot p = -\frac{\partial H}{\partial q}

哈密顿把力学改写成相空间里的一条流线:位置与动量地位对等,一个函数 H 决定整条轨迹,而 H 沿轨迹不变。这个写法今天最实在的用处是数值积分。物理引擎每帧要把速度和位置各推一步,最朴素的显式欧拉推一步就漏一点能量,而且符号固定——弹簧自己越弹越高,轨道慢慢旋出去,画面上就是「模拟炸了」。把两行代码换个顺序,先更新速度、再用新速度更新位置,就得到辛欧拉:它的单步误差并不更小,却保住了相空间的面积,于是能量只在一个常数附近振荡,永远不漂走。这就是为什么几乎每个引擎的积分器都是辛欧拉或 Verlet,而不是课本上那个最自然的写法。

显式欧拉每一步都往外漏一点能量,摆越荡越高,相平面上的圈一路旋出去;辛欧拉只是把「先更新速度、 再用新速度更新位置」换了个次序,单步误差并不更小,却保住了相空间的面积——能量永远在初值附近振荡。 几乎每个物理引擎的积分器都是它或 Verlet。把步长拉大,两者的差别会更露骨。

二十面体游戏:走遍每个点

欧拉走遍每条边,哈密顿走遍每个点——难度差着一个世界。

1857 年哈密顿做了个木头玩具:十二面体的二十个顶点各标一座城市,要求沿棱走一圈,每座城市恰好经过一次,回到起点。他把它卖给伦敦的玩具商,得二十五英镑,玩具没卖动。一百多年后这个问题变得要紧起来:欧拉的七桥问题(走遍每条边)有一条一眼可查的判据——奇度顶点不超过两个;而哈密顿的问题(走遍每个点)至今没有任何这样的判据,它是 NP 完全的,稍加变形就成了旅行商问题。两道题看上去只差一个字,一道在 1736 年就被判了死刑,另一道到今天还在悬赏一百万美元。

已经过0 / 20十二面体:20 个点30 条棱,每点三度欧拉:走遍每条边一眼可判哈密顿:走遍每个点NP 完全

点任意一座城市出发,再沿棱一路点过去,每座城市只许经过一次,最后回到起点。欧拉的七桥要走遍每条边,这里要走遍每个点。

向量把四元数赶了出去,图形学又把它请了回来

一度被当作失败品的东西,一百四十年后成了标准件。

哈密顿的晚年全押在四元数上,他相信这是描述空间的正确语言。泰特接着推,麦克斯韦写《电磁通论》时用的也还是四元数记号。转折在 1880 年代:吉布斯与亥维赛把四元数的乘积拆成两半——点积与叉积,扔掉那个别扭的四元结构,只留下三维向量。工程师觉得好用得多,两派在《自然》上吵了十几年,向量赢了,四元数在教科书里的位置从此接近一件失败的历史遗物。它其实一直没死:航天器的姿态解算绕不开万向节死锁,制导系统里它低调地用着。真正把它推回台前的是 1985 年 SIGGRAPH 上的一篇文章,Ken Shoemake 写了怎么拿四元数做旋转动画的插值——slerp 这个名字就出自那里。今天你打开的每一个三维引擎,姿态都存成四个数。

故事展签故事展签:从 1880 年代的向量之争,到 1985 年 SIGGRAPH 上的那篇文章。

传承

他的工作没有留在十八世纪——每条链的终点,都是你今天正在使用的东西。

四元数三维旋转与 slerp 插值游戏引擎、动画与航天器的姿态控制
哈密顿量 H 与正则方程算符与本征值量子力学
相空间的辛结构辛积分器游戏物理引擎与长期轨道计算
三元数乘不出来放弃交换律非交换代数:环、除环与矩阵代数
二十面体游戏与哈密顿回路NP 完全问题路径规划与旅行商问题

语录

每天早餐,孩子们都会问:「爸爸,你会乘三元数了吗?」我只能摇摇头回答:「不会,我还是只会加和减。」

—— 1865 年 8 月 5 日致其子阿奇博尔德的信,回忆 1843 年之前的那些年

就在那里,我意识到:为了给三元组做计算,我们必须在某种意义上承认空间的第四个维度……电路仿佛接通,火花迸了出来。

—— 1843 年 10 月 17 日致格雷夫斯的信,事发次日