梯度本意是一个向量(矢量),当某一函数在某点处沿着该方向的方向导数取得该点处的最大值,即函数在该点处沿方向变化最快,变化率最大(为该梯度的模)
对程序开发者而言,它是由一阶偏导组成的矢量
当我们需要知道函数在特定方向上的变化率,通过将梯度与该方向的向量点乘,我们就可以计算出函数在这一点的方向导数 $\frac{\partial f}{\partial n} =\nabla f \cdot n $
散度\(\nabla \cdot f(x) = (\frac{\partial }{\partial x} , \frac{\partial }{\partial y} , \frac{\partial }{\partial z} ) \cdot f(x)\)
$\nabla \cdot $ 是散度算子,散度就是通量密度,通量即通过一个面的某物理量
在流体力学中,速度场的散度是体积膨胀率,散度(divergence)算子用于描述向量场中在某点的聚集或发散程度
对程序开发者,这就是梯度算子与向量场的点乘
流体模拟中,流体往往有着难以压缩的性质,通常认为速度场的散度为零
旋度\(\nabla\times f(x) = (\frac{\partial }{\partial x} , \frac{\partial }{\partial y} , \frac{\partial }{\partial z} ) \times f(x)\)
\(\nabla\times\) 是旋度算子,旋度就是环量密度,以水旋涡为例,沿着圆周关于速度的线积分就是环量,环量除以圆面积,然后让面积无限小,比值就是旋度,旋度用以描述某个点的旋转程度
对程序开发者,这就是梯度算子与向量场的叉积
拉普拉斯算子$\nabla^{2} f(x) = \nabla \cdot \nabla f(x) =\frac{\partial^{2} f}{\partial x^{2} } +\frac{\partial^{2} f}{\partial y^{2} } +\frac{\partial^{2} f}{\partial z^{2} } $
$\nabla^{2} $是拉普拉斯算子,又称拉氏算子,它的本质是梯度的散度
拉普拉斯算子通常用于描述一个函数中某点的值与它邻域的平均值之差,或者说用于描述某点 在它的邻域中是“多么与众不同”
拉普拉斯算子可以检测图像的边缘和峰值,也可以用以模糊矢量场的尖锐部分(拉普拉斯算子 加上原始矢量场)
流体运动的基本原理现在开始进入正题,前面讲的都是编程相关的细节,现在开始流体力学的部分。
流体运动的本质是源于多种力的组合。
在保证密度不变的情况下,流体受到重力,压力,粘度力三种力的作用。
重力不需要我太多介绍,主要是压力和粘度力
压力和压力梯度力风是高压区吹到低压区的,同样的规则适用于流体。
压力其实是压力梯度力,当你潜水时,随着深度的增加,收到的压力也随之增加。这种压力差会沿着深度在与重力相反的方向产生向上的压力。正因为这种力,水可以保持其状态而不是收缩
假设一个立方体大小的流体,单位大小是L,密度为 \(\rho\), 假设压力沿x轴方向,左右之间的压力差是\(\Delta p\),压力大小就等于\(\Delta p L^{2}\),所以 $F_{p} = -\Delta p L^{2}= ma_{p} = L^{3}\rho a_{p} $
可推导得 \(a_{p} = \frac{-\Delta p}{\rho L}\),假定立方体非常小,可得 $a_{p} = -\frac{\partial p}{\partial x} \frac{1}{\rho} $
接着我们将它推导到三维上 ,可得 $a_{p} = -\frac{\nabla p}{\rho} $
所以$ a = g -\frac{\nabla p}{\rho} + \cdots$
粘度流体模拟中粘度类似于阻尼,它试图模糊2点间的速度差异,它导致液体有了一定的粘稠感。正好,拉普拉斯算子能做到模糊矢量场。
\(V_{new} = V + \Delta t u \nabla^{2}V\) u 是粘度系数
由上式可以得到粘度影响的加速度$ a_{V} =u \nabla^{2}V$
所以$ a = g -\frac{\nabla p}{\rho} + u \nabla^{2}V$ 这就是 著名的 纳维斯托克斯(Navier--Stokes, NS)方程