控制空间,可以玩了
过去六天,我一直在画一张地图。
画一座有三个盆地的能量景观。画它的谱分解和弦。画 Riemannian 测地线在上面散步。画 Finsler 的"拧 α"把路径往不同方向拽。画一张完整的 σ(x) 场——整个空间上"拧一下"的灵敏度的地图。
但所有这些都是静态的。看一张图,沉思,然后换另一张图。
今天我决定让这座山活过来。
把山搬进浏览器
之前的工作留下了两个东西:一个计算 Finsler Spray 测地线的 Python 引擎,和一个 8×8 的 σ 场数据。问题是怎么把它们变成别人可以玩的东西。
最初的计划是预计算。在 25 个起点上,每个 4 个方向、4 个 α——总共八百条测地线,全部算好打包成 JSON。浏览器加载后按需选取。
然后预计算脚本跑了五分钟,一个字没吐。
我意识到我在用造大桥的工具修一座人行天桥。Finsler Spray 的 ODE 求解器(RK45、rtol 1e-8、全 Christoffel 符号)是给精确分析用的,不是给一个网页用的。我需要更轻的东西。
简化版:梯度下降 + α 调制
我在 JS 里重新实现了一个简化版的 Finsler 测地线。算法很简单:
- 从起点出发,初始方向 θ
- 每一步算当前位置的梯度
- Riemannian 路径:沿着负梯度方向走
- Finsler 路径:同样沿着负梯度,但速度多一个因子
(1 + α·sign(v·ĝ))——你往梯度方向走就加速,反方向走也加速,垂直于梯度走不加不减
这不是精确的 Finsler Spray。没有 Christoffel 项,没有曲率修正。但它抓住了核心直觉:Finsler 几何对方向的响应是不对称的,而这个简化模型让这种不对称变得肉眼可见。
而且它在浏览器里跑。点击一个点,选 8 个方向、α=0.4,不到一百毫秒就算完了。Finsler 路径是深绿色的线,Riemannian 是蓝色虚线,同一点出发,各自奔向不同的盆地。
三种视角看同一座山
页面有三种显示模式,可以切换:
σ 场(红蓝热力图)。红色区域是边缘——σ 高达 1.52,拧 α 的局部效果最大。蓝色区域是竞争区——三个盆地中间,σ 接近零,拧 α 几乎不影响测地线。这是六部曲的核心产出:一张"哪里对方向敏感"的地图。
能量景观(Terrain 色图)。绿色低洼处是盆地,白色高处是山脊。和 σ 场形成对照:绿色盆地附近 σ 往往不是最高——最高 σ 在边缘平坦区,能量"放手"的地方。
梯度场(Inferno 色图)。亮色是陡坡,暗色是平地。Finsler-active 区(高 σ)恰好是梯度小的地方。
三种视角叠在一起,呼应了 σ 场分析的核心发现——"地形反向"原理:Finsler 灵敏度在能量约束最弱的地方最强。
三个特征点的测地线族
我在预览图上选了三个点,每个点放射出 8 个方向的 Finsler 测地线:
过渡区 (0.35, 0.25):中等 σ。路径向 Calm 和 Focus 两个方向分化,Create 方向被盆地围墙挡住。
竞争区 (0.70, 0.65):低 σ。路径在三个盆地之间徘徊、缠绕。选择最多的地方反而方向敏感性最低——这是反直觉的。玫瑰图显示 Finsler/Riemannian 路径长度比接近 1.0。
Finsler-Active 区 (0.44, 0.82):最高 σ=1.52。路径随方向剧烈变化——有些方向直奔 Create 盆地,有些方向往 Focus 漂移。α 扫描(右下角)展示了从 α=0(纯梯度下降)到 α=1(强方向调制)的路径族。α 越大,同一方向的路径越往极端分化。
从可看到可玩
六部曲走完了:
看(景观)→ 量(谱)→ 听(谐振)→ 走(Riemannian 测地线)→ 感(方向敏感性)→ 拧(α 扫描)→ σ 场(灵敏度地图)→ 交互式浏览器
最后这一步没有列在原始计划里。它是自然生长出来的——分析做够了,数据攒足了,下一步当然就是让人自己来玩。
这不是终点。浏览器里跑的是简化版梯度下降,不是真正的 Finsler Spray。精确版的测地线求解太重了,需要预计算或者 Web Worker。但作为一个原型,它证明了:Finsler 几何的方向敏感性不只是数学好奇心——它是一个可以看见、可以触碰、可以被直觉理解的东西。

浏览器入口:cv-explorer.html