PKUWWT

层次集方法讲稿[译]

The Level Set Method - Lecture Notes, copy

作者:Per-Olof Persson

时间: 2005-03-07

曲线和曲面的演化

边界或界面的演化是许多科学和工程问题的一部分。在1988年,Jams A. Sethian和Stanley Osher提出了隐式地表达这些边界,并使用合适的偏微分方程来对它们的传播建模。这些边界由函数$\phi(\mathbf{x})$的层次集(level set)给出,因此他们称这个方法为层次集方法。本讲稿对这个方法进行简要的介绍,更多细节请参考Sethian的书[4]和Osher的书[1],以及他们的原始论文[2]。

设想2维空间中的一个边界曲线或3维空间中的一个边界表面,如图1。我们给定一个速度场$\mathbf{v}$,一般此速度场取决于空间,时间,边界属性(比如法向和曲率),以及对于基于边界形状的物理仿真的间接依赖。现在的目标是为速度场$\mathbf{v}$下的边界演化精确建模。在许多情况下,我们只关心界面的法向运动。我们可以使用一个(标量)速度函数$F$,并将速度表示为$\mathbf{v} = F\mathbf{n}$,其中$\mathbf{n}$是单位法向量。

显式技术

为边界运动建模的一个简单方法是显式地表达,比如(2维情况)用线段连接的沿曲线的结点来表达。我们然后根据速度$\mathbf{v}$来移动这些结点,即求解下面的常微分方程(ODE):

根据速度函数$F$演化的界面

图1:根据速度函数$F$演化的界面

其中$\mathbf{x}^{(i)}$包含了结点$i$的坐标,$\mathbf{v}$是速度函数,$\mathbf{x}_0^{(i)}$是初始结点位置。这个系统可以使用显式时间积分方法精确地求解,比如,前向欧拉或龙格库塔法。

当速度给定为$F\mathbf{n}$时,我们必须在每个结点处估算$\mathbf{n}$。我们可以通过临近结点的中心差分来近似切向矢量,比如

(假定结点之间的距离都为$\Delta s$),并将切线上的法线视为法向。类似的近似可以用于计算其它几何变量,比如曲率。

对于相对于初始界面小的变形情况,显式的方法可能够用了,但是对于一般的运动而言是有诸多缺陷的:

  • 在演化中,结点不再均匀分布,曲线的数值表达形式变得不精确(如图2左)。通过插入或删除结点,我们可以改善表达,但是又会引入错误。
  • 在尖锐拐角处,此方法不会产生所需的”熵解”(如图2中)
  • 拓扑变化时,比如曲线融合,需要特殊处理(如图2右)
  • 对于曲率相关的速度函数$F(\kappa)$,此方法对于小的扰动敏感,除非时间步非常小,否则会导致不稳定现象。

显式技术存在的问题

图2:显式技术存在的问题

隐式几何体

在层次集方法中,界面被隐式地表达为一个函数$\phi(\mathbf{x})=0$的零层次集。注意,$\phi$在所有的$\mathbf{x}$上都有定义,不只是在边界上。为了在计算机上以有限形式表示$\phi$,我们使用背景网格将其离散化。一个通常的选择是简单的笛卡尔坐标网格,而四叉树或八叉树更高效一些。一个离散化的隐式函数如图3所示。

实际的界面可以对每个网格单元进行三线性插值而获得,但是层次集方法的主要哲学思想是界面只应该隐式地在$\phi$上操作。一个例外是用于绘制目的,如下文的重新初始化。

隐式表达的特殊情况是有符号距离函数。它有属性$\vert\nabla\phi\vert = 1$,而在边界的两边具有不同的符号。另外,$\vert\phi(\mathbf{x})\vert$给出了从$\mathbf{x}$到边界$\phi=0$的(最短)距离。层次集方法不要求$\phi$是一个距离函数,但是如果$\phi$在梯度方向变化巨大时数值近似会不精确。因此,我们尽量让$\phi$近似于一个有符号距离函数,方法是频繁的重新初始化(见下文)。

