3D 快速行进算法(Fast Marching Method in 3D case)

Intro

快速行进算法用来高效求解程函方程(Eikonal Equation) F ∥ ∇ U ∥ = 1 F\Vert\nabla U\Vert = 1 FU=1, F为速度场函数( Velocity Field Function). 符号距离函数为这个方程的近似解,当 F = 1 F = 1 F=1时,二维情况下 F ( x , y ) = 1 F(x, y) = 1 F(x,y)=1, 三维情况下 F ( x , y , z ) = 1 F(x, y, z) = 1 F(x,y,z)=1. 该方程为非线性偏微分方程,一般用数值方法也即有限差分来进行求解,其一阶有限差分近似为
( max ( Δ − x U , − Δ + x U , 0 ) ) 2 + ( max ( Δ − y U , − Δ + y U , 0 ) ) 2 = 1 / F (\text{max}(\Delta_{-x}U, -\Delta_{+x}U, 0))^2 + (\text{max}(\Delta_{-y}U, -\Delta_{+y}U, 0))^2 = 1 / F (max(ΔxU,Δ+xU,0))2+(max(ΔyU,Δ+yU,0))2=1/F
这个有限差分如何得到可以参考Osher或Sethian的著作。
三维情况下方程左侧再添加一项对 z z z的差分。

Derive solution

大多数博客只讨论了二维情况,对三维的考虑都是基于mesh,由于我这次做的项目使用的三维网格(or Voxel),以小立方体为单位。具体的解的推导有点不一样,但大部分类似。
考虑网格点 i , j , k i, j, k i,j,k, 设 U x = min ( U i − 1 , j , k , U i + 1 , j , k ) , U y = min ( U i , j − 1 , k , U i , j + 1 , k ) , U z = min ( U i , j , k − 1 , U i , j , k + 1 ) U^x = \text{min}(U_{i - 1, j, k}, U_{i+1, j, k}), U^y = \text{min}(U_{i, j - 1, k}, U_{i, j + 1, k}), U^z = \text{min}(U_{i, j, k-1}, U_{i, j, k+1}) Ux=min(Ui1,j,k,Ui+1,j,k),Uy=min(Ui,j1,k,Ui,j+1,k),Uz=min(Ui,j,k1,Ui,j,k+1)
分以下几种情况考虑

  1. U > U x , U y , U z U > U^x, U^y, U^z U>Ux,Uy,Uz, 即 U > max ( U x , U y , U z ) = U x U>\text{max}(U^x, U^y, U^z)=U^x U>max(Ux,Uy,Uz)=Ux(假设U^x为最大值)
    solution: U = U x + U y + U z ± 3 / F 2 − [ ( U x − U y ) 2 + ( U y − U z ) 2 + ( U x − U z ) 2 ] 3 \text{solution:} U = \dfrac{U^x+U^y+U^z \pm \sqrt{3/F^2-[(U^x-U^y)^2+(U^y-U^z)^2+(U^x-U^z)^2]}}{3} solution:U=3Ux+Uy+Uz±3/F2[(UxUy)2+(UyUz)2+(UxUz)2]
    显然负号解得舍弃,因为肯定不满足不等号条件。
    接下来需要导出正号解需要满足的条件,即 U > U x U>U^x U>Ux.
    求解可得:
    ( U x − U y ) 2 + ( U x − U z ) 2 < 1 / F 2 (U^x-U^y)^2+(U^x-U^z)^2 < 1 / F^2 (UxUy)2+(UxUz)2<1/F2
    max ( U x , U y , U z ) = U y \text{max}(U^x, U^y, U^z)=U^y max(Ux,Uy,Uz)=Uy,该关系为
    ( U y − U x ) 2 + ( U y − U z ) 2 < 1 / F 2 (U^y-U^x)^2+(U^y-U^z)^2 < 1 / F^2 (UyUx)2+(UyUz)2<1/F2
    max ( U x , U y , U z ) = U z \text{max}(U^x, U^y, U^z)=U^z max(Ux,Uy,Uz)=Uz,该关系为
    ( U z − U x ) 2 + ( U z − U y ) 2 < 1 / F 2 (U^z-U^x)^2+(U^z-U^y)^2 < 1 / F^2 (UzUx)2+(UzUy)2<1/F2
    可以判断该这些关系满足判别式大于零因为(假设此时最大值为 U x U^x Ux):
    ( U y − U z ) 2 < ( U x − U y ) 2 < ( U x − U y ) 2 + ( U x − U z ) 2 < 1 / F 2 (U^y-U^z)^2 < (U^x-U^y)^2 <(U^x-U^y)^2+(U^x-U^z)^2 < 1 / F^2 (UyUz)2<(UxUy)2<(UxUy)2+(UxUz)2<1/F2
  2. U U U 小于 U x , U y , U z U^x, U^y, U^z Ux,Uy,Uz中的一个,大于另外两个,假设最大值为 U x U^x Ux。这种情况下原方程退化成二维情况。须对 ∣ U y − U z ∣ |U^y-U^z| UyUz的值进行讨论。
    1. ∣ U y − U z ∣ < 1 / F |U^y-U^z| < 1/F UyUz<1/F
      solution: U = U y + U z + 2 / F 2 − ( U y − U z ) 2 2 \text{solution:} U = \dfrac{U^y+U^z + \sqrt{2/F^2-(U^y-U^z)^2}}{2} solution:U=2Uy+Uz+2/F2(UyUz)2
    2. ∣ U y − U z ∣ ⩾ 1 / F |U^y-U^z| \geqslant 1/F UyUz1/F
      solution: U = min ( U y , U z ) + 1 / F \text{solution:} U = \text{min}(U^y,U^z) + 1 / F solution:U=min(Uy,Uz)+1/F
  3. U U U 小于其中两个大于其中一个。这种情况就和2.2一样了,读者可以自行验证为什么一样。

