深色模式
曲线网格与 Jacobian
二维数组有规整的行列编号,但这些编号对应的地理位置可以弯曲。曲线网格(curvilinear grid)将“数据在数组哪里”与“数据在空间哪里”分开保存。想象一张画着方格的橡皮膜:编号没变,形状、距离与方向都可能改变。
网格是一个从参数到位置的函数
令 ξ、η(读作 xi、eta)表示网格的参数坐标(parametric coordinates)。映射(mapping)写为 F(ξ,η)=(x,y)。规则网格可能只需原点与间距;曲线网格常为每个节点单独保存位置。
| 符号 / 英文 | 含义 | 本例单位 |
|---|---|---|
| ξ,η / parametric coordinates | 网格参数,各取 [0,1] | 无量纲 |
| x,y / physical coordinates | 平面东向、北向位置 | m |
| J / Jacobian matrix | 映射在当前位置的变化率 | m / 单位参数 |
| det J / determinant | 局部有向面积缩放 | m² / 单位参数面积 |
| J⁻¹ / inverse Jacobian | 把空间小位移换回参数小位移 | 单位参数 / m |
Jacobian 矩阵(Jacobian matrix,雅可比矩阵)把四个偏导数组成一张表:
两列分别告诉你:沿网格两个方向挪动一小步,会在物理空间朝哪边走、走多远。这与“矩阵的列是基向量”相连,只是基可能随位置变化。
手算一张斜网格
设 x=1000ξ+200η、y=500η。整个单位参数方格变成一个倾斜的平行四边形:
行列式(determinant)的绝对值表示局部面积缩放。因此整个网格面积为 500,000 m²,参数面积为 0.01 的小格面积为 5,000 m²。这个映射是仿射的,以上结果精确;非线性曲线网格中的 J 随位置变化,对有限小格使用单点 J 只是一种近似。
ts
function physicalPosition(xi: number, eta: number) {
return { x: 1000*xi + 200*eta, y: 500*eta }
}
function parameterVelocity(eastMps: number, northMps: number) {
// 解 J × [dξ/dt,dη/dt] = [U,V]
const etaPerSecond = northMps / 500
const xiPerSecond = (eastMps - 200*etaPerSecond) / 1000
return { xiPerSecond, etaPerSecond }
}
physicalPosition(0.5, 0.5) // {x:600,y:250} m
parameterVelocity(10, 5) // {xiPerSecond:0.008,etaPerSecond:0.01}因此“把东向风 U 直接加到横向索引 ξ”通常不成立。需要先核对数据分量的定义,再处理基、尺度与单位。一些模型提供地理东/北分量,另一些提供沿网格方向的物理速度;后者也不必然等于参数变化率。
什么时候网格会折叠
如果 det J = 0,一个局部方向被压扁,映射无法局部求逆。若原来朝向一致的连续网格中,行列式穿过零并改变符号,可能产生翻折。统一为负的行列式也可能只是全局轴顺序反向,不能仅凭负号断言数据损坏。
实际三角网格可检查面积、绕序与相邻单元的一致性。局部非零行列式仍不能保证整个复杂映射没有全局重叠,还应检查边界和自交。反过来从世界位置寻找数据值,则需要定位包含该点的单元,再求局部坐标;规则经纬网格的除以间距公式不能直接套用。
本节使用平面米制坐标说明映射。若 F 输出经纬度,J 的分量是角度相对于参数的变化率,不能直接把其行列式解释为平方米;地球几何还需要额外换算。
自检:两个映射代表什么
F(ξ,η)=(ξ,−η) 的行列式为负,是否必然存在网格翻折?F(ξ,η)=(ξ,0) 又怎样?
答案与理由
第一个映射是完整镜像,始终可逆,没有局部折叠;只是方向与原约定相反。第二个把整张网格压成线,行列式为零,η 信息丢失,不能反解。判断时需要结合预期方向、连续性与网格几何。