目的:
参考《GPU Gems》,在UE4中尝试重现2D流体模拟。
本节解释连续函数下梯度,散度等各概念在离散情况下的形式。
参考:
观察:
分析:
1.梯度(数量场)
连续:
离散:
不妨认为两个像素之间距离差为,以此在2D空间上构造x-y坐标系。
并且在空间中的位置为
推导:
记得连续函数中,设函数P(x),求其在x=i上的导数,有:
就是求此点切线的斜率。但在离散情况下,点间距不能取得任意小。
在我们这,e最小为。
用差商近似导数,就是用两端点连线斜率近似i点斜率
那么我们取哪两个整数点a,b(b>a),使得两端点连线斜率
最接近于
答案既不是a=i-1,b=i,也不是a=i,b=i+1。
而是a=i-1,b=i+1。
具体的证明还是很麻烦的,但结合拉格朗日中值定理(Lagrange Mean Value Theorem)来看,当取a=i-1,b=i时,必定有一点k,
其导数(切线斜率)等于(端点连线斜率),但i>k>i-1,点k在之间,不包含端点。
然而,当我们取a=i-1,b=i+1时,在这个长度为2*的区间上,我们的还是有可能正好等于处导数的,区间越小,这个概率越高。包含i,且区间长度最小,也只有a=i-1,b=i+1了。
上图手画函数的情况,正好能看出最佳选择就是a=i-1,b=i+1。
也就是
最后,结合2D网格,我们得出
(此时P变成了一个2参数,1返回值的函数)
我们再一次体会到,导数描绘了某点周围的变化,变化是主体。
2.散度(矢量场)
连续:
离散:
一定要注意理解散度,比如某垃圾百科上抄了散度公式:
,但没抄
注意其中并非什么偏导数,而是场的x轴分量函数。
3.拉普拉斯算子(数量场)
连续:
二阶导是导数的导数,既然上面我们将导数近似为差商的形式,那么二阶导数就近似为差商的差商。
对于P(i),其二阶差商为
那么我们的2D平面中就是
又因为我们这,所以可以简化为
注意到公式中出现的系数(1,1,1,1,-4),就是Laplace描边卷积核中的系数由来。
PS:
拉普拉斯算子又有时写成。
在初学高数的时候,我总不能理解二阶导的奇怪形式。但接触差商和算子后了解了,下半部分对比二阶差商,确实是本体的平方,即。而上半部分,表明了其对P进行了2次求导的操作。那这个2次为什么会写成平方?
梯度:
而散度简直就像是,所以写成
而“拉普拉斯度”简直就像是,所以写成。从中你可以看出在分子的符号上进行“平方”显得十分自然。
是泊松方程。
当h=0,就是拉普拉斯方程。
虽然照理来说拉普拉斯算子只用于数值场,但也写在矢量场上,表明对每个分量数值场进行拉普拉斯运算,如我们上一节的Navier–Stokes equations中的扩散项。应用于矢量场的拉普拉斯算子,结果还是一个矢量场:
结语:
本节对梯度等概念的在Shader下的2D网格的离散形式进行了简单说明。