几何变量可以直接从$\phi$中计算得到,而无需提取界面。法向量计算公式是

(因为$\phi$在一个层次集上是常量,因此$\nabla\phi$指向法向方向)。2维空间中一条曲线的曲率为

有符号距离函数$\phi$在笛卡尔网格上的离散化

图3:有符号距离函数$\phi$在笛卡尔网格上的离散化

在3维空间,平均曲率为

而高斯曲率为

而主曲率的计算公式是$\kappa_M\pm\sqrt{\kappa_M^2-\kappa_G}$。

通过使用$\phi$,我们还可以为两个区域($\phi<0$和$\phi>0$)给出不同的表达式。比如,密度

在$\phi<0$时使用值$\rho_1$,而在$\phi>0$时使用值$\rho_2$。在一个离散的网格上,Heaviside函数$\theta(\mathbf{x})$必须用一些方法进行数值近似,比如通过平滑。

层次集方程

使用隐式表达$\phi$,我们可以用速度场$\mathbf{v}$来传播零层次集,方法是解如下传送方程(我们事实上传播了所有的层次集,而不光是$\phi=0$):

对于法向的运动,我们使用(3)并改写速度$\mathbf{v}=F\mathbf{n} = F\nabla\phi/\vert\nabla\phi\vert$。代入(8)并使用$\nabla\phi\cdot\nabla\phi = \vert\nabla\phi\vert^2$,从而得到最终的层次集方程

离散化

传送函数(8)可以使用一阶迎风公式来求解数值解。对于层次集方程(9),使用下面的一阶有限差分近似:

其中

这里的$D^{-x}$是x方向的后向差分算子,$D^{+x}$是前向差分算子,等等。对于曲率相关的作用力$F$,我们使用中心差分近似来取代公式(10)。更多细节和高阶方法,请参考[4]。

重新初始化

$\phi$在一般的速度函数$F$的作用下演化之后,它一般不在是一个有符号距离函数。我们可以重新初始化(reinitialize)$\phi$,即找到(一个新的)$\phi$,具有相同的零层次集,但是$\vert\nabla\phi\vert=1$。Sussman等人[5]提出对重新初始化方程

进行短时积分。这个方程可以用类似于层次集方程的方式进行离散化,而不连续有符号函数在几个网格单元上进行平滑处理。

另一个选项是显式地更新靠近边界的结点,比如通过提取曲线片断并计算与网格结点的距离。对于余下的结点,我们可以使用高效的快速匹配方法(见下文)。

边界值规范化

层次集方程(9)是一个初始值问题,其中我们在时间轴上追踪零层次集$\phi=0$,然后在界面上忽略$\phi$。如果速度函数$F>0$,我们可以转而用一个到达函数$T$来公式化演化过程。

边界演化的边界值公式化。$T(x,y)$表示界面从初始位置到达$(x,y)$的时间

图4:边界演化的边界值公式化。$T(x,y)$表示界面从初始位置到达$(x,y)$的时间

