python 常微分方程 画向量场_千里积于跬步——流,向量场,和微分方程[转载]...

在很多不同的科学领域里面,对于运动或者变化的描述和建模,都具有非常根本性的地位——我个人认为,在计算机视觉里面,这也是非常重要的。

什么是“流”?

在我接触过的各种数学体系中,对于运动和变化的描述,我感觉最为适合的有两种不同的perspective:流和变换群。前者以被作用的对象为中心,运动就是这个东西随时间变化的函数;后者以变换本身为中心,研究的是各种变换所组成的空间的代数和拓扑结构。我想,相对来说,前者对于多数人而言似乎更为直观。在这篇文章里,就以“流”(Flow)的角度展开了。其实,这两种思路有着根本的联系——这种联系体现在李群论的一个基础概念——李群作用(Lie Group Action),以及由它所延伸出来的丰富的理论。

流(Flow)是什么呢?很通俗的说,表示了一种运动规则。给定一个点的初始位置$x$,让它运动一段时间$t$,那么之后到达另一个位置$y$,那么$y$就是初始位置$x$和运动时间$t$的函数:

\[y = S( t, x )\]

这个函数$S$,如果符合一些合理的性质,就叫做一个流(Flow)。学过微分几何的同学可能会觉得这个定义与数学中的严格定义有点差距——确实如此。在微分几何中,流的概念需要建立在流形和单参数子群或者积分曲线的基础上,在一篇Blog文章中很难按照这样的方式阐述。只好在一定程度上放弃严密性,从直观出发,希望能传递出最基本的思想。

我们想想,一个合理的运动函数应该具有什么性质呢?我想,最起码应该有三点:运动是连续的。物理学告诉我们,现实中没有所谓的“瞬间转移”。在上面的式子中,如果固定$x$,那么$y( t ) = S(t, x)$ 就是这个初始位置在$x$的点的运动过程。在数学上,没有“瞬间转移”就是说对于任何$x$,它的运动过程$y(t)$都是连续的。

变形是连续的。现在假设我们不考虑一个点,而是考虑一个物体。那么,本来是邻居的点,后来还是邻居——严格一点,在拓扑学上就是说,$x$和它的一个邻域各自都运动了时间 $t$,那么运动后,这个邻域关系还是保持的——这等价于不改变这个物体的拓扑结构(比如,不把它撕开,但是连续变形是肯定允许的)。当然,在现实中物体被撕开不是没有可能,但是这会导致拓扑结构的改变,这就不是一般的数学工具所用表达的了。

时间上的一致性。简单的说,如果我先让它运动时间$t_1$,在运动时间$t_2$,那么和让它运动时间$(t1 + t2)$是一样的。用上面这个表达式写,就是:$S(t_2,  S( t_1, x) ) = S(t_2 + t_1, x)$。这个性质在物理上似乎理所当然,但是在数学上,你随便给一个二元函数$S$,可就未必符合这个属性了。这个规定保证了,我们定义出来的$S$最起码在物理上不会出现错乱。但是,它的意义不止于此,后面我们会看到,它在代数上,表示了一个群同构映射(Group homomorphism)——这种映射在李代数中有着核心作用。

总结起来,$S(x, t)$是对于$x$和$t$的连续函数(实际上,在一般的定义中更严格一些,通常要求$S$是光滑函数,就是无限阶可微的函数。光滑性其实不是很强的条件,我们学过的全部初等函数都是光滑的)。还有就是关于时间的一致性条件。这里特别强调一点,我们允许$t$是可正可负的:时间取负数,就是让这个点沿着原路径倒回去走——怎么来的,就怎么回去。这里面隐含了一个条件:在某一时刻分开的两点是永远走不到一起成为一点的——否则倒回去就不知道往哪走了——这拓扑上,拓扑结构不发生改变就保证了这一点:物体既不能撕开,也不能粘在一起。

流——变换群和运动曲线的统一

python 常微分方程 画向量场_千里积于跬步——流,向量场,和微分方程[转载]..._第1张图片

这个$S(t, x)$呢,可以从两个方面去看,就得到两种不同的理解。首先,固定$t$,

\[T_t ( x ) = S(t, x)\]

它就变成了一个关于$x$的变换函数:把一个点从一个位置变换到时间$t$后的另外一个位置。那么$T_t$ 就是一个变换。然后,不同的时间$t$,对应着一个不同的变换。而且基于时间的一致性,先做$T_{t_1}$变换(走时间$t_1$),再做$T_{t_2}$ 变换(再走时间$t_2$),相当于另一个变换$T_{(t_2 + t_1)}$。数学上就是:$T_{t_2} * T_{t_1}=T_{(t_2 + t_1)}$。如果你对群的概念有基本的了解,这里就可以看出来,从全部的不同时间的$T_t$构成了一个变换群,从$t$ 到$T_t$的映射,就是从实数$R$上的加法群到这个变换群的同构映射。因为$T_t$是由一个参数$t$控制的,有个专门的名词,叫做“单参数群”(one-parameter group)。由于加法群的可交换性,这个单参数变换群也是可交换的——这个可交换性的物理意义很明显: 先走$t_1$,再走$t_2$;还是先走$t_2$,再走$t_1$,是一样的。

因此,我们得到了第一种理解:流,就是连续作用在一个物体上的可交换单参数变换群。(这里所谓“物体”,在数学上有专门的名字“流形”,对于这点我不想展开太多了。)其实,这才是关于流的比较正规的定义。

从另外一个角度上看,固定$x$,我们追踪这一个点的运动,

\[y_x ( t ) = S(t, x)\]

