布朗运动

本文最后更新于:2022年7月10日

引言

笔者在热学第三章学习了空间中粒子的扩散公式。若时在空间某处点处积聚了布朗粒子,现以点为原点,某方向作为方向设经过时间的位移在方向上的投影为,显然,。可以证明 其中为气体的黏性系数,为布朗粒子半径,为该布朗粒子在背景气体中的扩散系数。但遗憾的是教材中并没有给出相应的证明,接下来笔者将给出一种证明并进行一定的拓展。

推导

我们希望研究布朗运动的尺度,简单起见,仅考虑某个方向上的投影,比如方向。设布朗粒子的质量为,它受到两个力:一个是随机的冲击力,持续时间极短,彼此之间完全独立;另一个是流体的阻力,其方向与粒子速度相反,大小成正比。因此我们可以列出运动方程

也可以写成 式中。设布朗粒子在时刻位于原点处,我们的目标是研究位移的方差,为此先看的导数: 将(2)式乘以,利用上式可将其化为: 考虑到我们希望研究的是较大时间尺度下的宏观效应,因此取各项的平均: 布朗粒子的无规则运动是分子碰撞的结果,我们可以将它看做一个大分子,它在与分子碰撞的过程中达到热平衡。因此我们可以使用能量均分定理: 此外考虑到冲击力在各个方向上的随机性,所以。上式最后化为: 上式是一个二阶常系数线性非齐次微分方程,接下来求其通解,首先两边同时积分 初始时,所以。通解为: 较大的情况下,可以认为方程的近似解为: 与(1)式相一致。

仿真

在推导出结果后,我又尝试进行仿真,找到了这样一份代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

def random_dir():
direction = {1: (0, 1), 2: (0, -1), 3: (1, 0), 4: (-1, 0)}

xk = (1, 2, 3, 4)
pk = (0.25, 0.25, 0.25, 0.25)

unifdb = stats.rv_discrete(name='unifdb', values=(xk, pk))
return direction[unifdb.rvs()]

def random_walk(n, starting=(0, 0)):
fig, ax = plt.subplots()

Path = mpath.Path
path_data = [(Path.MOVETO, starting)]

l = [starting]
for k in range(n):
l.append(random_dir())
s = tuple([sum(x) for x in zip(*l)])
l = [s]
path_data.append((Path.CURVE4, s))

codes, verts = zip(*path_data)
path = mpath.Path(verts, codes)

x, y = zip(*path.vertices)
line = ax.plot(x, y)
ax.plot(starting[0], starting[1], 'ro')

ax.grid()
plt.gca().set_aspect('equal', adjustable='box')
plt.show()

def normalized_random_walk(N, t, starting=(0, 0)):
fig, ax = plt.subplots()

Path = mpath.Path
path_data = [(Path.MOVETO, starting)]

n = int(N * t)
l = [starting]
for k in range(n):
l.append(tuple(1.0 / np.sqrt(N) * x for x in random_dir()))
s = tuple(sum(x) for x in zip(*l))
l = [s]
path_data.append((Path.CURVE4, s))

l.append(tuple((N * t - n) / np.sqrt(N) * x for x in random_dir()))

path_data.append((Path.CURVE4, tuple(sum(x) for x in zip(*l))))

codes, verts = zip(*path_data)
path = mpath.Path(verts, codes)

x, y = zip(*path.vertices)
line = ax.plot(x, y)
ax.plot(starting[0], starting[1], 'ro')

ax.grid()
plt.gca().set_aspect('equal', adjustable='box')
plt.show()

运行代码后得到了如图所示的结果

扩展

看到模拟的结果后对布朗运动有了直观的认识,我开始好奇如何在数学上处理布朗运动的轨迹,因为它看起来如此粗糙。

通过查阅资料我发现数学家们定义了分形这一概念来描述粗糙的曲线(这一概念来源于曼德勃罗对于英国海岸线长度的研究)。分型概念的实质是局部与整体的自相似性,分形的特征要用“分数维度”来刻画,这里的维度并不是拓扑维度。(实际上分形的严格定义(至少是曼德博的版本)是:“豪斯多夫维数”比“拓扑维数”高的图形。)

为了便于读者理解,我们先讨论非整数维的意义。首先考虑一些规则的几何体,一条直线的长度变为原来的后,质量变为原来的;一个正方形边长变为原来的后,质量变为原来的;正方体同理,质量变为原来的。并且我们发现质量变化取决于它们的维数。实际上这里的质量可以认为是数学上的测度,毕竟我们是在讨论数学上抽象的几何图形,不是实在的物体。 我们再来考虑一个分形——谢尔宾斯基三角形

它的边长变为原来的后,质量变为原来的,那么它的维数为

但是这样的定义只是能让我们有一个直观的认识,它并不通用,因为在上面几个例子中我们对质量的计算依赖于图形完美的自相似性。下面给出一个严谨的定义,假设我们考察的几何对象可以放在维的欧几里得空间里,取许多边长为维小方盒(如时为长度等于的线段,时为边长等于的正方形,时为边长等于的正方体,以此类推),用它们把几何对象完全覆盖起来,令代表所需小方盒的最低数目。维数可用下式来计算: 现在我们来考察布朗粒子轨迹的分形维数。从最简单的情形开始,先讨论一维的布朗运动。绘制轨迹时,是每过一定的时间间隔​记录一次粒子的位置,令代表在时间次的位移记录,在时间内总位移为 平方值为 每次观察到的彼此无关联,因此平均。故 代(1)式,考虑到,我们有 对于同一条布朗粒子的运动轨迹(给定),选取的越短,方均根位移的长度就越小。对比前面给出的分形维数定义,可以看出这里的这里的方均根位移就相当于测量曲线维数的尺度。因此式可改写(3)为 取对数得: 式中是给定的,它不随改变。当,由分形维数定义可得布朗粒子轨迹的维数 这个结果应该如何理解呢?布朗粒子并不径直朝向某个目标行进而是不断徘徊迂回,它的轨迹在一维空间上不断重叠,以至于其维数与平面相等。

接着我们来考察三维的情形,这时我们只需要用位矢代替来描述粒子的位移 每隔一段时间记录记录一次位矢的增量:,在时间内总位移为 平方值为 统计平均,故 由一维情况的推导可知,上式可改写为 取对数,得三维布朗粒子运动轨迹的维数 由此可见,布朗粒子运动轨迹的分形维数与空间维数无关,总等于2。

如果读者希望对分形维度有进一步的了解,可以看看3Blue1Brown的相关视频