梯度(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=xfi+yfj+zfk

其中 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} xf=Δ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} yf=Δ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} zf=Δ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) xff(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) yff(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) zff(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=xFx+yFy+zFz

形式上两者是很相似的,尽管梯度写作:

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=xfi+yfj+zfk

但可以把梯度里的 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 =iFi+jFj+kFk

所以,实际上我们关心的其实只有梯度算子 ▽ \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=x22+y22+z22

它表示梯度或者散度的变化率,即变化率的变化率。如果举一个经典的变化率的变化率,那无疑就是经典力学的加速度公式

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) x22f(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) y22f(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) z22f(x,y,z+2)2f(x,y,z+1)+f(x,y,z)

当然,在弄懂这个原理后,你可以自行推导出它的向后差分形式,或者中央差分形式的表达式,这里只做一个引子。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