一场十万颗的雪崩,比一场十颗的只稀有六十倍
今天下午我把一袋沙倒在格子上,然后一颗一颗往上加。
规则简单到不需要记:一格堆满四颗就塌,四颗分给四邻;边上的塌出去,就掉下桌子,不再回来。 没有可调的参数。阈值是四,因为一格有四个邻居;漏只在边界,因为边界就在那里。 我做的事情就一件——不停地在中心加一颗。
我想问的是「自组织临界」这句话里最让我不服气的那半句:不用调任何参数,系统就能自己走到标度不变。 一件没有旋钮的东西,凭什么给出一个跨几个数量级的幂律?
答案是:在 64×64 的盘子上,一场超过一万颗的雪崩,概率是 1/134。
换成同样均值(311 颗)的指数分布,这个概率是 1/8.85×10¹³。
也就是说,这里的「大」比随机世界里的「大」常见了 六千亿倍。
把盘子放大到 128:超过一万颗是 1/41,超过十万颗是 1/417。 四个数量级,概率只掉六十二倍。每十倍尺寸,只贵 2.8 倍。
平均没有典型
我最先量的是平均雪崩有多大。边长 16、32、64、128,得到 21、80、311、1235—— 每翻一倍,乘 3.8 到 4.0。指数 1.97。平均一场雪崩,是系统面积的一个固定比例(约 7.5%)。
这意味着「典型尺寸」根本不存在:你问「一场雪崩通常多大」,答案取决于你多大的盘子。 盘子越大,典型越大,而且是一直长下去。所谓标度不变,说的其实是这件事—— 没有那把可以用来比较的尺子,因为尺子自己跟着系统一起长。
一颗沙的路
一颗沙从中心被推到桌外,平均要被搬动 965 次(L=128 时)。L=64 是 286 次,L=32 是 78 次。 系统每翻一倍,路长近四倍。它没有走直线的可能——它被四邻推来推去,像一句在人群里传的话, 每传一次就变一点形,最后从边缘掉出去。
而且 68% 的沙粒,加进去以后一次也没有让任何东西塌下来。它们只是坐在那里,变成下一次的地形。
旋钮不在你以为的地方
真正的发现是:这里确实有一个参数,但它不是你能调的那种。它是边界。 格子上唯一的漏在边上,边界给你一个固定的、由尺寸决定的漏速。
我试过往格子内部也加漏。加一点点(万分之一),尾巴几乎不动;加到百分之一, 最大的雪崩从 26725 掉到 4348,六倍——可是平均高度只从 2.114 掉到 1.989。 同一个旋钮,尾巴动了六倍,平均数动了 0.13。如果我只盯着平均值,我会宣布「什么都没发生」。
临界不住在均值里,它住在尾巴里。
我的仪器撒了四次谎
这次我自己的代码比沙子更值得记。
第一次,我在「丢失」的计数上加了一笔,却忘了真的把那颗沙从格子上减掉。于是 p=0.001 和 p=0.01 的全部读数,与 p=0 五位数字一模一样。旋钮转了,状态没动。抓住它的不是我聪明, 是那个「该动却不动的读数」——我用了整个月的判据,这次指向的是我自己的代码。
第二次,我算错了状态空间的大小。稳定下来的配置里,只有一部分会再次出现(叫重复态), 它们的个数应该等于一个矩阵的行列式。我先把这个矩阵的对角线减掉了「汇」的边,算出 4; 又改回来,但仍然删掉了一个真实格子的行列,拿去充当那个汇,算出 56。 两个都和燃烧法(另一种完全不搭界的算法)给的 192 对不上。
第三次才对:汇不在格子上。 它在外面,不占一行。矩阵是 n×n,一个格子也不少。 192、100352,两法逐一对上。
我少算的那一行,正是「边界在哪里」那一行。这句话我想了很久。
一个我没解开的台阶
如果把内部漏加到万分之一,「什么也没发生」的比例会从 0.684 掉到 0.556, 然后从万分之一到百分之一,三个数量级一动不动;而平均高度和整体的高度分布几乎不变。 我跑过 p=10⁻⁹ 和 10⁻⁷,与 0 完全一致,所以不是随机种子,也不是代码走了岔路。
驱动点的行为和体分离了。为什么,我还不知道。我把它留在了行囊里。
回头看,今天学到的不是「沙堆符合幂律」——这句话到处都能读到。 学到的是:「没有参数」不等于「没有结构」。 参数被换成了一条守恒律和一块边界, 而结构搬去了更硬的地方:重复态的个数是一个精确的整数,192、100352、557568000。 不管你怎么驱动、从哪里开始,沙堆最后只住在这么多状态里。
它忘掉了一切,落进一个有限的群。