4.6 不变曲线
我们从可积系统开始,其中存在不变曲线。如果加入扰动,是否有任何不变曲线能够存留下来?
扭转映射的庞加莱-伯克霍夫构造表明,具有有理旋转数的不变曲线通常无法在扰动下存留。受到扰动后,具有有理旋转数的不变曲线被交替的稳定和不稳定周期轨道序列所取代。因此,如果有任何不变曲线能在扰动下存留,它们必须具有无理旋转数。
受扰系统对每个有理旋转数都有一串交替的稳定和不稳定不动点。每个稳定不动点被一个岛包围,该岛占据了截面的某个区域。每个无理数都任意接近某个有理数,因此任何不变曲线能否在任意小的扰动下存留,这并不显然。
尽管如此,科尔莫戈罗夫-阿诺德-莫泽(KAM)定理证明了,如果扰动足够小,使得受扰问题“足够接近”可积问题,并且旋转数“足够无理”,则不变曲线确实存在。我们不在此证明该定理。相反,我们将发展寻找特定不变曲线的方法。
稳定的周期轨道在截面上有围绕它们的稳定岛。最大的岛与分母较小的有理数相关联。一般来说,岛的大小受到限制,其尺寸随着分母的增大而减小。这些岛是扰动效应的局部指示。类似地,混沌带出现在不稳定周期轨道及其同宿缠结附近。同宿缠结是一条连续曲线,因此它不能穿越同为连续曲线的不变曲线。如果我们要寻找在扰动下持续存在的不变曲线,明智的做法是避开那些岛或同宿缠结是主要特征的相空间区域。
庞加莱-伯克霍夫岛按旋转数排序。由于扭转条件,旋转数在未受扰问题的动量中是单调的。如果存在具有给定旋转数的不变曲线,它被夹在与有理旋转数相关的岛链之间。不变曲线的旋转数必须介于其两侧岛链的旋转数之间。
岛的大小随分母大小而减小这一事实表明,旋转数附近的有理数需要大分母的不变曲线最有可能存在。因此,我们将从检查那些不接近小分母有理数的旋转数开始寻找不变曲线。
任何无理数都可以用一系列有理数来逼近,对于这些有理数中的每一个,我们预期存在具有稳定岛和同宿缠结的稳定与不稳定周期轨道。对于给定旋转数的不变曲线,如果与每个有理逼近相关联的岛的大小小于该岛与具有该旋转数的不变曲线之间的距离,那么该不变曲线存留的机会最大。
对于任何特定大小的分母,无理数的最佳有理逼近由简单连分数的初始段给出。如果逼近的连分数向无理数收敛得很慢,那么该数就不接近小分母的有理数。因此,我们将寻找具有缓慢收敛连分数逼近的旋转数的不变曲线。收敛最慢的连分数其尾部全为 1。这样的数称为黄金数。例如,黄金比例
正是这样的数。
4.6.1 寻找不变曲线
不变曲线(如果存在的话)由特定的旋转数表征。不变曲线上的点被映射到不变曲线上的点。相邻的点映射到相邻的点,保持顺序。
在未受扰可积系统的截面上,连续截面点之间的角度是恒定的:对于旋转数
(J),有
= 2
(J)。这种将圆映射到自身、角步长恒定的映射,我们称为均匀圆映射。
对于给定的旋转数,截面上的点以仅由该旋转数决定的特定顺序排列。当扰动开启时,具有特定旋转数的不变曲线会发生扭曲,连续点之间的角度不再恒定。要具有特定的旋转数,只需角度的平均变化为
即可。然而,截面上点的顺序保持不变,并且是旋转数的特征。
对于具有给定旋转数的不变曲线,截面上的点序列必须具有特定的顺序。我们可以利用这一事实来寻找不变曲线。在指定的角度处,我们对位于不变曲线上的动量执行二分搜索。通过用受扰映射和均匀圆映射同时演化候选初始点,并比较生成的点序列的排序,我们可以判断初始点是否位于期望的不变曲线上,或者位于不变曲线的哪一侧。
实现此方案的程序为14
(define (find-invariant-curve the-map rn theta0 Jmin Jmax eps)
(bisect (lambda (J) (which-way? rn theta0 J the-map))
Jmin Jmax eps))
然而,我们需要能够确定如何改变初始动量以接近所需的旋转数。
我们可以演化两个映射的轨道,生成出现在截面上的点流。(均匀圆映射的动量值是多余的。)每个轨道流被转换为一个正整数流。这些整数表示流中已经被确定为具有比当前点更小的角度值的点的数量。然后比较这些整数流,直到发现不一致。第一个不一致用于比较两个轨道的旋转数,以确定哪个轨道具有更小的旋转数:
(define (which-way? rn theta0 J0 the-map)
(compare-streams
(position-stream theta0
(orbit-stream the-map theta0 J0)
'())
(position-stream theta0
(orbit-stream (uniform-circle-map rn)
theta0 J0)
'())
0))
映射通过一个简单的递归过程被演化并构建成一个流。映射的表示方式与第 3.6.2 节相同:
(define (orbit-stream the-map x y)
(cons-stream (list x y)
(the-map x y
(lambda (nx ny)
(orbit-stream the-map nx ny))
(lambda () 'fail))))
uniform-circle-map 是一个简单的映射,它具有均匀递增的角度和恒定的动量:
(define (uniform-circle-map rotation-number)
(let ((delta-theta (* :2pi rotation-number)))
(lambda (theta y result fail)
(result ((principal-value :2pi) (+ theta delta-theta))
y))))
过程 position-stream 产生一个索引位置流。它维护一个角度值的有序列表,每当将一个新角度添加到列表中时,它将位置索引添加到流中。对角度应用主值以将其归一到指定的统一范围:
(define (position-stream cut orbit list)
(insert! ((principal-value cut) (car (head orbit)))
list
(lambda (nlist position)
(cons-stream
position
(position-stream cut (tail orbit) nlist)))))
对于要插入到有序集 set 中的新元素 x,过程 insert! 调用其 continuation,传入更新后的集和用于插入新元素的索引。15
索引流用 compare-streams 进行比较:
(define (compare-streams s1 s2 count)
(if (= (head s1) (head s2))
(compare-streams (tail s1) (tail s2) (+ count 1))
((principal-range count) (- (head s2) (head s1)))))
count 用于跟踪我们已经向圆中录入的点数。当索引出现不一致时,意味着一个流开始领先于另一个流。principal-range 过程用于确定哪个是领先者。16 这类似于使用主值来确定圆上一个角度到另一个角度的方向。
一旦我们创建了这个复杂的程序,就可以用其来寻找具有给定旋转数的不变曲线的初始动量(对于给定的初始角度)。我们在标准映射中搜索具有黄金旋转数的不变曲线:17
(find-invariant-curve (standard-map 0.95)
(- 1 (/ 1 golden-ratio))
0.0
2.0
2.2
1e-5)
;Value: 2.114462280273437
这个算法虽然正确,但性能极差。问题在于每个轨道都会构建一个长度等于所检查点数的表,而每次插入新点时都会顺序扫描该表,从而使得处理时间随所检查点数的平方增长,空间也随所检查点数增长。
然而,我们观察到,当发现排序不一致时,角度通常接近初始角度。我们可以利用这一点来简化算法。我们不需要维护整个角度列表,而只需维护初始角度附近的一个小列表。实际上,仅跟踪初始角度两侧最近的角度就效果很好。
以下是 which-way? 过程及其辅助函数的完整替代实现。该过程实现为一个简单的循环,带有两个轨道和区间端点的状态变量。z 变量跟踪均匀圆映射的角度;x 变量跟踪所研究映射的角度。y 变量是所研究映射的动量。在每次迭代中,我们确定均匀圆映射的角度是否在初始角度以下或以上的相关区间内。如果不在任何一个区间内,则进一步迭代映射。然而,如果它在相关区域内,则检查另一个映射的角度是否在对应的区间内。如果是,则缩小均匀圆映射和另一个映射的区间,并继续迭代。如果角度不在所需的区间内,则记录不一致并报告不一致的符号。为了使这个过程有意义,两个映射连续迭代之间的角度差必须小于
。
(define (which-way? rotation-number x0 y0 the-map)
(let ((pv (principal-value (+ x0 pi))))
(let lp ((z x0) (zmin (- x0 :2pi)) (zmax (+ x0 :2pi))
(x x0) (xmin (- x0 :2pi)) (xmax (+ x0 :2pi))
(y y0))
(let ((nz (pv (+ z (* :2pi rotation-number)))))
(the-map x y
(lambda (nx ny)
(let ((nx (pv nx)))
(cond ((< x0 z zmax)
(if (< x0 x xmax)
(lp nz zmin z nx xmin x ny)
(if (> x xmax) 1 -1)))
((< zmin z x0)
(if (< xmin x x0)
(lp nz z zmax nx x xmax ny)
(if (< x xmin) -1 1)))
(else
(lp nz zmin zmax nx xmin xmax ny)))))
(lambda ()
(error "Map failed" x y)))))))
使用这种比较旋转数的方法,我们可以高精度地找到不变曲线的初始条件:
(find-invariant-curve (standard-map 0.95)
(- 1 (/ 1 golden-ratio))
0.0
2.0
2.2
1e-16)
;Value: 2.1144605494391726
使用以这种方式计算出的初始条件,我们可以生成不变曲线(见图 4.20)。如果我们将假定的不变曲线放大,它在所有放大倍数下都应保持为一条曲线——不应显示出混沌模糊的迹象(见图 4.21)。
练习 4.8. 标准映射中的不变曲线 找出标准映射中具有不同黄金旋转数的不变曲线。将其放大以显示在高放大倍数下它仍然保持曲线的特征。
4.6.2 不变曲线的消解
从图 4.21 可以看出,不变曲线上的点并非均匀遍历,这与我们为均匀圆映射绘制角度时所得到的图像不同。这是因为区间在映射时可能被拉伸或压缩。我们可以计算不变曲线上每个角度的相对访问概率密度。获得这一结果的一种粗略方法是统计落入相等增量角度区间内的点的数量。更有效的方法是使用被研究映射构造的线性变分映射,来计算从一个点到其后继点的增量角度的变化。由于源点附近小区间内的所有点都被映射到目标点附近小区间内的点(以相同的顺序),因此某点处的相对概率密度与该点处增量区间的大小成反比。为了启动这个过程,我们需要对不变曲线的初始斜率有一个良好的估计。我们可以通过用于精化具有给定旋转数的不变曲线动量的区间上的动量和角度增量的差商来估计斜率。
图 4.22 和图 4.23 显示了标准映射中黄金旋转数的不变曲线在参数 K 的三个不同值下,相对访问概率密度随角度变化的函数。随着 K 的增加,某些角度变得不太可能被访问。接近 K = 0.971635406 时,某些角度从未被访问。但不变曲线必须是连续的。因此,对于更大的 K,具有此旋转数的不变曲线似乎将不再存在。实际上,如果具有给定旋转数的不变集持续存在,它将有无穷多个孔洞(因为它具有无理旋转数)。这样的集有时称为 cantorus。