梯度(gradient)
什么是梯度
开始这个话题之前,我想先引入梯度算子,写作 ▽ \triangledown ▽ 函数式写作 g r a d ( x ) grad(x) grad(x),对于二维或者三维来说,就写作 g r a d ( x , y , z ) grad(x, y, z) grad(x,y,z)。你在教科书上能见到它的解析式表达形式,如果对于三维空间来说,就写作
g r a d ( x , y , z ) = ▽ f = ∂ f ∂ x i + ∂ f ∂ y j + ∂ f ∂ z k grad(x, y, z)=\triangledown f = \frac{\partial f}{\partial x} i + \frac{\partial f}{\partial y}j + \frac{\partial f}{\partial z}k grad(x,y,z)=▽f=∂x∂fi+∂y∂fj+∂z∂fk
其中 i i i j j j k k k表示在x, y, z轴上的向量分量,如果不太清楚这个表达形式的同学,可能需要翻看一下自己高中数学关于向量分量描述的相关章节了。
因为这个公式是个偏微分的表达形式,例如对于X轴上,用差分形式进行表达,就是这样的:
∂ f ∂ x = f ( x + Δ x o , y , z ) − f ( x , y , z ) Δ x o \frac{\partial f}{\partial x} = \frac{f(x + \Delta x_o, y, z) - f(x, y, z)}{ \Delta x_o} ∂x∂f=Δxof(x+Δxo,y,z)−f(x,y,z)
因此,分别对于Y轴,Z轴来说,就分别是这样的:
∂ f ∂ y = f ( x , y + Δ y o , z ) − f ( x , y , z ) Δ y o \frac{\partial f}{\partial y} = \frac{f(x, y + \Delta y_o, z) - f(x, y, z)}{ \Delta y_o} ∂y∂f=Δyof(x,y+Δyo,z)−f(x,y,z)
∂ f ∂ z = f ( x , y , z + Δ z o ) − f ( x , y , z ) Δ z o \frac{\partial f}{\partial z} = \frac{f(x, y, z + \Delta z_o) - f(x, y, z)}{ \Delta z_o} ∂z∂f=Δzof(x,y,z+Δzo)−f(x,y,z)
差分形式
而对于计算机来说,通常我们令 Δ x o = Δ y o = Δ z o = 1 \Delta x_o = \Delta y_o = \Delta z_o = 1 Δxo=Δyo=Δzo=1,然后常用的一种差分形式就可以表示如下:
∂ f ∂ x ≈ f ( x + 1 , y , z ) − f ( x , y , z ) \frac{\partial f}{\partial x} \approx f(x +1, y, z) - f(x, y, z) ∂x∂f≈f(x+1,y,z)−f(x,y,z)
∂ f ∂ y ≈ f ( x , y + 1 , z ) − f ( x , y , z ) \frac{\partial f}{\partial y} \approx f(x, y +1, z) - f(x, y, z) ∂y∂f≈f(x,y+1,z)−f(x,y,z)
∂ f ∂ z ≈ f ( x , y , z + 1 ) − f ( x , y , z ) \frac{\partial f}{\partial z} \approx f(x, y, z +1) - f(x, y, z) ∂z∂f≈f(x,y,z+1)−f(x,y,z)
所以你也看出来了,所谓的梯度,用大白话讲,就是对于某一点它分别在X轴上、Y轴上以及Z轴上的斜率。
散度(divergence)
你会发现它跟梯度算子很相似,写作 ▽ ⋅ F ⃗ \triangledown \cdot \vec{F} ▽⋅F 在很多书上它被简写成这样 ▽ ⋅ F \triangledown \cdot F ▽⋅F 区别在于多了一个点乘符号。
你或许会觉得梯度和散度长得很像,有区别吗?我个人理解其实区别并不大,因为散度的解析式也写成这样的形式:
d i v ( F ) = ▽ ⋅ F = ∂ F x ∂ x + ∂ F y ∂ y + ∂ F z ∂ z div(F) = \triangledown \cdot F = \frac{\partial F_x}{\partial x} + \frac{\partial F_y}{\partial y} + \frac{\partial F_z}{\partial z} div(F)=▽⋅F=∂x∂Fx+∂y∂Fy+∂z∂Fz
形式上两者是很相似的,尽管梯度写作:
g r a d ( x , y , z ) = ▽ f = ∂ f ∂ x i + ∂ f ∂ y j + ∂ f ∂ z k grad(x, y, z)=\triangledown f = \frac{\partial f}{\partial x} i + \frac{\partial f}{\partial y}j + \frac{\partial f}{\partial z}k grad(x,y,z)=▽f=∂x∂fi+∂y∂fj+∂z∂fk
但可以把梯度里的 f f f 和向量分量做一个映射,变成一个新的向量后,就可以得到这样一个表达式:
F ⃗ ( x , y , z ) = x i ⃗ + y j ⃗ + z k ⃗ \vec{F}(x,y,z)=x \vec i + y \vec j+z \vec k F(x,y,z)=xi+yj+zk
于是梯度就能转换为散度的表达形式:
▽ ⋅ F ⃗ = ∂ F i ∂ i + ∂ F j ∂ j + ∂ F k ∂ k \triangledown \cdot \vec F = \frac{\partial F_i}{\partial i} + \frac{\partial F_j}{\partial j} + \frac{\partial F_k}{\partial k} ▽⋅F=∂i∂Fi+∂j∂Fj+∂k∂Fk
所以,实际上我们关心的其实只有梯度算子 ▽ \triangledown ▽。
要说这两者最大表示区别,我觉得是在于这两者观察角度的不同。举例来说,梯度是在给定欧式空间坐标后,研究在这空间里类似山脊一侧某一点的坡度的斜率。
而散度,则是在流场中的某一点,放置一个探测器,计算该点的速度、密度、热量的变化率。
如果观察坐标系,可以发现对于梯度来说,其坐标系在外,观察点位于坐标系中任意一个点上。而散度,它的坐标系通常表示为它自身,即以观察点为中心,建立XYZ坐标系。
也就是说,如果你把梯度的观察点设置为欧式空间坐标的原点,那么此刻的梯度和散度就是一回事了。
拉普拉斯算子(Laplace Operator)
在介绍完梯度和散度后,现在来介绍拉普拉斯算子:它写作 △ \triangle △ 或者 ▽ 2 \triangledown^2 ▽2 解析式写为:
▽ 2 = ∂ 2 ∂ x 2 + ∂ 2 ∂ y 2 + ∂ 2 ∂ z 2 \triangledown^2 = \frac{\partial^2}{\partial x^2} + \frac{\partial^2}{\partial y^2}+\frac{\partial^2}{\partial z^2} ▽2=∂x2∂2+∂y2∂2+∂z2∂2
它表示梯度或者散度的变化率,即变化率的变化率。如果举一个经典的变化率的变化率,那无疑就是经典力学的加速度公式
v t = v o + a t v_t = v_o + at vt=vo+at
使用拉普拉斯算子的重要物理意义,在于假设一个场分别在XYZ分量上的变化都是线性的,那么可以直接使用拉普拉斯算子,直接估测出距离测试点 P o P_o Po ( Δ X , Δ Y , Δ Z ) (\Delta X, \Delta Y, \Delta Z) (ΔX,ΔY,ΔZ)的某一点 P t P_t Pt 上的物理值,例如速度、密度、热量等。估算方式可以简单到如同求解加速度一样。
那么它的差分形式的近似表达式又是什么呢,从1阶差分形式可以知道
▽ f ( x ) = f ( x + 1 ) − f ( x ) \triangledown f(x) = f(x +1) - f(x) ▽f(x)=f(x+1)−f(x)
那么它的二阶形式就表示为:
▽ 2 f ( X ) = ▽ f ( X + 1 ) − ▽ f ( X ) \triangledown^2f(X) = \triangledown f(X+1) - \triangledown f(X) ▽2f(X)=▽f(X+1)−▽f(X)
代入一阶差分,于是就可以得到
▽ 2 f ( x ) = f ( x + 2 ) − 2 f ( x + 1 ) + f ( x ) \triangledown^2f(x) = f(x+2) - 2f(x+1) + f(x) ▽2f(x)=f(x+2)−2f(x+1)+f(x)
差分形式
所以,对于拉普拉斯算子,它的向前差分形式的各XYZ上的差分计算方法即为:
∂
2
∂
x
2
≈
f
(
x
+
2
,
y
,
z
)
−
2
f
(
x
+
1
,
y
,
z
)
+
f
(
x
,
y
,
z
)
\frac{\partial^2}{\partial x^2} \approx f(x+2, y, z) - 2f(x+1, y, z) + f(x, y, z)
∂x2∂2≈f(x+2,y,z)−2f(x+1,y,z)+f(x,y,z)
∂
2
∂
y
2
≈
f
(
x
,
y
+
2
,
z
)
−
2
f
(
x
,
y
+
1
,
z
)
+
f
(
x
,
y
,
z
)
\frac{\partial^2}{\partial y^2} \approx f(x, y+2, z) - 2f(x, y+1, z) + f(x, y, z)
∂y2∂2≈f(x,y+2,z)−2f(x,y+1,z)+f(x,y,z)
∂
2
∂
z
2
≈
f
(
x
,
y
,
z
+
2
)
−
2
f
(
x
,
y
,
z
+
1
)
+
f
(
x
,
y
,
z
)
\frac{\partial^2}{\partial z^2} \approx f(x, y, z+2) - 2f(x, y, z+1) + f(x, y, z)
∂z2∂2≈f(x,y,z+2)−2f(x,y,z+1)+f(x,y,z)
当然,在弄懂这个原理后,你可以自行推导出它的向后差分形式,或者中央差分形式的表达式,这里只做一个引子。