Chango的数学Shader世界(十)流体模拟-有限微分形式

目的:

参考《GPU Gems》,在UE4中尝试重现2D流体模拟。

本节解释连续函数下梯度,散度等各概念在离散情况下的形式。

 

参考:

《GPU Gems》

 

观察:

 

分析:

1.梯度(数量场)

连续:

\nabla P=(\frac{\partial P}{\partial x},\frac{\partial P}{\partial y})

离散:

( \frac{P_{i+1,j}-P_{i-1,j}}{2\delta x} , \frac{P_{i,j+1}-P_{i,j-1}}{2\delta y} )

不妨认为两个像素之间距离差为\delta x,以此在2D空间上构造x-y坐标系。

并且P_{i,j}在空间中的位置为(i\delta x,j\delta y)

推导:

记得连续函数中,设函数P(x),求其在x=i上的导数,有:

\lim _{e->0} \frac{P(x+e )-P(x)}{e}

就是求此点切线的斜率。但在离散情况下,点间距不能取得任意小。

在我们这,e最小为\delta x

用差商近似导数,就是用两端点连线斜率近似i点斜率

那么我们取哪两个整数点a,b(b>a),使得两端点连线斜率

\frac{P(b* \delta x)-P(a* \delta x)}{(b-a)* \delta x}最接近于\lim _{e->0} \frac{P(i+e )-P(i)}{e}

答案既不是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,

其导数(切线斜率)等于\frac{P(b* \delta x)-P(a* \delta x)}{(b-a)* \delta x}(端点连线斜率),但i>k>i-1,点k在P_{i-1},P_{i}之间,不包含端点。

然而,当我们取a=i-1,b=i+1时,在这个长度为2*\delta x的区间上,我们的\frac{P(b* \delta x)-P(a* \delta x)}{(b-a)* \delta x}还是有可能正好等于P_{i}处导数的,区间越小,这个概率越高。包含i,且区间长度最小,也只有a=i-1,b=i+1了。

上图手画函数的情况,正好能看出最佳选择就是a=i-1,b=i+1。

也就是\frac{P((i+1)\delta x)-P((i-1)\delta x)}{2\delta x}= \frac{P_{i+1}-P_{i-1}}{2\delta x}

最后,结合2D网格,我们得出( \frac{P_{i+1,j}-P_{i-1,j}}{2\delta x} , \frac{P_{i,j+1}-P_{i,j-1}}{2\delta y} )

(此时P变成了一个2参数,1返回值的函数)

我们再一次体会到,导数描绘了某点周围的变化,变化是主体。

2.散度(矢量场)

连续:

\nabla \cdot u=\frac{\partial u1}{\partial x}+\frac{\partial u2}{\partial y}

离散:

\frac{u1_{i+1,j}-u1_{i-1,j}}{2\delta x} + \frac{u2_{i,j+1}-u2_{i,j-1}}{2\delta y}

一定要注意理解散度,比如某垃圾百科上抄了散度公式:

,但没抄

F=F_{x}\boldsymbol{i}+F_{y}\boldsymbol{j}+F_{z}\boldsymbol{k}

注意其中F_{x}并非什么偏导数,而是场的x轴分量函数。

3.拉普拉斯算子(数量场)

连续:

\nabla^{2}P=\frac{\partial ^{2}P}{\partial x^{2}}+\frac{\partial ^{2}P}{\partial y^{2}}

二阶导是导数的导数,既然上面我们将导数近似为差商的形式,那么二阶导数就近似为差商的差商。

对于P(i),其二阶差商为

(\frac{P((i+1)*\delta x)-P(i*\delta x)}{\delta x}-\frac{P(i*\delta x)-P((i-1)*\delta x)}{\delta x})/\delta

=\frac{P_{i+1}+P_{i-1}-2P_{i}}{(\delta x)^{2}}

那么我们的2D平面中就是

\frac{P_{i+1,j}+P_{i-1,j}-2P_{i,j}}{(\delta x)^{2}}+\frac{P_{i,j+1}+P_{i,j-1}-2P_{i,j}}{(\delta y)^{2}}

又因为我们这\delta x=\delta y,所以可以简化为

\frac{P_{i+1,j}+P_{i-1,j}+P_{i,j+1}+P_{i,j+1}-4P_{i,j}}{(\delta x)^{2}}

注意到公式中出现的系数(1,1,1,1,-4),就是Laplace描边卷积核中的系数由来。

PS:

拉普拉斯算子\nabla^{2}又有时写成\Delta

在初学高数的时候,我总不能理解二阶导\frac{\partial ^{2}P}{\partial x^{2}}的奇怪形式。但接触差商和算子后了解了,下半部分对比二阶差商,确实是本体的平方,即\delta x^2=(\delta x)^{2}。而上半部分,表明了其对P进行了2次求导的操作。那这个2次为什么会写成平方?

梯度:\nabla P = (\frac{\partial P}{\partial x},\frac{\partial P}{\partial y})

而散度\frac{\partial u1}{\partial x}+\frac{\partial u2}{\partial y}简直就像是(\frac{\partial }{\partial x} , \frac{\partial }{\partial y})\cdot (u1,u2),所以写成\nabla \cdot u

而“拉普拉斯度”\frac{\partial ^{2}P}{\partial x^{2}}+\frac{\partial ^{2}P}{\partial y^{2}}简直就像是[(\frac{\partial }{\partial x} , \frac{\partial }{\partial y})\cdot (\frac{\partial }{\partial x} , \frac{\partial }{\partial y}) ]P,所以写成(\nabla \cdot \nabla )P=\nabla^{2}P=\Delta P。从中你可以看出在分子的\partial符号上进行“平方”显得十分自然。

\Delta f=h是泊松方程。

当h=0,\Delta f=0就是拉普拉斯方程。

虽然照理来说拉普拉斯算子只用于数值场,但也写在矢量场上,表明对每个分量数值场进行拉普拉斯运算,如我们上一节的Navier–Stokes equations中的扩散项k\nabla^{2}u。应用于矢量场的拉普拉斯算子,结果还是一个矢量场:k(\nabla^{2}u1,\nabla^{2}u2)

 

结语:

本节对梯度等概念的在Shader下的2D网格的离散形式进行了简单说明。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值