5.10 李级数

泰勒定理提供了一种方法,用于在一个值已知的点附近逼近一个足够好的函数的值。如果我们在 t 处知道 f 及其所有导数,那么对于足够小的 ,我们可以得到 f(t + ) 的值,如下所示:

我们回顾一下指数函数的幂级数是

这表明我们可以将泰勒级数算子形式化地构造为微分算子的指数34

并写为

这里我们需要稍加注意:( D)2 = D D。我们之所以能将其转化为 2 D2,只是由于 是一个标量常数,它与每一个微分算子都对易。但谨记这一注意事项,我们可以定义微分算子

在继续之前,用这些概念进行一些计算是很有趣的。在接下来的代码记录中,我们通过取指数来展开级数。我们可以通过观察级数(无限)项序列中的连续元素来增量地检查该级数。过程 series:for-each 是一个增量遍历器,它将它的第一个参数应用于作为第二个参数给出的级数的连续元素。第三个参数(如果给出)指定要遍历的项数。在下面的每个记录中,我们打印了连续项的简化表达式。

首先要看的是一个未知文字函数在 t 附近、以 为增量的通项泰勒展开。理解这个简单问题中我们看到的现象,将有助于我们稍后理解更复杂的问题。

(series:for-each print-expression
 (((exp (* 'epsilon D))
   (literal-function 'f))
  't)
 6)

(f t)
(* ((D f) t) epsilon)
(* 1/2 (((expt D 2) f) t) (expt epsilon 2))
(* 1/6 (((expt D 3) f) t) (expt epsilon 3))
(* 1/24 (((expt D 4) f) t) (expt epsilon 4))
(* 1/120 (((expt D 5) f) t) (expt epsilon 5))
...

我们还可以查看我们熟悉的一些特定函数的展开,例如 sin 在 0 附近的展开。

(series:for-each print-expression
   (((exp (* 'epsilon D)) sin) 0)
   6)

0
epsilon
0
(* -1/6 (expt epsilon 3))
0
(* 1/120 (expt epsilon 5))
...

展开我们通常不记得的函数常常具有启发意义,例如 f(x) = (1 + x)1/2。

(series:for-each print-expression
 (((exp (* 'epsilon D))
   (lambda (x) (sqrt (+ x 1))))
  0)
 6)

1
(* 1/2 epsilon)
(* -1/8 (expt epsilon 2))
(* 1/16 (expt epsilon 3))
(* -5/128 (expt epsilon 4))
(* 7/256 (expt epsilon 5))
...

练习 5.27. 二项式级数

将 (1 + x)n 的二项式展开展开为泰勒展开。当然,当 n 为正整数时,除了前 n + 1 项外,所有系数都应为零。然而,在一般情况下,对于符号 n,系数是 n 的相当复杂的多项式。例如,你会发现第七项是

(+ (* 1/5040 (expt n 7))
   (* -1/240 (expt n 6))
   (* 5/144 (expt n 5))
   (* -7/48 (expt n 4))
   (* 29/90 (expt n 3))
   (* -7/20 (expt n 2))
   (* 1/7 n))

这些项必须等于杨辉三角中的条目。特别地,当 n<7 时,这个多项式必须为零。这是如何实现的?

动力学

现在,为了将这一方法应用于动力学函数,我们需要提供一个可以取指数的类导数算子,它将给出时间推进算子。关键思想是用泊松括号来写出函数的导数。方程 (3.79) 展示了如何一般性地做到这一点:

我们定义算子 DH

因此

并且该算子的迭代可用于计算高阶导数:

我们可以将路径函数 f = F o 在时间间隔 内相对于 H 的推进表示为微分算子 DH 的幂级数——该算子作用于相空间函数 F,然后再与路径复合:

确实,当该级数收敛时,我们可以用它来实现时间推进算子。

练习 5.28. 迭代导数 证明方程 (5.452) 是正确的。

练习 5.29. 拉格朗日类比 将 DH 与总时间导数算子进行比较。回顾一下

将经过状态空间的路径函数的导数抽象为路径导数的函数。定义另一个导数算子 DL,类似于 DH,它可以给出沿着给定拉格朗日量的拉格朗日方程解——即拉格朗日状态路径——上的函数的时间导数。这可能会有什么用处?

对于与时间无关的哈密顿量 H 和与时间无关的状态函数 F,我们可以简化 F 推进的计算。在这种情况下,我们定义李导数算子 LH 使得

这读作

并且对于与时间无关的 F

我们可以迭代这一过程来计算高阶导数。因此

并且在轨迹上求值时,FH 的逐次高阶泊松括号给出逐次高阶导数。

f = F o 。我们有

因此,我们可以将路径函数 f 在时间间隔 内相对于 H 的推进重写为李导数算子的幂级数——该算子作用于相空间函数 F,然后再与路径复合:

当级数收敛时,我们可以用李级数 e LH F 来实现时间推进算子 E',H

我们已经证明时间演化是正则的,因此上述级数是正则变换在时间上的幂级数形式表示。即使由哈密顿量 H 支配的演化是良定义的,这些级数也可能不收敛。

计算李级数

我们可以使用李变换作为计算工具来研究动力系统的局部演化。我们将 F 的李导数定义为相对于给定哈密顿函数 H 的类导数算子:36

(define ((Lie-derivative H) F)
  (Poisson-bracket F H))

我们还定义了一个实现李变换的过程:37

(define (Lie-transform H t)
  (exp (* t (Lie-derivative H))))

让我们首先检查质量为 m、弹簧常数为 k 的简谐振子位置的李级数的开头几项。我们可以将哈密顿量实现为

(define ((H-harmonic m k) state)
  (+ (/ (square (momentum state)) (* 2 m))
     (* 1/2 k (square (coordinate state)))))

我们通过向 Lie-transform 算子传递一个适当的哈密顿函数和一个演化时间间隔来生成李变换(级数)。然后,将 coordinate 过程(从相空间状态中选择位置坐标)应用于所得算子。李变换算子返回一个过程,当给定一个由虚拟时间、位置 x0 和动量 p0 组成的相空间状态时,该过程返回将该状态推进时间间隔 dt 后的位置。

(series:for-each print-expression
 (((Lie-transform (H-harmonic 'm 'k) 'dt)
   coordinate)
  (up 0 'x0 'p0))
 6)

x0
(/ (* dt p0) m)
(/ (* -1/2 (expt dt 2) k x0) m)
(/ (* -1/6 (expt dt 3) k p0) (expt m 2))
(/ (* 1/24 (expt dt 4) (expt k 2) x0) (expt m 2))
(/ (* 1/120 (expt dt 5) (expt k 2) p0) (expt m 3))
...

我们应该能认出这个级数的各项。我们从初始位置 x0 开始。一阶修正 (p0/m) dt 来自初始速度。接下来我们发现一个加速度项 ( - k x0/2m) dt2,它来自弹簧在初始位置处的回复力。

李变换同样适用于向我们展示动量如何随时间间隔演化:

(series:for-each print-expression
 (((Lie-transform (H-harmonic 'm 'k) 'dt)
   momentum)
  (up 0 'x0 'p0))
 6)

p0
(* -1 dt k x0)
(/ (* -1/2 (expt dt 2) k p0) m)
(/ (* 1/6 (expt dt 3) (expt k 2) x0) m)
(/ (* 1/24 (expt dt 4) (expt k 2) p0) (expt m 2))
(/ (* -1/120 (expt dt 5) (expt k 3) x0) (expt m 2))
...

在这个级数中,我们看到初始动量 p0 是如何被回复力 - k x0 dt 等效应所修正的。

更有趣的是观察李级数展开如何处理更复杂的相空间函数。在下面的实验中,我们考察了通过由同一个谐振子哈密顿量生成的变换来推进谐振子哈密顿量所得到的李级数:

(series:for-each print-expression
 (((Lie-transform (H-harmonic 'm 'k) 'dt)
   (H-harmonic 'm 'k))
  (up 0 'x0 'p0))
 6)

(/ (+ (* 1/2 k m (expt x0 2)) (* 1/2 (expt p0 2))) m)
0
0
0
0
0
...

正如我们所期望的那样,该级数以原始能量表达式 (k/2)x02 + (1/2m)p02 作为第一项。后续的每一个修正项都为零——因为能量是守恒的。

当然,李级数可以用于更复杂的情况,在这些情况下,我们希望看到由更复杂的哈密顿量描述的系统的运动展开。粒子在一般中心力场中的平面运动(见方程 3.99)是一个简单问题,李级数对其具有启发意义。在下面的记录中,我们可以看到级数变得多么复杂。值得尝试解释下面所示的第三(加速度)项的各加性部分:

(series:for-each print-expression
 (((Lie-transform
    (H-central-polar 'm (literal-function 'U))
    'dt)
   coordinate)
  (up 0
      (up 'r_0 'phi_0)
      (down 'p_r_0 'p_phi_0)))
 4)
(up r_0 phi_0)
(up (/ (* dt p_r_0) m)
    (/ (* dt p_phi_0) (* m (expt r_0 2))))
(up
 (+ (/ (* -1/2 ((D U) r_0) (expt dt 2)) m)
    (/ (* 1/2 (expt dt 2) (expt p_phi_0 2))
       (* (expt m 2) (expt r_0 3))))
 (/ (* -1 (expt dt 2) p_phi_0 p_r_0)
    (* (expt m 2) (expt r_0 3))))
(up
 (+ (/ (* -1/6 (((expt D 2) U) r_0) (expt dt 3) p_r_0)
       (expt m 2))
    (/ (* -1/2 (expt dt 3) (expt p_phi_0 2) p_r_0)
       (* (expt m 3) (expt r_0 4))))
 (+ (/ (* 1/3 ((D U) r_0) (expt dt 3) p_phi_0)
       (* (expt m 2) (expt r_0 3)))
    (/ (* -1/3 (expt dt 3) (expt p_phi_0 3))
       (* (expt m 3) (expt r_0 6)))
    (/ (* (expt dt 3) p_phi_0 (expt p_r_0 2))
       (* (expt m 3) (expt r_0 4)))))
...

当然,如果我们知道闭合形式的李变换,利用它是很好的;但当我们不知道闭合形式时,它的李级数表示就会派上用场。


34 我们在这里对微分算子的处理有些随意。在形式化的处理中,必须证明这些操作在数学上是良定义的,并具有适当的收敛性质。

35 我们的 LH 是微分几何中所谓的李导数的一个特例。更一般的概念是,向量场定义了一个流。一个对象关于一个向量场的李导数给出了该对象随流拖曳时的变化率。在我们的情形中,流是由哈密顿方程生成的演化,其哈密顿量为 H

36 实际上,我们对李导数的定义略有不同,如下所示:

(define ((Lie-derivative-procedure H) F)
  (Poisson-bracket F H))
(define Lie-derivative
  (make-operator Lie-derivative-procedure 'Lie-derivative))

原因是我们希望 Lie-derivative 成为一个 operator,它类似于函数,只是算子的乘积被解释为复合,而函数的乘积是计算其值乘积的函数。

37 这里的 Lie-transform 过程也被定义为一个算子,就像 Lie-derivative 一样。