所以现在可以重新整理条件:
假设 U x , U y , U z U^x, U^y, U^z Ux,Uy,Uz按降序排列
if ( U x − U y ) 2 + ( U x − U z ) 2 < 1 / F 2 (U^x-U^y)^2+(U^x-U^z)^2 < 1 / F^2 (UxUy)2+(UxUz)2<1/F2,
U = U x + U y + U z ± 3 / F 2 − [ ( U x − U y ) 2 + ( U y − U z ) 2 + ( U x − U z ) 2 ] 3 U = \dfrac{U^x+U^y+U^z \pm \sqrt{3/F^2-[(U^x-U^y)^2+(U^y-U^z)^2+(U^x-U^z)^2]}}{3} U=3Ux+Uy+Uz±3/F2[(UxUy)2+(UyUz)2+(UxUz)2]
else if ( U x − U y ) 2 + ( U x − U z ) 2 ⩾ 1 / F 2 (U^x-U^y)^2+(U^x-U^z)^2 \geqslant 1 / F^2 (UxUy)2+(UxUz)21/F2 and ∣ U y − U z ∣ < 1 / F |U^y-U^z| < 1/F UyUz<1/F
U = U y + U z + 2 / F 2 − ( U y − U z ) 2 2 U = \dfrac{U^y+U^z + \sqrt{2/F^2-(U^y-U^z)^2}}{2} U=2Uy+Uz+2/F2(UyUz)2
else
U = min ( U x , U y , U z ) + 1 / F U = \text{min}(U^x, U^y,U^z) + 1 / F U=min(Ux,Uy,Uz)+1/F

目前自己也还没弄清楚为什么第一种情况和第二种情况的解不连续,可能哪个计算过程中除出了错误吧。

Acknowledgement

最后不得不膜拜一波Stanley Osher大佬。
如果有误欢迎读者更改。

你可能感兴趣的:(3D 快速行进算法(Fast Marching Method in 3D case))