添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

翻译自 DISCRETE DIFFERENTIAL GEOMETRY: AN APPLIED INTRODUCTION 第六章 The Laplacian 。如果有翻译错误或者不当的地方希望能指出,谢谢~

早先我们提到Laplace-Beltrami算子(通常就简写为拉普拉斯)在很多几何和物理等式中都扮演了基本角色。在这一章中我们将拉普拉斯用在针对三角曲面泊松方程的离散版本中。当这章讨论顶点法线时,我们将看到从两个看待问题的不同方式得到的对于拉普拉斯同样的离散表达式(通过余切函数):使用测试函数(test functions)(或者通常被称为Galerkin projection),或者通过对微分形式进行积分(通常被成为离散外微积分)。

在我们开始讨论离散化之前,让我们先建立一些拉普拉斯算子 Δ \Delta

Δ ϕ = ρ \Delta \phi = \rho

的事实。泊松方程展现了这个内容上所有的东西——比如,在物理中 ρ \rho

通常我们的兴趣在于求解没有边界的密实曲面 M M

练习 一个二次可微函数 ϕ : M R \phi: M \rightarrow \mathbb{R}

练习 一个独立的事实是在没有边界的密实连通域上,常数函数不是 Δ \Delta

当使用像泊松方程这样的偏微分方程时,在函数之间进行内积通常是有用的。一个尤其通用的内积是 L 2 L^2

f , g : = Ω f ( x ) g ( x ) d x \langle f, g \rangle \coloneqq \intop_\Omega f(x)g(x) dx

直观上,这个操作类似于 R n \mathbb{R}^n

类似的,对于两个向量场 X X

X , Υ : = Ω X ( x ) Υ ( x ) d x \langle X, \Upsilon \rangle \coloneqq \intop_\Omega X(x) \cdot \Upsilon(x)dx

它测量了两个场在每个点处有多“一致”。

使用 L 2 L^2

Δ f , g = f , g + N f , g \langle \Delta f, g\rangle = -\langle \nabla f, \nabla g \rangle + \langle N \cdot \nabla f, g \rangle_\partial

其中 , \langle \cdot, \cdot \rangle_\partial

关于拉普拉斯的最后一个关键事实是它是半正定的,即 Δ \Delta

Δ ϕ , ϕ 0 \langle \Delta \phi, \phi \rangle \geq 0

(顺便,为什么这个值不是严格大于0的呢?)语言无法解释半正定的重要性。让我们考虑一个非常简单的例子:在平面中形式为 ϕ ( x , y ) = a x 2 + b x y + c y 2 \phi(x,y) = ax^2 + bxy + cy^2

ϕ ( x , y ) = [ x y ] x T [ a b / 2 b / 2 c ] A [ x y ] x = a x 2 + b x y + c y 2 \phi(x,y) = \underbrace{\begin{bmatrix} \end{bmatrix}}_{\mathbf{x}^T} \underbrace{\begin{bmatrix} a & b/2 \\ b/2 & c \end{bmatrix}}_A \underbrace{\begin{bmatrix} x \\ y \end{bmatrix}}_{\mathbf{x}} = ax^2 + bxy + cy^2

并且我们可以同样的定义 A A

现在假设你是一个滑雪者,正在令人哀嚎的暴风雪中心地带。你非常冷而且精疲力尽,并且你知道你将你的卡车停在了一个平坦的区域,但是它到底在哪里呢?暴风雪刮的特别猛烈并且可见度很低——所以你能做的就是保持你的手指交叉并且沿着山的坡度下降。(相信我:当一个人在进行数值优化的时候他就是这么觉得的!)如果你是聪明的并且在Pos Def Valley滑雪那么你可以就保持向下并且很快就会安全回到卡车。但是可能你会在那天觉得更有一点冒险精神并且去了一趟Semi Def Valley。在这个情况下你仍然将达到底部,但是在找到你的车前可能必须返回高处并且沿着山谷的长度前进。最后,如果你的座右铭是“安全第二”那么你丢下了对暴风雪的小心并且在Indef Valley中驰骋。这种情况下你可能永远也回不去了!

简单点说:半正定矩阵是很好的因为找到它们描述的二次函数的最小值是很容易的——在数值线性代数中有非常多的工具是基于这个思想。对于像拉普拉斯 Δ \Delta

通过有限元方法离散化

一个几何或者物理问题的解通常通过一个函数来描述:地球上每一点的温度,曲面上每一点的曲率,击中在你视网膜上每一点的光亮,等等。所以可能函数组成的空间十分惊人的大——过于大以至于不能在计算机上表示。有限元方法(finite element method (FEM))背后的思想是选取一个更小的函数空间并且并且尝试从这个空间中找到最有可能的解。更特别地,如果 u u

u ~ = i x i ϕ i , x i R \tilde{u} = \sum_i x_i \phi_i, x_i \in \mathbb{R}

使得差值 u ~ u \| \tilde{u} - u \|

让我们从一个非常简单的问题开始:假设我们有一个向量 v R 3 v \in \mathbb{R}^3

由于 v ~ \tilde{v}

( v ~ v ) e 1 = 0 ( v ~ v ) e 2 = 0 \begin{aligned} (\tilde{v} - v) \cdot e_1 &= 0 \\ (\tilde{v} - v) \cdot e_2 &= 0 \end{aligned}

在这个情况下我们得到了对于两个未知数的由两个线性方程组成的系统,并且可以很容易地计算最优向量 v ~ \tilde{v}

现在有了一个更难的问题:假设我们想要解一个标准泊松问题

Δ u = f \Delta u = f

我们如何验证给定的函数 u ~ \tilde{u}