其中$T(\mathbf{x}$给出了界面从初始位置$\Gamma$(如图4)到达$\mathbf{x}$所需的时间。从”时间*速度=距离”这个事实出发,我们可以将边界值问题转化为Eikonal方程:

一个重要的特殊情况是$F=1$,当(14)可以用于计算边界$\Gamma$的距离函数。

快速匹配方法

我们可以将Eikonal方程(14)离散化,方法与层次集方程类似,来获得方程的非线性算术系统

此框架的另一个可能性是

这个表达式稍微简单一些,因为我们沿每个维度要么选择前向差分,要么选择后向差分(决不要都选)。

要想高效地求解(16),我们注意到由$\Gamma$向外前向传播,$T$值高的结点绝不会影响到值小的结点。这就是快速匹配算法(Sethian[3], Tsitsiklis[6])的背后的思想。给定的边界值被视为是”已知值”,其临近结点可以由(16)进行更新,并插入到一个优先队列中。未知值最小的结点会被移除并标记为”已知”,因为它永远不会被其它未知值所影响。它的邻居随后由(16)进行更新,然后插入到队列中。这个过程重复进行,直到所有的结点的值都是”已知”的,在基于堆实现的优先队列中,对于$n$个结点,总的计算开销是$O(n\log n)$次操作。

参考文献

  • [1] Stanley Osher and Ronald Fedkiw. Level set methods and dynamic implicit surfaces, volume 153 of Applied Mathematical Sciences. Springer-Verlag, New York, 2003.
  • [2] Stanley Osher and James A. Sethian. Fronts propagating with curvaturedependent speed: algorithms based on Hamilton-Jacobi formulations. J. Comput. Phys., 79(1):12–49, 1988.
  • [3] James A. Sethian. A fast marching level set method for monotonically advancing fronts. Proc. Nat. Acad. Sci. U.S.A., 93(4):1591–1595, 1996.
  • [4] James A. Sethian. Level set methods and fast marching methods, volume 3 of Cambridge Monographs on Applied and Computational Mathematics. Cambridge University Press, Cambridge, second edition, 1999.
  • [5] Mark Sussman, Peter Smereka, and Stanley Osher. A level set approach for computing solutions to incompressible two-phase flow. J. Comput. Phys., 114(1):146–159, 1994.
  • [6] John N. Tsitsiklis. Efficient algorithms for globally optimal trajectories. IEEE Trans. Automat. Control, 40(9):1528–1538, 1995

python programming visualization GPU scholarship algorithm data linux pdf foxit geometry math OpenGL zip D3 java vim makefile C++ gdb >>>> <<<<


pkg
node.js
bundle
Bunlde node.js app to standalone executable with pkg
2020-04-17 00:00:00 +0000
/programming/2020-04-17-bundle-node-js-app-to-standalone-executable-with-pkg/

	
	
tighervnc
ubuntu
Install tigervnc on Ubuntu18.04
2020-04-06 00:00:00 +0000
/techniques/2020-04-06-install-tigervnc-on-ubuntu-18.04/

	
	
go
qt
Usage of Go binding for Qt
2020-04-05 00:00:00 +0000
/programming/2020-04-05-usage-of-go-binding-for-qt/

	
	
docker
registry
web-UI
Setup a private docker registry v2 with web-ui
2020-04-04 00:00:00 +0000
/techniques/2020-04-04-setup-a-private-docker-registry/

	
	
jenkins
flask
continuous integration testing
docker
python
Continuous Integration Testing For Flask with Jenkins
2020-03-16 00:00:00 +0000
/programming/2020-03-16-jenkins-continuous-integration-testing-for-flask/

	
	
android
python
functional testing
uiautomator
Python-based ui-automator for Android
2020-03-15 00:00:00 +0000
/programming/2020-03-15-android-ui-automator-python/

	
	
sqlite3
linux
How to show Sqlite3 output as Man page table
2020-03-14 00:00:00 +0000
/techniques/2020-03-14-how-to-show-sqlite3-output-as-man-page-table/

	
	
gis
algorithm
Encoded Polyline Algorithm
2020-03-11 00:00:00 +0000
/programming/2020-03-11-encoded-polyline-algorithm/

	
	
你应该了解的所有wget命令
2015-09-26 00:00:00 +0000
/techniques/2015-09-26-all-the-wget-commands-you-should-know/

	
	
linux
gnome
GNOME 3 Usage
2015-02-17 00:00:00 +0000
/techniques/2015-02-17-gnome3-usage/

	
	
visualization
CFD
Usage of OpenFoam
2015-02-10 00:00:00 +0000
/scholarship/2015-02-10-openfoam-usage/

	
	
Script of converting tikz script to pdf file
2014-11-19 00:00:00 +0000
/techniques/2014-11-19-tikz-to-pdf-script/

	
	
linux
gimp
gimp使用笔记
2014-11-16 00:00:00 +0000
/techniques/2014-11-16-gimp-notes/

	
	
visualization
scholarship
draw critical points classification of planar system using tikz
2014-10-31 00:00:00 +0000
/scholarship/2014-10-31-planar-system-critical-points-with-tikz/

	
	
LaTeX
scholarship
Latex中bibtex的命名
2014-10-29 00:00:00 +0000
/scholarship/2014-10-29-latex-bibtex-author-name/

	
	
python
PyQt
programming
PyQt4 signal and slot Example
2014-10-19 00:00:00 +0000
/programming/2014-10-19-pyqt4-signal-slot-example/

	
	
programming
C++
Null Ostream Class in C++
2014-10-18 00:00:00 +0000
/programming/2014-10-18-cpp-null-ostream/

	
	
第一个GeoGebra应用
2014-10-09 00:00:00 +0000
/math/2014-10-09-first-geogebra-program/

	
	
linux
shell
shell用法集锦
2014-10-07 00:00:00 +0000
/techniques/2014-10-07-bash-notes/

	
	
swim
blog
游泳技术动画
2014-09-30 00:00:00 +0000
/blog/2014-09-30-swimming-animation/

	
	
scholarship
zotero
文献管理工具Zotero
2014-09-27 00:00:00 +0000
/scholarship/2014-09-27-Literature-Management-Software-Zotero/

	
	
programming
lisp
clojure
第一个clojure程序
2014-09-18 00:00:00 +0000
/programming/2014-09-18-the-first-clojure-program/

	
	
visualization
OpenGL
OpenGL使用技巧
2014-08-27 00:00:00 +0000
/scholarship/2014-08-27-opengl-utility/

	
	
python
crawler
用python来扒网页
2014-08-23 00:00:00 +0000
/programming/2014-08-23-web-scrap-with-python/

	
	
programming
Unicode
中文转码工具
2014-08-23 00:00:00 +0000
/programming/2014-08-23-unicode-conversion/

	
	
vim使用笔记
2014-08-22 00:00:00 +0000
/techniques/2014-08-22-vim-notes/

	
	
ImageMagick使用笔记
2014-08-21 00:00:00 +0000
/techniques/2014-08-21-ImageMagick-notes/

	
	
programming
C++
C++中打印指针
2014-08-17 00:00:00 +0000
/programming/2014-08-17-std-ostream-output-pointer-in-cplusplus/

	
	
programming
gdb
gdb笔记
2014-08-16 00:00:00 +0000
/programming/2014-08-16-gdb-notes/

	
	
programming
bit操作
2014-08-16 00:00:00 +0000
/programming/2014-08-16-bit-operation/

	
	
programming
C++
C++使用笔记
2014-08-12 00:00:00 +0000
/programming/2014-08-12-cpp-usage/

	
	
geometry
programming
python
平面三角形求交测试(Planar Triangles Intersection)
2014-08-07 00:00:00 +0000
/programming/2014-08-07-triangle-intersect/

	
	
vim
makefile
Makefile模板
2014-08-06 00:00:00 +0000
/techniques/2014-08-06-makefile-template/

	
	
programming
java
Java Usage
2014-08-03 00:00:00 +0000
/programming/2014-08-03-java-usage/

	
	
wxMaxima连不上maxima
2014-08-01 00:00:00 +0000
/techniques/2014-08-01-wxmaxima-not-connected-to-maxima/

	
	
用djvulibre将png图片转化为pdf
2014-07-27 00:00:00 +0000
/techniques/2014-07-27-convert-png-images-to-pdf-with-djvulibre/

	
	
用djvulibre来设置djvu文件的索引
2014-07-26 00:00:00 +0000
/techniques/2014-07-26-djvulibre-reset-outline/

	
	
python
programming
python的profile工具
2014-07-24 00:00:00 +0000
/programming/2014-07-24-python-profile/

	
	
隐函数定理
2014-07-22 00:00:00 +0000
/math/2014-07-22-Implicit-Function-Theorem/

	
	
google-chrome浏览器的标题栏字体渲染问题
2014-07-17 00:00:00 +0000
/techniques/2014-07-17-google-chrome-title-bar-font-rendering/

	
	
linux
备份文件Shell脚本
2014-07-14 00:00:00 +0000
/techniques/2014-07-14-linux-backup-shell-script/

	
	
Linux下将多个图像转换为pdf
2014-06-18 00:00:00 +0000
/techniques/2014-06-18-convert-multi-images-to-pdf/

	
	
D3
visualization
D3.js入门资料集锦
2014-05-24 00:00:00 +0000
/scholarship/2014-05-24-d3-js-tutorials/

	
	
linux
zip
python
Linux下zip文件解压乱码问题
2014-05-21 00:00:00 +0000
/techniques/2014-05-21-unzip-gbk-zip-file-in-linux/

	
	
关于Linux下有线网卡不能连接的问题
2014-05-14 00:00:00 +0000
/techniques/2014-05-14-about-r8169-ethernet-driver/

	
	
Linux下用wvdial为3G上网卡拨号
2014-05-04 00:00:00 +0000
/techniques/2014-05-04-3g-connection-with-wvdial/

	
	
algorithm
geometry
两个平面三角形的相交测试
2014-04-29 00:00:00 +0000
/scholarship/2014-04-29-intersections-between-two-2d-triangles/

	
	
使用另一个版本的glibc
2014-04-25 00:00:00 +0000
/techniques/2014-04-25-use-another-glibc-installation/

	
	
LaTeX使用方法集锦
2014-04-19 00:00:00 +0000
/techniques/2014-04-19-latex-usage/

	
	
scholarship
资源网站集锦
2014-04-16 00:00:00 +0000
/scholarship/2014-04-16-good-resource-website/

	
	
python
programming
Python使用问题集锦
2014-04-15 00:00:00 +0000
/programming/2014-04-15-python-usage/

	
	
修复pdf没有嵌入字体的问题
2014-04-07 00:00:00 +0000
/techniques/2014-04-07-repair-pdf-font-embedding-problem/

	
	
visualization
用VTK生成非结构化网格上的矢量场
2014-04-03 00:00:00 +0000
/scholarship/2014-04-03-use-vtk-create-vector-field-on-unstructured-grid/

	
	
algorithm
visualization
geometry
光线-三角形求交测试算法[译]
2014-04-03 00:00:00 +0000
/scholarship/2014-04-03-ray-triangle-intersection-tests-for-dummies/

	
	
OpenGL
python
programming
Python下写OpenGL代码示例
2014-04-03 00:00:00 +0000
/programming/2014-04-03-python-opengl-sample/

	
	
使用tikz绘制函数
2014-03-30 00:00:00 +0000
/techniques/2014-03-30-use-tikz-to-plot-function/

	
	
使用maxima求解非线性方程组
2014-03-21 00:00:00 +0000
/techniques/2014-03-21-use-maxima-to-solve-non-linear-system/

	
	
linux
在Linux下为笔记本添加两指左右滚动功能
2014-03-11 00:00:00 +0000
/techniques/2014-03-11-add-horizontal-two-finger-scroll/

	
	
Linux下常用工具
2014-03-08 00:00:00 +0000
/techniques/2014-03-08-usual-life-linux-tools/

	
	
Linux下使用github
2014-03-08 00:00:00 +0000
/techniques/2014-03-08-how-to-use-github/

	
	
git使用笔记
2014-03-08 00:00:00 +0000
/techniques/2014-03-08-git-usage/

	
	
LaTeX笔记(texlive)
2014-03-06 00:00:00 +0000
/techniques/2014-03-06-latex-notes/

	
	
geometry
visualization
几种基本几何预测
2014-03-01 00:00:00 +0000
/scholarship/2014-03-01-geometric-predicates/

	
	
math
visualization
geometry
单纯复形(Simplicial Complexes)[译]
2014-02-27 00:00:00 +0000
/scholarship/2014-02-27-simplicial-complexes/

	
	
linux
一个用于寻找文件,并便于打开文件的脚本
2014-02-22 00:00:00 +0000
/techniques/2014-02-22-a-script-for-find-and-open-file/

	
	
linux
清理Linux中的不用内存或缓存
2014-02-21 00:00:00 +0000
/techniques/2014-02-21-free-linux-memory/

	
	
visualization
geometry
形状指数(shape index)
2014-02-20 00:00:00 +0000
/scholarship/2014-02-20-shape-index/

	
	
用wget下载C++的手册
2014-02-10 00:00:00 +0000
/techniques/2014-02-10-download-cplusplus-reference/

	
	
linux
pdf
foxit
在Linux下使用wine+foxit
2014-02-08 00:00:00 +0000
/techniques/2014-02-08-using-foxit-in-linux/

	
	
在Bash的输入循环中使用readline和历史记录
2014-02-06 00:00:00 +0000
/techniques/2014-02-06-completion-and-history-in-bash-read-loop/

	
	
visualization
data
可视化数据集
2014-01-07 00:00:00 +0000
/scholarship/2014-01-07-visualization-dataset-collection/

	
	
关于几种窗口系统的透明效果
2014-01-06 00:00:00 +0000
/techniques/2014-01-06-transparent-window/

	
	
使用淘宝提供的Ruby源
2014-01-06 00:00:00 +0000
/techniques/2014-01-06-taobao-gems/

	
	
函数的临界点上的海森(Hessian)矩阵的含义[译]
2013-12-29 00:00:00 +0000
/math/2013-12-29-Meaning-of-the-Hessian-of-a-function-in-a-critical-point/

	
	
algorithm
visualization
层次集方法讲稿[译]
2013-12-25 00:00:00 +0000
/scholarship/2013-12-25-the-level-set-method-lecture-notes/

	
	
visualization
algorithm
层次集方法(Level Set Method) -- 解释[译]
2013-12-24 00:00:00 +0000
/scholarship/2013-12-24-level-set-method-explanation/

	
	
scholarship
微软的学术搜索引擎还是很好用的
2013-12-17 00:00:00 +0000
/scholarship/2013-12-17-academical-search-with-microsoft-search-engine/

	
	
GNU screen 保存会话
2013-12-12 00:00:00 +0000
/techniques/2013-12-12-gnu-screen-save-session/

	
	
GNU Screen--介绍和初学者指南[译]
2013-12-04 00:00:00 +0000
/techniques/2013-12-04-gnu-screen-an-introduction-and-beginners-tutorial/

	
	
visualization
GPU
GPU Gems - 第39章 基于纹理的体绘制技术[译]
2013-12-04 00:00:00 +0000
/scholarship/2013-12-04-gpugems-ch39-texture-based-volume-rendering/

	
	
MathJax使用示例
2013-12-03 00:00:00 +0000
/techniques/2013-12-03-mathjax-example/

	
	
Jekyll中使用MathJax
2013-12-03 00:00:00 +0000
/techniques/2013-12-03-jekyll-using-mathjax/

	
	
visualization
GPU
GPU Gems - 第17章 环境光遮蔽[译]
2013-12-01 00:00:00 +0000
/scholarship/2013-12-01-gpugems-ch17-ambient-occlusion/

	
	
python
programming
python解释器中的自动补全
2013-11-30 00:00:00 +0000
/programming/2013-11-30-python-interpreter-autocomplete/

	
	
Github建站过程
2013-11-29 00:00:00 +0000
/techniques/2013-11-29-build-a-github-website/

	
	
python
programming
最简单的python服务器
2013-11-29 00:00:00 +0000
/programming/2013-11-29-python-simple-server/