那么$y_x$就是初始位置($t=0$时的位置)为$x$的点的运动过程——也叫做运动曲线(curve) 或者运动轨迹(orbit)。每个点都有自己的运动曲线,所谓流,就是这所有的这些运动曲线的共同体,或者说,流就是由这些运动曲线刻画的——这和我们一些直观的想法是一样的——我们在画画时喜欢在河上画几条曲线来表示流动。

这个函数$S(t, x)$,把变换群和运动曲线同一起来了——它们就是一个东西的两个不同侧面。到这里,我们向我们的目标迈出了第一步——最终,我们是要把变换群和向量场联系在一起——这就是李群和李代数的核心所在。

流与向量场

继续我们的故事。现在,我们有了$y_x( t )$,那么对它求导,我们就可以得到这个点在各个时刻的速度。整个流行就是所有这些曲线的集合,这样,在流形上的每个点,我们都能找到经过它的一条曲线,从而标出这点的速度。(这里强调一点,对于一个给定的流,经过某点的曲线是唯一的,你可以想想为什么?)于是,我们给每个点都赋予了一个速度,这就是“速度场”(velocity field)。每个速度就是曲线上的一个切向量,所以更一般的说,我们把它叫做“向量场”。这里,我们看到,任意一个流都可以通过运动曲线的速度来建立一个对应的向量场。而且可以证明,这个向量场是连续的。

那么反过来呢?我们给定一个连续的向量场,能不能找到一个流和它对应呢?这里面有三个方面(存在性),能不能找到一个流,它的速度场等于给定的向量场。

(唯一性),如果存在,这个流是不是唯一的。

(连续性),这个流$S(t, x)$是不是关于$x$和$t$的连续函数(或者光滑函数)。

这个问题是一个很深刻的问题,它的回答直接联系到一般意义的常微分方程的解的存在性,唯一性,和连续性。答案是,这在局部上是成立的。就是任意一个定义于流形上的向量场,对于流形上的任何一点,总能找到包含它的一个“局部流形”(开子流形),以及定义在这个局部上的流,使得流的速度场和给定的向量场在这个局部相等。简洁一点说,符合条件的流在处处“局部存在”。而且,它们在某种意义上是唯一的,就是两个符合条件的“局部流”,它们在定义域重合的部分是相等的。如果给定向量场是连续(光滑)的话,那么导出的流也是连续(光滑)的。

python 常微分方程 画向量场_千里积于跬步——流,向量场,和微分方程[转载]..._第2张图片

我不打算给出严格的证明,这可以在很多微分流形的相关资料中找到。这里,我希望用一个通俗的过程来介绍,怎么构造出这个流。我们把向量场看成是在一个大地图上标了很多很密的指示牌——告诉你到了这点后应该用多大的速度往什么方向开车。于是,你从某个地方出发,你先看看附近的指示牌,把车子调整到指示的速度和方向,往前开一小段后看到下一个指示,继续调整速度和方向,一直这样下去,你开车的过程就形成了一个运动轨迹,而且在各点上的速度,都和该点的指示一致。设想一个极限过程,指示牌无限密集,开车的人每个时刻都在连续地调节速度,那么就得到了一个和向量场一致的运动曲线。我们上面说过,流是所有这些运动曲线的集体,于是我们从不同的地方开始开车,最后就能把整个流构造出来了。

有些时候,向量场的定义域可能不是很完整,那么车子不能无限开下去(不然可能开出去了),这时候只能给出“局部的流”。如果一个向量场存在一个全局的流,就叫做完备的向量场(Complete Vector Field)。

从这个故事,我们知道一个变换是怎么炼成的:就是按照指示,一步步的做,这些小步积累起来,就形成最后的变换效果。有什么样的指示,就会有什么样的变换。在李群论中,数学家给向量场起了个名字:infinitestimal generator——寓意是,千里变换,生于跬步。数学上,“千里”与“跬步”的关系,就是李群和李代数的联系。

为什么我们不直接描述变换,而言描述生成它的向量场呢?很简单,很多时候全局的演化不容易直接描述,而小步的前进则是很容易把握的。在很多问题中,我们知道“divide and conquer“的策略能够大大简化问题,从变换群到向量场正是这种策略的极限体现。一个简单的例子,比如我们要表示一个不会改变物体大小的变换过程,所谓“不可压缩性”如果用变换矩阵直接表达,那是一个颇为复杂的非线性约束,而如果使用向量场表达,我们只需要把向量场限制在某个有限维子空间里——这就是一个简单得多的线性约束。这样的例子还有很多很多。

和微分方程的联系

最后,我们再回头看看上面这个“从向量场推导流”的问题。我们知道所谓速度场,就是对$t$的导数,所以这个问题,可以写成:

给定向量场$V(x)$,求$S(t, x)$ 使得$dS(t, x) / dt = V(x)$, 并且$S(0, x) = x$

这就是一般意义的常微分方程的初值问题。对这个问题的回答,和对于常微分方程的解得存在性,唯一性和连续性的回答,是联系在一起的。给定一个向量场,就相当于给出一个常微分方程。如果给定$x$, 那么所形成的曲线$y_x ( t )$,就是上述微分方程的解,而流$S(t, x)$就是所有这些解的整体。我们知道微分方程的解通常以积分形式给出,所以上面说的“运动曲线”,在数学上有个正式的学名叫“积分曲线”(Integral curve)。

在物理上,“积分曲线”也是很容易理解的,就是把“速度指示牌”的指示积累起来形成的路径,积分曲线生成的过程就是“积跬步而致千里”的过程。而且,这不仅仅是一种形象思考,在实际问题中微分方程的数值解法正好就是这种过程的最好体现。

你可能感兴趣的:(python,常微分方程,画向量场)