Δ u ~ f , ϕ j = 0 \langle \Delta \tilde{u} - f, \phi_j \rangle = 0

再一次得到了一个线性方程系统。这个条件保证了解在大量可能的“测量”集合上表现得像真正的解。

接下来,让我们得到对于一个三角曲面的系统细节。基函数最自然的选择是逐片线性帽函数(hat functions) ϕ i \phi_i

此时你可能会反对:如果所有的函数都是线性的,并且 Δ \Delta

Δ u , ϕ j = k Δ u , ϕ j σ k = k , ϕ j σ k + k N u , ϕ j σ k \begin{aligned} \langle \Delta u, \phi_j \rangle &= \sum_k \langle \Delta u, \phi_j \rangle_{\sigma_k} \\ &= \sum_k \langle \nabla , \nabla \phi_j \rangle_{\sigma_k} + \sum_k \langle N \cdot \nabla u, \phi_j \rangle_{\partial \sigma_k} \end{aligned}

如果这个网格没有边界那么最后的和会消失,因为相邻三角形的法线是相对的方向。因此沿着共享边的边界积分互相抵消了:

这种情况下,在每一个三角形 σ k \sigma_k

u , ϕ j \langle \nabla u, \nabla \phi_j \rangle

换句话说,我们可以“测试” Δ u \Delta u

u , ϕ j = i x i ϕ i , ϕ j = i x i ϕ i , ϕ j \langle \nabla u, \nabla \phi_j \rangle = \langle \nabla \sum_i x_i \phi_i, \nabla \phi_j \rangle = \sum_i x_i \langle \nabla \phi_i, \nabla \phi_j \rangle

现在关键的事情变成了在每个三角形中两个基函数梯度之间的内积。如果我们可以计算这些,那么我们可以简单地构造矩阵

A i j : = ϕ i , ϕ j A_{ij} \coloneqq \langle \nabla \phi_i, \nabla \phi_j \rangle

并且求解对于系数 x x

A x = b Ax = b

其中右手边的元素被给定为 b i = f , ϕ i b_i = \langle f, \phi_i \rangle

将所以的事实放在一起(有几个练习没有翻译),我们发现我们可以通过著名的余切公式表示顶点 i i

( Δ u ) i = 1 2 j ( cot α j + cot β j ) ( u j u i ) (\Delta u)_i = \frac{1}{2} \sum_j (\cot \alpha_j + \cot \beta_j)(u_j - u_i)

其中我们在顶点 i i

通过离散外微积分方法离散化

FEM的方式显示了一种相当标准的做法去离散化偏微分方程。但是让我们尝试一个不同的方法,基于离散外微积分(DEC)。相当有趣的是,虽然这两个方式十分不同,但是我们最后会得到一样的结果!

再一次我们想要求解泊松方程 Δ u = f \Delta u = f

d d u = f \star d \star d u = f

我们早就在笔记中概括了如何使用离散外微积分离散化这类表达式,但是让我们一步步来。我们开始于一个0-型 u u

接着,我们计算离散外导数 d u du

( d u ) i j = e i j d u = e i j u = u j u i (du)_{ij} = \intop_{e_{ij}} du = \intop_{\partial e_{ij}} u = u_j - u_i

(注意到边的边界 e i j \partial e_{ij}

( d u ) i j = e i j e i j ( u j u i ) (\star du)_{ij} = \frac{|e^{\star}_{ij}|}{|e_{ij}|}(u_j - u_i)

其中 e i j |e_{ij}|

( d d u ) i = C i d d u = C i d u = j e i j e i j ( u j u i ) (d \star du)_i = \intop_{C_i}d \star du = \intop_{\partial C_i} \star du = \sum_j \frac{|e^{\star}_{ij}|}{|e_{ij}|}(u_j - u_i)

最后的Hodge星简单地将这个量除以 C i C_i

( d d u ) i = 1 C i j e i j e i j ( u j u i ) = f i (\star d \star du)_i = \frac{1}{C_i}\sum_j \frac{|e^{\star}_{ij}|}{|e_{ij}|}(u_j - u_i) = f_i

其中 f i f_i

d d u = f d \star du = \star f

换句话说,我们将0-型项的等式转变为n-型项的等式。当在曲面上操作的时候,算子 d d d\star d

网格和矩阵

目前我们已经给出了一类像拉普拉斯算子的“算法的”描述。比如,我们确定在顶点 i i

( Δ u ) i = 1 2 j ( cot α j + cot β j ) ( u j u i ) (\Delta u)_i = \frac{1}{2}\sum_j (\cot \alpha_j + \cot \beta_j) (u_j - u_i)

其中和是在 i i

Δ u = f \Delta u = f

的系统。(为了让事情更麻烦,一些线性求解器非常喜欢使用被成为回调函数的算子的算法表示——然而,实际上我们就是需要矩阵。)

在泊松方程的情况中,我们想要对于任意一个顶点处值的向量 u R V u \in \mathbb{R}^{|V|}

( B u ) i = j u j (Bu)_i = \sum_ju_j

我们如何构造一个矩阵表示这个算子呢?将 B B

我们给哪个顶点具体分配哪个数字并不是很重要,只要没个顶点都有一个数字并且每个数字都有一个顶点就可以了。这个网格有12个顶点并且顶点1和顶点2,3,4,5,9相邻。因此我们可以计算邻域值的和为

这里无论何时顶点 j j

(你可以验证这个矩阵是对的,或者你可以出去晒晒太阳,这是你的选择。)实际上,幸运的是,我们不必“手动“构建矩阵——我们可以简单的开始于0矩阵然后通过循环我们网格的局部邻域去使用非0元素填充它。

最后,一个重要的需要注意的事情是 B B