微分算子及其离散化2:散度
type
status
date
slug
summary
tags
category
icon
password
2 散度 divergence
定义
三维空间的散度算子(或写作)
可以看成 梯度算子和点乘的组合。它的作用对象是三维向量函数:
因此三维散度算子作用在三维向量函数(三维向量场),输出标量场。
二维的定义类似。
算子:
作用于二维向量函数
几何理解
从散度的物理意义来推导出散度算子的表达形式。
例如一个二维向量函数
直观来看,图中位置①的流出总量小于零,位置②的流出总量大于零,位置③的流出和流出量差不多。如何用一个标量来衡量向量场中某个位置的流出量?
这就引入了散度的概念,散度在直观上是衡量某点流出量的大小:
从左到右:流出量大于流入量,总流出量大于零,散度为正;流出量小于流入量,总流出量小于零,散度为正;流出量等于流入量,总流出量等于零,散度为零。
如果一个向量场散度处处为零,则称为无源场;否则称为有源场。有源说明场中有“产生”或者“吸收”向量的点,称为源。如下图磁场两级分别为正源和负源:
有了对散度的定性理解,接下来从定量的角度来衡量具体的散度值。
以二维向量场为例,讨论某个边长为h的方形区域的流出量(图中方框为区域边界,点为各边界中点):
如下图,假设区域的左边界中心的坐标为(x,y),右边界中心的坐标为(x+h,y);同样地,假设区域的下边界中心坐标为(x,y),上边界中心坐标为(x,y+h)。区域的总面积为.
注意我们规定横坐标从左到右为正方向,纵坐标从下到上为正方向。对于某个区域流出为正,流入为负。
讨论这个区域总流出量,只需要考虑它的上下左右四个边界的流出量。
首先考虑右边界。
向量场在有边界的取值为,其中平行于边界的分量对区域的流入流出量没有影响,因此垂直于边界的分量就代表了这个点对区域流量的贡献。
若这个区域很小,我们近似认为右边界上每个点的取值都和中点的取值一样。右边界面积(长度)为h,因此整个右边界的流出量近似为
hF_x(x+h, y)再考虑左边界。注意我们规定:向右为正,流出为正。因此右边界的取值为正,流出量也为正。而对于左边界的取值为正,则代表是流入量为正,流出量则为负。下图左图为取值为正,右图为取值为负;蓝色代表流出,红色代表流入。
因此左边界的流出量近似为
x方向上的总流出量为右边界流出量+左边界流出量:
同理,向上为正,流出为正。y方向上的总流出量为上边界流出量+下边界流出量:
整个区域的总流出量就是x方向和y方向流出量之和
这是整个区域的总流出量,我们想要衡量的是某个点的流出量。如果区域足够小,我们认为区域中每个点的流出量是相同的,因此除以整个区域的体积(面积)
等价于
这个形式其实就是x方向和y方向的有限差分之和。
区域体积(面积)无穷小时(h→0):
正是偏导数相加的形式:
三维情况的格式类似:
至此,我们从散度的物理意义出发,由离散格式推导出了散度的微分表达形式。可以看成散度算子作用于向量函数
正是梯度算子与向量函数各分量的线性组合(点乘):
离散化
差分格式
由上述推导过程可得到了散度算子的离散化格式。上述推导其实是向前差分的格式,可以轻易得出中心差分的格式。以二维中心差分为例:
以网格位置编码(i,j,k)的形式来表达:
分母为两倍网格间距。
这里利用了上下、左右两个相邻格子中心点的值来做差分,和各邻居的距离都是h()。差分距离越短,拟合精度越高。所以如果用和相邻格子边界中心的值会得到更高的精度:
和相邻取值点的距离都是,则差分格式变为:
注意分母变为了一倍网格间距。
三维的差分格式同理:
空间离散格式
由上可知,差分格式求格子中心的散度时,利用格子和邻居边界的取值比邻居中心的取值精度更高。因为是中心差分,差分距离变为,误差会变为。那么在编写代码时可以直接保存网格边界的值。
以二维为例:
左侧把函数值记录在格子中心(注意是一个向量),右侧把函数值的各分量记录在格子边界中心(注意是函数值各分量,是一个标量)。
三维网格同理,以某个格子为例:
这种把向量场的各个分量交错记录在网格边界的空间离散形式,被称为交错网格(Staggered grid),或称为Marker-and-cell网格(MAC grid)。参考[1]
[1] McKee, S., Tomé, M. F., Ferreira, V. G., Cuminato, J. A., Castelo, A., Sousa, F. S., & Mangiavacchi, N. (2008). The MAC method. Computers & Fluids, 37(8), 907-930.