偏微分方程计算方法初步

3 小时前

偏微分方程计算方法初步

核心主题:有限差分法、基矢展开法(含 DVR)、B-样条、小波分析、有限元法、复杂边界条件处理


目录

  1. 第一章:偏微分方程的有限差分法
  2. 第二章:二维 Poisson 方程 — 五点差分与矩阵形式
  3. 第三章:边界条件的三类处理
  4. 第四章:傅里叶微分算符与 FFT
  5. 第五章:基矢展开法求微分方程
  6. 第六章:离散变量表示 DVR
  7. 第七章:B-样条展开法
  8. 第八章:小波分析与多小波展开
  9. 第九章:有限元方法 FEM
  10. 第十章:边界条件进阶 — 多极展开、周期性、Twisted
  11. 第十一章:Jacobi 松弛迭代法
  12. 总结与对比

第一章:偏微分方程的有限差分法

💡 物理直觉

偏微分方程(PDE)在物理中无处不在——Poisson 方程描述静电势、引力势;Schrödinger 方程描述量子系统的波函数;扩散方程描述热传导和物质输运。它们共同的特点是多变量 (x, y, z) 通过函数耦合在一起。

说人话:解一维问题就像走钢丝,解二维三维问题就像走钢丝网——你必须同时照顾好所有方向的"约束力"。

从一维到二维的推广

一维有限差分中,二阶导数离散化为:

u(xi)ui+12ui+ui1h2 u''(x_i) \approx \frac{u_{i+1} - 2u_i + u_{i-1}}{h^2}

在二维网格上,点 (xi,yj)(x_i, y_j) 的 Laplace 算子 2=2x2+2y2\nabla^2 = \frac{\partial^2}{\partial x^2} + \frac{\partial^2}{\partial y^2} 变成五点差分

2ui,jui+1,j+ui1,j+ui,j+1+ui,j14ui,jh2 \nabla^2 u\big|_{i,j} \approx \frac{u_{i+1,j} + u_{i-1,j} + u_{i,j+1} + u_{i,j-1} - 4u_{i,j}}{h^2}

五点查分的具体推导:

二维 Laplace 算子是:

2u=2ux2+2uy2 \nabla^2 u = \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2}

在均匀网格上:

xi=x0+ih,yj=y0+jh x_i=x_0+ih,\qquad y_j=y_0+jh

函数值记为:

ui,j=u(xi,yj) u_{i,j}=u(x_i,y_j)

xx 方向二阶导:

2ux2i,jui+1,j2ui,j+ui1,jh2 \frac{\partial^2 u}{\partial x^2}\bigg|_{i,j} \approx \frac{u_{i+1,j}-2u_{i,j}+u_{i-1,j}}{h^2}

yy 方向二阶导:

2uy2i,jui,j+12ui,j+ui,j1h2 \frac{\partial^2 u}{\partial y^2}\bigg|_{i,j} \approx \frac{u_{i,j+1}-2u_{i,j}+u_{i,j-1}}{h^2}

两者相加:

2ui,jui+1,j+ui1,j+ui,j+1+ui,j14ui,jh2 \nabla^2 u\big|_{i,j} \approx \frac{ u_{i+1,j} +u_{i-1,j} +u_{i,j+1} +u_{i,j-1} -4u_{i,j} }{h^2}

这就是二维五点差分格式。

如果 x,y 方向上 网格间距不同

若:

hxhy h_x\neq h_y

则:

2ui,jui+1,j2ui,j+ui1,jhx2+ui,j+12ui,j+ui,j1hy2 \nabla^2 u\big|_{i,j} \approx \frac{u_{i+1,j}-2u_{i,j}+u_{i-1,j}}{h_x^2} + \frac{u_{i,j+1}-2u_{i,j}+u_{i,j-1}}{h_y^2}

整理:

2ui,jui+1,j+ui1,jhx2+ui,j+1+ui,j1hy22(1hx2+1hy2)ui,j \nabla^2 u\big|_{i,j} \approx \frac{u_{i+1,j}+u_{i-1,j}}{h_x^2} + \frac{u_{i,j+1}+u_{i,j-1}}{h_y^2} - 2\left( \frac{1}{h_x^2} + \frac{1}{h_y^2} \right)u_{i,j}

如果 hx=hy=hh_x=h_y=h,就退化为五点公式。

📐 直观理解:一个点要"看"四个邻居

五点公式:

2ui,jui+1,j+ui1,j+ui,j+1+ui,j14ui,jh2 \nabla^{2}u_{i,j} \approx \frac{u_{i+1,j}+u_{i-1,j}+u_{i,j+1}+u_{i,j-1}-4u_{i,j}}{h^{2}}

可以写成:

2ui,j4h2(ui+1,j+ui1,j+ui,j+1+ui,j14ui,j) \nabla^{2}u_{i,j} \approx \frac{4}{h^2}\left(\frac{u_{i+1,j}+u_{i-1,j}+u_{i,j+1}+u_{i,j-1}}{4} -u_{i,j}\right)

也就是说 约等于 邻居的平均值 减去 自身 就是 2\nabla^{2}

所以:

  • 如果 ui,ju_{i,j} 大于周围平均值,Laplace 值偏负;
  • 如果 ui,ju_{i,j} 小于周围平均值,Laplace 值偏正;
  • 如果 ui,ju_{i,j} 等于周围平均值,Laplace 值为零。
            u[i, j+1]
               ↑
u[i-1, j] ← u[i, j] → u[i+1, j]
               ↓
            u[i, j-1]

说人话:在格点上算二阶导数,就是拿上下左右四个邻居的值减去4倍自己,再除以格距平方。这本质上是在问:"我和邻居们的平均值差了多少?"

以此 , 可以解释 调和函数 可以导出的平均值性质:

2u=0ui,j=ui+1,j+ui1,j+ui,j+1+ui,j14 \nabla^{2}u = 0 \Longrightarrow u_{i,j} = \frac{u_{i+1,j}+u_{i-1,j}+u_{i,j+1}+u_{i,j-1}}{4}

即,没有源的时候,一个点的值等于周围“邻居” 的平均值

同理 可以推广到 三维时候的 七点差分(就是看一共六个“邻居”)


第二章:二维 Poisson 方程 — 五点差分与矩阵形式

💡 物理直觉

泊松方程 2u=f\nabla^2 u = -f 的物理意义:给定一个"源"分布 ff(如电荷密度),求它产生的"势" uu(如电势)。五点差分把这个连续问题转化为一个巨大的线性方程组。

4ui,jui+1,jui1,jui,j+1ui,j1=h2fi,j 4u_{i,j} -u_{i+1,j} -u_{i-1,j} -u_{i,j+1} -u_{i,j-1} = h^2 f_{i,j}

重要提醒:两种矩阵约定

这里有一个非常容易混乱的地方。

约定 A:矩阵里面保留 1/h21/h^2

写成:

A=1h2A0 A=\frac{1}{h^2}A_0

其中 A0A_0 的主对角是 44,邻居位置是 1-1

此时右端应该是:

b=f+边界贡献h2 b=f+\frac{\text{边界贡献}}{h^2}

约定 B:整体乘以 h2h^2

写成: $$ A_0\mathbf u=\mathbf b $$ 此时右端是: $$ b=h^2f+\text{边界贡献} $$ 你给的伪代码:

Python

b[k] = f[i][j] * h**2

b[k] += boundary_value

对应的是第二种约定,也就是矩阵中不带 1/h21/h^2

如果矩阵写成: $$ A=\frac1{h^2}A_0 $$ 那么 RHS 就不该写 fh2f h^2,而应该写 ff

具体数值例子:3×3 内部格点

设求解区域内部有 3×3 = 9 个未知格点,边界值已知(Dirichlet 条件)。

步骤 1:把 2D 格点"拉直"成一维向量

设未知函数在格点 (i,j)(i,j) 处的值为 ui,ju_{i,j}。按行(或列)排列:

u=[u1,1,u1,2,u1,3,u2,1,u2,2,u2,3,u3,1,u3,2,u3,3]T \mathbf{u} = [u_{1,1}, u_{1,2}, u_{1,3}, u_{2,1}, u_{2,2}, u_{2,3}, u_{3,1}, u_{3,2}, u_{3,3}]^T

这就是投影转为一维的核心思想——多维问题的本质就是把高维指标压扁成一个长向量。

步骤 2:构建微分算符矩阵 A

A=1h2A0A = \frac{1}{h^2} A_{0}

对内部 3×3 网格,离散 Laplace 算子对应的矩阵为 9×9 分块三对角形式。取 h=1h=1 简化说明:

A=1h2[410100000141010000014001000100410100010141010001014001000100410000010141000001014] A = \frac{1}{h^2} \begin{bmatrix} 4 & -1 & 0 & -1 & 0 & 0 & 0 & 0 & 0 \\ -1 & 4 & -1 & 0 & -1 & 0 & 0 & 0 & 0 \\ 0 & -1 & 4 & 0 & 0 & -1 & 0 & 0 & 0 \\ -1 & 0 & 0 & 4 & -1 & 0 & -1 & 0 & 0 \\ 0 & -1 & 0 & -1 & 4 & -1 & 0 & -1 & 0 \\ 0 & 0 & -1 & 0 & -1 & 4 & 0 & 0 & -1 \\ 0 & 0 & 0 & -1 & 0 & 0 & 4 & -1 & 0 \\ 0 & 0 & 0 & 0 & -1 & 0 & -1 & 4 & -1 \\ 0 & 0 & 0 & 0 & 0 & -1 & 0 & -1 & 4 \end{bmatrix}

说人话:矩阵每行最多 5 个非零元——主对角线是 4(自己),周围的 -1 对应上下左右四个邻居。矩阵是稀疏的、对称的、正定的。这种结构在工程中叫"块三对角"(block tridiagonal)。

步骤 3:边界条件进入右端向量

以左下角附近的内部点 u1,1u_{1,1} 为例。

离散方程:

4u1,1u2,1u0,1u1,2u1,0=h2f1,1 4u_{1,1} -u_{2,1} -u_{0,1} -u_{1,2} -u_{1,0} = h^2f_{1,1}

其中:

  • u2,1u_{2,1}、$u_{1,2}$ 是内部未知量;
  • u0,1u_{0,1}、$u_{1,0}$ 是边界已知量。

把边界已知量移到右端:

4u1,1u2,1u1,2=h2f1,1+u0,1+u1,0 4u_{1,1} -u_{2,1} -u_{1,2} = h^2f_{1,1} + u_{0,1} + u_{1,0}

所以边界值是以正号加到 RHS 上的。

一般规律:

bi,j=h2fi,j+邻居为边界uboundary b_{i,j} = h^2f_{i,j} + \sum_{\text{邻居为边界}} u_{\text{boundary}}

这是在矩阵不带 1/h21/h^2 的约定下。

# 伪代码:构建右端向量并加入边界贡献
for i in range(1, Nx-1):
    for j in range(1, Ny-1):
        k = idx(i, j)  # 2D→1D 映射
        b[k] = f[i][j] * h**2  # 源项
        # 边界贡献
        if i == 1:     b[k] += u[0][j]       # 下边界
        if i == Nx-2:  b[k] += u[Nx-1][j]    # 上边界
        if j == 1:     b[k] += u[i][0]       # 左边界
        if j == Ny-2:  b[k] += u[i][Ny-1]    # 右边界

步骤 4:求解线性方程组 $$ A_{0}\mathbf{u} = \mathbf{b} $$

用 SciPy 稀疏求解器一行搞定:

from scipy.sparse import lil_matrix
from scipy.sparse.linalg import spsolve

# A 为稀疏矩阵,b 为右端向量
u_1d = spsolve(A, b)
u_2d = u_1d.reshape(Nx, Ny)  # 还原为二维

用Kronecker积写二维的Laplace矩阵!

二维矩阵其实可以用一维矩阵拼出来。

一维二阶差分矩阵: $$ TN= \begin{bmatrix} 2 & -1 & 0 & \cdots & 0\ -1 & 2 & -1 & \cdots & 0\ 0 & -1 & 2 & \cdots & 0\ \vdots & \vdots & \vdots & \ddots & -1\ 0 & 0 & 0 & -1 & 2 \end{bmatrix} $$ 对于二维 Poisson: $$ -\nabla^2 = -\partial{xx} -\partial{yy} $$ 离散矩阵可以写成: $$ A= \frac1{h^2} \left( Iy\otimes Tx + Ty\otimes Ix \right) $$ 如果 $Nx=N_y=3$,就会得到你写的 9×99\times 9 块三对角矩阵。

这说明二维 Laplace 算子本质上是两个方向一维 Laplace 算子的张量和。

矩阵性质

对于 Dirichlet 边界条件,二维 Poisson 矩阵满足:

稀疏:每行最多 5 个非零元;

对称

AT=A A^T=A

正定

uTAu>0 \mathbf u^T A\mathbf u>0

只要 u0\mathbf u\neq 0

正定性来自物理能量:

u2dΩ>0 \int |\nabla u|^2\,d\Omega>0

离散后对应:

uTAui,j(uiuj)2 \mathbf u^TA\mathbf u \sim \sum_{\langle i,j\rangle}(u_i-u_j)^2

所以这个矩阵适合用共轭梯度法 CG

📊 矩阵规模与计算代价

网格大小 内部格点数 矩阵维度 非零元素
5×5 3×3=9 9×9 ~45
10×10 8×8=64 64×64 ~320
100×100 98×98=9604 9604×9604 ~48000
N×N (N-2)² (N-2)²×(N-2)² ≈5(N-2)²

⚠️ 关键认识:矩阵维数 = (格点数)²,二维问题的计算量随格点数增长极快。这就是为什么三维问题经常让人绝望——矩阵维度 = (格点数)³ 的平方!

💡 算法思路:高阶差分与精度权衡

可以采用第三章学过的拉格朗日插值法构造更高阶的差分公式(如5点、7点格式)。但在边界处只能退化为低阶格式,否则会用到界外的不存在的格点。

核心矛盾:格点间距越小精度越高,但二维三维很难取很小的间距(存储和计算都爆炸)。因此需要考虑:

  • 对称性降维:利用宇称对称性可以减少一半计算空间
  • 好量子数:量子力学中利用好量子数进行变量分离(如角动量投影)
  • ⚠️ 一旦对称性破缺,计算量增加几个量级

第三章:边界条件的三类处理

PDE 的定解问题 = 控制方程 + 边界条件

边界条件就是"物理系统在边界上被怎么约束"。不给定边界条件,解就不唯一——就像做菜不告诉我锅的温度,我咋知道该用多大火力?

否则解通常不唯一

三类边界条件对比

类型 数学形式 物理含义 数值处理 典型例子
Dirichlet $u\big_{\partial\Omega} = g$ 边界值固定已知 直接代入已知值,减少未知数 转移到RHS 导体表面电势固定
Neumann $\frac{\partial u}{\partial n}\big_{\partial\Omega} = g$ 边界法向导数固定 需对边界点额外离散,增加方程 绝热边界、对称边界、给定通量边界
Mixed/Robin αu+βun=g\alpha u + \beta \frac{\partial u}{\partial n} = g 线性组合指定 同时处理 对流换热边界

Neumann 边界条件的数值处理

Neumann 条件不像 Dirichlet 那样可以直接"削掉"边界格点——因为边界值本身是未知的。要引入额外的差分方程。

例如引入虚格点(ghost point):在边界外对称放一个辅助点,利用中心差分 ui+1ui12h=g\frac{u_{i+1} - u_{i-1}}{2h} = g 来消去虚点。

一维 Neumann 的 虚格点 推导

考虑一维 Poisson:

u(x)=f(x),x[0,L] -u''(x)=f(x),\qquad x\in[0,L]

左边界给 Neumann:

u(0)=g u'(0)=g

x=0x=0 处引入虚点:

x1=h x_{-1}=-h

中心差分近似一阶导数:

u(0)u1u12h u'(0) \approx \frac{u_1-u_{-1}}{2h}

令它等于 gg

u1u12h=g \frac{u_1-u_{-1}}{2h}=g

解出虚点:

u1=u12hg u_{-1}=u_1-2hg

现在在边界点 x0x_0 上离散 PDE:

u(0)=f0 -u''(0)=f_0

二阶导:

u(0)u12u0+u1h2 u''(0) \approx \frac{u_1-2u_0+u_{-1}}{h^2}

所以:

u12u0+u1h2=f0 -\frac{u_1-2u_0+u_{-1}}{h^2}=f_0

代入:

u1=u12hg u_{-1}=u_1-2hg

得到:

u12u0+u12hgh2=f0 -\frac{u_1-2u_0+u_1-2hg}{h^2}=f_0

整理:

2u12u02hgh2=f0 -\frac{2u_1-2u_0-2hg}{h^2}=f_0

因此:

2u02u1h2=f02gh \frac{2u_0-2u_1}{h^2} = f_0-\frac{2g}{h}

这就是 Neumann 边界点对应的离散方程。

如果 g=0g=0,即对称边界:

u(0)=0 u'(0)=0

则:

u1=u1 u_{-1}=u_1

这意味着边界外的虚点是边界内点的镜像。

二维 Neumann 边界

假设左边界 x=0x=0 给:

ux(0,yj)=gj \frac{\partial u}{\partial x}(0,y_j)=g_j

引入虚点 u1,ju_{-1,j},有:

u1,ju1,j2h=gj \frac{u_{1,j}-u_{-1,j}}{2h}=g_j

所以:

u1,j=u1,j2hgj u_{-1,j}=u_{1,j}-2hg_j

如果边界点本身也是未知量 u0,ju_{0,j},则在边界处的 Laplace 方程:

2u=f -\nabla^2u=f

写成:

u1,j+u1,j+u0,j+1+u0,j14u0,jh2=f0,j -\frac{ u_{1,j}+u_{-1,j}+u_{0,j+1}+u_{0,j-1}-4u_{0,j} }{h^2} = f_{0,j}

代入虚点:

u1,j=u1,j2hgj u_{-1,j}=u_{1,j}-2hg_j

得到:

2u1,j2hgj+u0,j+1+u0,j14u0,jh2=f0,j -\frac{ 2u_{1,j} -2hg_j +u_{0,j+1} +u_{0,j-1} -4u_{0,j} }{h^2} = f_{0,j}

这就把虚点消掉了。


Robin 边界条件

Robin 条件:

αu+βun=g \alpha u+\beta\frac{\partial u}{\partial n}=g

例如一维左边界:

αu0+βu(0)=g \alpha u_0+\beta u'(0)=g

用中心差分:

u(0)u1u12h u'(0)\approx \frac{u_1-u_{-1}}{2h}

代入:

αu0+βu1u12h=g \alpha u_0 + \beta\frac{u_1-u_{-1}}{2h} = g

解出虚点:

u1=u12hβ(gαu0) u_{-1} = u_1-\frac{2h}{\beta}(g-\alpha u_0)

即:

u1=u12hgβ+2hαβu0 u_{-1} = u_1-\frac{2hg}{\beta} + \frac{2h\alpha}{\beta}u_0

然后再代回 PDE 的差分方程。

纯Neumann问题的特殊性

如果整个边界都是 Neumann 条件,例如:

2u=f un=g,on Ω -\nabla^2u=f \\ \space \\ \frac{\partial u}{\partial n} = g , on \space \partial \Omega

则解只确定到一个常数。

因为如果 uu 是解,那么:

u+C u+C

也是解。

所以矩阵会有零特征值,不是严格正定。

还需要兼容条件。

由散度定理:

Ω2udΩ=ΩundS \int_\Omega -\nabla^2u\,d\Omega = -\int_{\partial\Omega} \frac{\partial u}{\partial n} \,dS

因为:

2u=f -\nabla^2u=f

所以:

ΩfdΩ=ΩgdS \int_\Omega f\,d\Omega = -\int_{\partial\Omega}g\,dS

如果这个条件不满足,纯 Neumann 问题无解

如果满足,解存在但差一个常数,需要额外固定: $$ \int\Omega u,d\Omega=0 $$ 或指定某一点: $$ u(x0)=0 $$

说人话:Dirichlet 就是"墙的温度给我定死了",Neumann 就是"墙的热流给我定死了"。前者简单(少解几个方程),后者麻烦(多解几个方程)。


第四章:傅里叶微分算符与 FFT

💡 物理直觉

有限差分 就是 在实空间中用邻居差值近似导数

Fourier方法 是在 频率/动量空间 利用:

ddxeikx=ikeikx \frac{d}{dx} e^{ikx} = ik e^{ikx}

在格点空间做微分的"近邻相减",在动量空间就是简单的乘法!

这是所有谱方法的精髓 (微分变成乘法)

离散 Fourier变换 DFT

在周期区间:

xj=jh,j=0,1,,N1 x_j=jh,\qquad j=0,1,\dots,N-1

离散 Fourier 展开:

uj=m=0N1u~meikmxj u_j = \sum_{m=0}^{N-1} \tilde u_m e^{ik_m x_j}

其中波数:

km=2πLm k_m=\frac{2\pi}{L}m

但是 DFT 的频率顺序通常是:

m=0,1,,N2,N2+1,,1 m=0,1,\dots,\frac N2,-\frac N2+1,\dots,-1

在 NumPy 中:

Python
k = 2*np.pi*np.fft.fftfreq(N, d=h)

会自动给出正确频率。

在动量空间,一阶微分就是乘 ikik,二阶微分就是乘 k2-k^2

xik,x2k2 \partial_x \leftrightarrow ik, \qquad \partial_x^2 \leftrightarrow -k^2

逆变换回来,就得到了格点上的微分近似

Fourier 微分矩阵

令 DFT 矩阵为 FF,则:

u~=Fu \tilde{\mathbf u}=F\mathbf u

反变换:

u=F1u~ \mathbf u=F^{-1}\tilde{\mathbf u}

一阶导数在 Fourier 空间是乘 ikik,所以:

u~=diag(ikm)u~ \widetilde{\mathbf u'} = \operatorname{diag}(ik_m)\tilde{\mathbf u}

回到实空间:

u=F1diag(ikm)Fu \mathbf u' = F^{-1}\operatorname{diag}(ik_m)F\mathbf u

因此一阶微分矩阵是:

D(1)=F1diag(ikm)F D^{(1)} = F^{-1}\operatorname{diag}(ik_m)F

二阶微分矩阵:

D(2)=F1diag(km2)F D^{(2)} = F^{-1}\operatorname{diag}(-k_m^2)F

因为:

(ikm)2=km2 (ik_m)^2=-k_m^2

所以:

D(2)=D(1)D(1) D^{(2)} = D^{(1)}D^{(1)}

注意:这个关系在 Fourier 谱方法里严格成立。

普通有限差分中,中心差分的一阶矩阵平方,不一定等于常用的二阶差分矩阵

一阶和二阶微分算符矩阵的关系

Fourier 方法的优雅之处:一阶矩阵 D(1)D^{(1)} 和二阶矩阵 D(2)D^{(2)} 是完全一致的——$D^{(2)} = D^{(1)}D^{(1)}$,即微分和积分互逆。

FFT 的计算效率

上一轮我们推导的傅里叶微分矩阵 D=F1diag(ik)FD=F^{-1}diag(ik)F ,在数学上完美无瑕,但如果直接按这个公式去编程,你的电脑会卡死。这段文字就是在告诉你:FFT 是专门来拯救这个困局的“救世主”

FFT发现了 一个极其简单但有效的规律 : 偶数项和奇数项可以分开算

  • 一个 NN 点的大变换,可以拆成 两个 N/2点的小变换(一个只负责偶数位置,一个只负责奇数位置)。
  • 而这两个 N/2N/2 点的小变换,又可以继续拆成 四个 N/4 点的更小变换……
  • 直到拆成单个点(单个点的傅里叶变换就是它自己)。

这就是“分治(Divide and Conquer)”。 通过这种层层拆分,原本需要把每个格点和每个频率都配对的 N2N2 次运算,变成了只需在每一层(共 log⁡NlogN 层)把结果合并起来(合并时只涉及少量运算)的 Nlog⁡NNlogN 次运算。

方法 时间复杂度 N=1024 时 N=10⁶ 时
DFT 直接求 O(N2)O(N^2) ~10⁶ 次运算 ~10¹² 次运算
FFT O(NlogN)O(N\log N) ~10⁴ 次运算 ~2×10⁷ 次运算

说人话:FFT 把"每个格点和每个动量分量两两配对"的暴力算法,变成了精巧的分治算法。原来 N² 的事现在 N log N 就办完了——当 N 很大时,这个差距是天壤之别。

理论上的 Fourier微分矩阵 虽然是稠密的(计算量巨大)但实际我们从来不显式地去构建这个矩阵。我们直接用FFT代替矩阵乘法,把计算复杂度从“平方级”降为“线性对数级”,从而使得谱方法能够处理 百万级网格的工程问题

🔬 二维 Fourier 微分

二维周期函数:

u(x,y)=kx,kyu~kx,kyei(kxx+kyy) u(x,y) = \sum_{k_x,k_y} \tilde u_{k_x,k_y} e^{i(k_xx+k_yy)}

则:

2u=2ux2+2uy2 \nabla^2u = \frac{\partial^2u}{\partial x^2} + \frac{\partial^2u}{\partial y^2}

在 Fourier 空间变成:

2u^=(kx2+ky2)u~ \widehat{\nabla^2u} = -(k_x^2+k_y^2)\tilde u

所以算法是:

  1. uu 做二维 FFT;
  2. 每个 Fourier 分量乘上 (kx2+ky2)-(k_x^2+k_y^2)
  3. 做逆 FFT。

二维情况使用张量积形式:依次对每行、每列做一维变换。

import numpy as np

def fourier_laplacian_2d(u, hx, hy=None):
    """
    用 FFT 计算二维 Laplace 算子。
    要求周期边界条件。
    """
    if hy is None:
        hy = hx

    Nx, Ny = u.shape

    kx = 2*np.pi*np.fft.fftfreq(Nx, d=hx)
    ky = 2*np.pi*np.fft.fftfreq(Ny, d=hy)

    KX, KY = np.meshgrid(kx, ky, indexing='ij')

    multiplier = -(KX**2 + KY**2)

    u_hat = np.fft.fft2(u)
    lap_hat = multiplier * u_hat

    return np.fft.ifft2(lap_hat).real

🎯 FFT 的应用拓展

Fourier方法 默认周期边界条件!!!

也就是说:

u(0)=u(L) u(0)=u(L)

如果函数不周期,强行用 Fourier 会导致边界跳跃,从而产生 Gibbs 现象。

对于非周期边界,可以用:

  • sine transform:适合 Dirichlet;
  • cosine transform:适合 Neumann;
  • Chebyshev 谱方法:适合有限区间非周期问题。

具体应用:

  • 图像处理:二维 FFT 是 JPEG 压缩、卷积神经网络的基础
  • 信号处理:去噪(低通滤波)、边缘检测(高通滤波)
  • 零填充(zero-padding):平滑处理
  • 共振态展宽:$A(t) = A e^{i\omega t} e^{-\Gamma t/2}$ → 傅里叶变换得到 Lorentz 线形,展宽 Γ\Gamma 对应寿命 τ=1/Γ\tau = 1/\Gamma

用 FFT 解 Poisson 方程

考虑周期边界下:

2u=f -\nabla^2u=f

Fourier 空间:

2u^=(kx2+ky2)u^=f^ -\widehat{\nabla^2u} = (k_x^2+k_y^2)\hat u = \hat f

所以:

u^=f^kx2+ky2 \hat u = \frac{\hat f}{k_x^2+k_y^2}

但当:

kx=ky=0 k_x=k_y=0

分母为零。

这是因为周期 Poisson 方程的解只确定到一个常数。

必须要求:

fdΩ=0 \int f\,d\Omega=0

也就是:

f^0,0=0 \hat f_{0,0}=0

然后可以人为设定:

u^0,0=0 \hat u_{0,0}=0

即选择零平均势。


FFT 与共振展宽

如果一个信号:

A(t)=A0eiω0teΓt/2 A(t)=A_0e^{-i\omega_0t}e^{-\Gamma t/2}

它的 Fourier 变换近似为:

A~(ω)=0A0eiω0teΓt/2eiωtdt \tilde A(\omega) = \int_0^\infty A_0e^{-i\omega_0t}e^{-\Gamma t/2}e^{i\omega t}\,dt

整理指数:

A~(ω)=A00e(Γ2+i(ω0ω))tdt \tilde A(\omega) = A_0 \int_0^\infty e^{-\left(\frac{\Gamma}{2}+i(\omega_0-\omega)\right)t} \,dt

积分:

A~(ω)=A0Γ2+i(ω0ω) \tilde A(\omega) = \frac{A_0} { \frac{\Gamma}{2}+i(\omega_0-\omega) }

谱强度:

A~(ω)2=A02(ωω0)2+(Γ2)2 |\tilde A(\omega)|^2 = \frac{|A_0|^2} { (\omega-\omega_0)^2+\left(\frac{\Gamma}{2}\right)^2 }

这就是 Lorentz 线形。

Γ \Gamma

越大,谱线越宽,寿命越短:

τ1Γ \tau\sim \frac1{\Gamma}

若带 \hbar,则:

τΓ \tau\sim \frac{\hbar}{\Gamma}

第五章:基矢展开法求微分方程

💡 物理直觉

量子力学课上学过:波函数可以在任意一组完备基下展开。计算物理中我们就用这个思路——不是直接在格点上离散,而是把解写成一组合适基函数的线性组合,然后把 PDE 转化为矩阵本征值问题。

基本公式推导

将波函数展开为基矢 ϕj\phi_j 的线性组合:

ψi=jcijϕj \psi_i = \sum_j c_{ij} \phi_j

代入本征方程 Hψ=EψH\psi = E\psi

mHϕmcim=Ejcijϕj \sum_m H \phi_m \, c_{im} = E \sum_j c_{ij} \phi_j

左乘 ϕk\phi_k^* 并积分(投影):

mϕkHϕmcim=Ecik \sum_m \langle \phi_k | H | \phi_m \rangle \, c_{im} = E \, c_{ik}

写成矩阵形式:

[H11H12H1NH21H22H2NHN1HN2HNN][c1c2cN]=E[c1c2cN] \begin{bmatrix} H_{11} & H_{12} & \cdots & H_{1N} \\ H_{21} & H_{22} & \cdots & H_{2N} \\ \vdots & \vdots & \ddots & \vdots \\ H_{N1} & H_{N2} & \cdots & H_{NN} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_N \end{bmatrix} = E \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_N \end{bmatrix}

说人话:本来是一个微分方程,经过"选定基函数→展开→投影→积分"这一套,变成了一个矩阵对角化问题。这就是Ritz 变分法的数值实现。

对于基态能量,有限基截断给出的能量通常是上界:

E0(N)E0 E_0^{(N)}\ge E_0

随着基函数数目增大:

E0(N)E0 E_0^{(N)}\to E_0

实际应用:三维谐振子基矢

3D 笛卡尔谐振子基

三维笛卡尔谐振子基:

ϕnxnynz(x,y,z)=ϕnx(x)ϕny(y)ϕnz(z) \phi_{n_xn_yn_z}(x,y,z) = \phi_{n_x}(x) \phi_{n_y}(y) \phi_{n_z}(z)

其中一维谐振子基函数:

ϕn(x)=NnHn(ξ)eξ2/2 \phi_n(x) = N_n H_n(\xi)e^{-\xi^2/2}

HnH_n 是 Hermite 多项式,$b$ 是振子长度参数。

总壳层量子数:

N=nx+ny+nz N=n_x+n_y+n_z

如果截断到:

NNmax N\le N_{\max}

则基函数数目是:

N=0Nmax(N+1)(N+2)2=(Nmax+1)(Nmax+2)(Nmax+3)6 \sum_{N=0}^{N_{\max}} \frac{(N+1)(N+2)}{2} = \frac{(N_{\max}+1)(N_{\max}+2)(N_{\max}+3)}{6}

这个数目随着 NmaxN_{\max} 迅速增长。

轴对称体系(柱坐标)

对于轴对称系统,通常用柱坐标:

(ρ,φ,z) (\rho,\varphi,z)

基函数可以分离为:

Φ(ρ,φ,z,σ)=Rnrm(ρ)eimφZnz(z)χσ \Phi(\rho,\varphi,z,\sigma) = R_{n_r}^{|m|}(\rho) e^{im\varphi} Z_{n_z}(z) \chi_\sigma

其中:

  • Znz(z)Z_{n_z}(z):Hermite 基;
  • Rnrm(ρ)R_{n_r}^{|m|}(\rho):associated Laguerre 基;
  • eimφe^{im\varphi}:角向部分;
  • χσ\chi_\sigma:自旋部分。

常用截断:

N=2nr+nz+m N=2n_r+n_z+|m|

保留:

NNmax N\le N_{\max}

好量子数为什么能降维?

如果 Hamiltonian 和某个算符对易: $$ [H,\hat Q]=0 $$ 那么 Q^\hat Q 的本征值就是好量子数。

例如轴对称情况下,角动量 zz 分量 mm 可能守恒。

于是不同 mm 的态不会耦合。

Hamiltonian 矩阵可以分块: $$ H= \begin{bmatrix} H{m=0} & 0 & 0\ 0 & H{m=1} & 0\ 0 & 0 & H_{m=2} \end{bmatrix} $$ 原来需要对角化一个巨大矩阵,现在可以分别对角化很多小矩阵。

这就是利用对称性降维的核心。

一旦对称性破缺,原本的块之间开始耦合,矩阵规模会暴涨。

💡 关键认识

  • 基函数自带边界条件:不像有限差分需要显式处理边界,基函的选择就已隐含了边界行为(如谐振子基在无穷远处指数衰减)
  • 微分可解析计算:谐振子基的微分有解析表达式,不需要数值近似
  • 截断误差:基函数个数 N 有限,所以是近似方法。N 越大越精确
  • 适用场景:形状规则的束缚态问题效果极好;复杂形状或连续谱则不够精确

流程对比

都是把无限维问题 最后 变成 有限维问题

有限差分法:  格点离散 → 差分近似微分 → 矩阵方程求解 (在格点上表示函数)
基矢展开法:  选基函数 → 计算矩阵元 → 矩阵对角化 (用系数表示函数)
对比维度 基空间(基矢展开) 格点空间(有限差分)
灵活性 高,可选最优基 低,受网格限制
计算效率 高,矩阵小 低,矩阵巨大
精度 对特定问题优秀 普适性强
边界处理 隐式(基函数自带) 显式(需额外处理)
实施难度 需选择合适的基 相对简单直接

第六章:离散变量表示 DVR

💡 物理直觉

DVR(Discrete Variable Representation)是一种同时兼具基空间和格点空间优点的表示方法。它让你"吃着碗里的看着锅里的"——基函数保证了完备性,而格点表示让矩阵元计算极其简单。

核心:动能像基空间一样可以精确/解析处理,势能像格点空间一样近似对角。

DVR 的核心思想

给定一组正交基函数 ϕn(x)\phi_n(x) 和高斯积分点(gauge points)${x_\alpha}$:

  1. 用这组基构造投影算符 P
  2. 在格点 {xα}\{x_\alpha\} 上定义 DVR 基函数:$f\alpha(x)$,满足 $f\alpha(x\beta) = \delta{\alpha\beta}$(在自家格点为 1,别家格点为 0)
  3. 关键性质:
    • 动能矩阵元:有解析表达式,计算简单
    • 势能矩阵元:对角!$V{\alpha\beta} \approx V(x\alpha)\delta_{\alpha\beta}$

例子

均匀格点上常用 sinc-DVR。

假设区间长度为 LL,格点数为 NN,格距:

Δx=LN \Delta x=\frac{L}{N}

对于无限 sinc-DVR,常见二阶导数矩阵是:

(d2dx2)ij={π23Δx2,i=j2(1)ijΔx2(ij)2,ij \left(\frac{d^2}{dx^2}\right)_{ij} = \begin{cases} -\dfrac{\pi^2}{3\Delta x^2}, & i=j\\[8pt] -\dfrac{2(-1)^{i-j}}{\Delta x^2(i-j)^2}, & i\neq j \end{cases}

于是动能:

T=22md2dx2 T=-\frac{\hbar^2}{2m}\frac{d^2}{dx^2}

对应:

Tij=22m{π23Δx2,i=j2(1)ijΔx2(ij)2,ij T_{ij} = \frac{\hbar^2}{2m} \begin{cases} \dfrac{\pi^2}{3\Delta x^2}, & i=j\\[8pt] \dfrac{2(-1)^{i-j}}{\Delta x^2(i-j)^2}, & i\neq j \end{cases}

周期 sinc-DVR 或 Fourier-DVR 的公式会略有不同,比如会出现:

sin2(π(ij)N) \sin^2\left(\frac{\pi(i-j)}{N}\right)

这正是你代码里的结构。

需要注意:

不同文献里 TT、$-d^2/dx^2$、$-\frac12d^2/dx^2$ 的定义可能不同,所以符号和系数要仔细核对。

# DVR 动能矩阵元的典型计算框架
# 以 sinc-DVR 为例(均匀格点)
def dvr_kinetic_1d(N, L):
    """一维 sinc-DVR 动能矩阵,区间 [-L/2, L/2]"""
    dx = L / N
    T = np.zeros((N, N))
    for i in range(N):
        for j in range(N):
            if i == j:
                T[i, j] = np.pi**2 / (6 * dx**2) * (1 + 2/N**2)
            else:
                d = i - j
                T[i, j] = (-1)**d / (dx**2 * np.sin(np.pi * d / N)**2)
    return T

从 FBR(有限基表示) 到 DVR

给定正交基函数:

ϕn(x),n=0,1,,N1 \phi_n(x),\qquad n=0,1,\dots,N-1

定义投影算符:

P=n=0N1ϕnϕn P=\sum_{n=0}^{N-1}|\phi_n\rangle\langle \phi_n|

这个投影算符的意思是: 我们只在这 NN 个基函数张成的有限维空间里面近似真实波函数。


选择高斯积分点和权重

选一组积分点:

xα,α=0,1,,N1 x_\alpha,\qquad \alpha=0,1,\dots,N-1

以及对应权重:

wα w_\alpha

满足高斯积分近似:

f(x)dxα=0N1wαf(xα) \int f(x)\,dx \approx \sum_{\alpha=0}^{N-1} w_\alpha f(x_\alpha)

你讲义里写的是 gauge points,更准确地说一般叫:

quadrature points \text{quadrature points}

或者:

DVR grid points \text{DVR grid points}

如果这组点和权重选得好,那么对于基函数乘积:

ϕm(x)ϕn(x)dx \int \phi_m^*(x)\phi_n(x)\,dx

可以用求和精确或高精度表示:

ϕm(x)ϕn(x)dxα=0N1wαϕm(xα)ϕn(xα)=δmn \int \phi_m^*(x)\phi_n(x)\,dx \approx \sum_{\alpha=0}^{N-1} w_\alpha \phi_m^*(x_\alpha)\phi_n(x_\alpha) = \delta_{mn}

DVR 变换矩阵

定义矩阵:

Unα=wαϕn(xα) U_{n\alpha}=\sqrt{w_\alpha}\phi_n(x_\alpha)

这里:

  • nn:基函数指标;
  • α\alpha:格点指标。

因为:

αwαϕm(xα)ϕn(xα)δmn \sum_\alpha w_\alpha \phi_m^*(x_\alpha)\phi_n(x_\alpha) \approx \delta_{mn}

所以:

αUmαUnα=δmn \sum_\alpha U_{m\alpha}^*U_{n\alpha} = \delta_{mn}

也就是:

UUI UU^\dagger \approx I

在理想情况下,$U$ 是酉矩阵或正交矩阵。


DVR 基函数的构造

DVR 基函数定义为:

χα=n=0N1Unαϕn |\chi_\alpha\rangle = \sum_{n=0}^{N-1} U_{n\alpha}^* |\phi_n\rangle

如果基函数都是实函数,可以省略复共轭:

χα=n=0N1Unαϕn |\chi_\alpha\rangle = \sum_{n=0}^{N-1} U_{n\alpha} |\phi_n\rangle

写成坐标形式:

χα(x)=n=0N1wαϕn(xα)ϕn(x) \chi_\alpha(x) = \sum_{n=0}^{N-1} \sqrt{w_\alpha}\phi_n(x_\alpha)\phi_n(x)

这个 χα(x)\chi_\alpha(x) 就是 DVR 基函数。


DVR 基函数为什么具有“插值性”?

我们希望它满足类似:

fα(xβ)=δαβ f_\alpha(x_\beta)=\delta_{\alpha\beta}

也就是:

  • 在自己的格点上为 1;
  • 在别人的格点上为 0。

来推导。

在格点 xβx_\beta 处:

χα(xβ)=nwαϕn(xα)ϕn(xβ) \chi_\alpha(x_\beta) = \sum_n \sqrt{w_\alpha} \phi_n(x_\alpha) \phi_n(x_\beta)

利用矩阵 UU 的正交性:

nUnαUnβ=δαβ \sum_n U_{n\alpha}U_{n\beta} = \delta_{\alpha\beta}

代入:

Unα=wαϕn(xα) U_{n\alpha} = \sqrt{w_\alpha}\phi_n(x_\alpha)

所以:

nwαϕn(xα)wβϕn(xβ)=δαβ \sum_n \sqrt{w_\alpha}\phi_n(x_\alpha) \sqrt{w_\beta}\phi_n(x_\beta) = \delta_{\alpha\beta}

两边除以 wβ\sqrt{w_\beta}

nwαϕn(xα)ϕn(xβ)=δαβwβ \sum_n \sqrt{w_\alpha}\phi_n(x_\alpha) \phi_n(x_\beta) = \frac{\delta_{\alpha\beta}}{\sqrt{w_\beta}}

左边正是 χα(xβ)\chi_\alpha(x_\beta)

因此:

χα(xβ)=δαβwβ \chi_\alpha(x_\beta) = \frac{\delta_{\alpha\beta}}{\sqrt{w_\beta}}

如果重新定义归一化后的 DVR cardinal 函数:

fα(x)=wαχα(x) f_\alpha(x)=\sqrt{w_\alpha}\chi_\alpha(x)

那么:

fα(xβ)=wαδαβwβ f_\alpha(x_\beta) = \sqrt{w_\alpha} \frac{\delta_{\alpha\beta}}{\sqrt{w_\beta}}

α=β\alpha=\beta 时:

fα(xα)=1 f_\alpha(x_\alpha)=1

αβ\alpha\neq\beta 时:

fα(xβ)=0 f_\alpha(x_\beta)=0

所以:

fα(xβ)=δαβ \boxed{ f_\alpha(x_\beta)=\delta_{\alpha\beta} }

这就是 DVR 的核心插值性质。


势能矩阵为什么近似对角?

考虑势能矩阵:

VαβDVR=χαVχβ V_{\alpha\beta}^{\text{DVR}} = \langle \chi_\alpha|V|\chi_\beta\rangle

写成积分:

Vαβ=χα(x)V(x)χβ(x)dx V_{\alpha\beta} = \int \chi_\alpha^*(x)V(x)\chi_\beta(x)\,dx

用高斯积分近似:

Vαβγwγχα(xγ)V(xγ)χβ(xγ) V_{\alpha\beta} \approx \sum_\gamma w_\gamma \chi_\alpha^*(x_\gamma) V(x_\gamma) \chi_\beta(x_\gamma)

利用:

χα(xγ)=δαγwγ \chi_\alpha(x_\gamma) = \frac{\delta_{\alpha\gamma}}{\sqrt{w_\gamma}}

以及:

χβ(xγ)=δβγwγ \chi_\beta(x_\gamma) = \frac{\delta_{\beta\gamma}}{\sqrt{w_\gamma}}

代入:

Vαβγwγ(δαγwγ)V(xγ)(δβγwγ) V_{\alpha\beta} \approx \sum_\gamma w_\gamma \left( \frac{\delta_{\alpha\gamma}}{\sqrt{w_\gamma}} \right) V(x_\gamma) \left( \frac{\delta_{\beta\gamma}}{\sqrt{w_\gamma}} \right)

整理:

VαβγδαγδβγV(xγ) V_{\alpha\beta} \approx \sum_\gamma \delta_{\alpha\gamma}\delta_{\beta\gamma} V(x_\gamma)

只有当:

α=β=γ \alpha=\beta=\gamma

时有贡献。

所以:

VαβDVRV(xα)δαβ \boxed{ V_{\alpha\beta}^{\text{DVR}} \approx V(x_\alpha)\delta_{\alpha\beta} }

这就是 DVR 最重要的结果。

势能矩阵不需要做复杂积分,直接取格点上的势能值


动能矩阵如何处理?

动能算符为:

T=22md2dx2 T=-\frac{\hbar^2}{2m}\frac{d^2}{dx^2}

在 FBR 中,动能矩阵是:

TmnFBR=ϕm22md2dx2ϕn T_{mn}^{\text{FBR}} = \left\langle \phi_m \left| -\frac{\hbar^2}{2m}\frac{d^2}{dx^2} \right| \phi_n \right\rangle

这通常可以解析算出,或者用高精度积分算出。

然后用变换矩阵 UU 变到 DVR:

TDVR=UTFBRU T^{\text{DVR}} = U^\dagger T^{\text{FBR}}U

即:

TαβDVR=m,nUmαTmnFBRUnβ T_{\alpha\beta}^{\text{DVR}} = \sum_{m,n} U_{m\alpha}^* T_{mn}^{\text{FBR}} U_{n\beta}

所以 Hamiltonian 矩阵变成:

HαβDVR=TαβDVR+V(xα)δαβ H_{\alpha\beta}^{\text{DVR}} = T_{\alpha\beta}^{\text{DVR}} + V(x_\alpha)\delta_{\alpha\beta}

最终求解:

Hψ=Eψ \boxed{ H\mathbf \psi=E\mathbf \psi }

DVR 的优势

特性 传统基展开 DVR
动能矩阵 需积分 解析公式/积分
势能矩阵 需积分 对角(格点上的值)
收敛性 一般 优秀(指数收敛)
推广到多维 计算量大 自然推广

📚 代表性工作

A. Bulgac and M.M. Forbes, Phys. Rev. C 87, 051301(R) (2013) — DVR 方法在核物理中的应用典范。

第七章:B-样条展开法

💡 物理直觉

有限差分用均匀格点,但有些地方(如原子核附近)波函数剧烈变化,有些地方(远离核)变化平缓。为什么不能"哪里变化快就多放格点,哪里变化慢就少放格点"?B-样条就是用来干这个的——它支持非均匀格点

B-样条的定义

M 阶 B-样条 BiM(x)B_i^M(x) 是在节点序列 {xi,xi+1,,xi+M}\{x_i, x_{i+1}, \dots, x_{i+M}\} 上由递推关系构造的分段多项式。在计算物理中常用的性质:

  • 紧支撑:只在 M 个区间上非零
  • 构成完备基
  • 微分有解析递推公式
  • 节点可以任意分布(边界加密!)

MM:B-样条的阶数;

多项式次数为:

p=M1 p=M-1

例如:

  • M=1M=1:分段常数;
  • M=2M=2:分段线性;
  • M=3M=3:分段二次;
  • M=4M=4:分段三次 cubic spline。

一阶 B-样条定义为:

Bi1(x)={1,tix<ti+10,otherwise B_i^1(x) = \begin{cases} 1, & t_i\le x<t_{i+1}\\ 0, & \text{otherwise} \end{cases}

高阶通过递推构造:

BiM(x)=xtiti+M1tiBiM1(x)+ti+Mxti+Mti+1Bi+1M1(x) B_i^M(x) = \frac{x-t_i}{t_{i+M-1}-t_i}B_i^{M-1}(x) + \frac{t_{i+M}-x}{t_{i+M}-t_{i+1}}B_{i+1}^{M-1}(x)

如果分母为零,则对应项定义为零。

由递推关系可以看出:

BiM(x) B_i^M(x)

只在区间:

[ti,ti+M] [t_i,t_{i+M}]

上非零。

所以它是紧支撑的。

紧支撑意味着矩阵是稀疏/带状的。

如果两个 B-样条支撑区间不重叠,那么:

BiM(x)BjM(x)dx=0 \int B_i^M(x)B_j^M(x)\,dx=0

因此重叠矩阵和 Hamiltonian 矩阵都是带状矩阵。

用 B-样条求解一维 Schrödinger 方程

考虑一维定态 Schrödinger 方程:

[22md2dx2+V(x)]ψ(x)=Eψ(x) \left[ -\frac{\hbar^2}{2m}\frac{d^2}{dx^2} + V(x) \right]\psi(x) = E\psi(x)

将波函数展开:

ψ(x)=jcjBjM(x) \psi(x) = \sum_j c_j B_j^M(x)

代入方程:

[22md2dx2+V(x)]jcjBjM(x)=EjcjBjM(x) \left[ -\frac{\hbar^2}{2m}\frac{d^2}{dx^2} + V(x) \right] \sum_j c_jB_j^M(x) = E\sum_j c_jB_j^M(x)

利用线性性:

jcj[22md2BjMdx2+V(x)BjM(x)]=EjcjBjM(x) \sum_j c_j \left[ -\frac{\hbar^2}{2m}\frac{d^2B_j^M}{dx^2} + V(x)B_j^M(x) \right] = E\sum_jc_jB_j^M(x)

左乘测试函数 BiM(x)B_i^M(x),并积分:

BiM(x)jcj[22md2BjMdx2+V(x)BjM(x)]dx=EBiM(x)jcjBjM(x)dx \int B_i^M(x) \sum_j c_j \left[ -\frac{\hbar^2}{2m}\frac{d^2B_j^M}{dx^2} + V(x)B_j^M(x) \right]dx = E \int B_i^M(x) \sum_jc_jB_j^M(x)dx

交换求和与积分:

jcjBiM[22md2BjMdx2+VBjM]dx=EjcjBiMBjMdx \sum_jc_j \int B_i^M \left[ -\frac{\hbar^2}{2m}\frac{d^2B_j^M}{dx^2} + V B_j^M \right]dx = E\sum_jc_j \int B_i^M B_j^M dx

定义:

Hij=BiM[22md2dx2+V]BjMdx H_{ij} = \int B_i^M \left[ -\frac{\hbar^2}{2m}\frac{d^2}{dx^2} + V \right] B_j^M dx

以及重叠矩阵:

Sij=BiM(x)BjM(x)dx S_{ij}= \int B_i^M(x)B_j^M(x)\,dx

于是:

Hc=ESc \boxed{ H\mathbf c=ES\mathbf c }

这是广义本征值问题。

动能矩阵的更稳定写法

直接算:

Bi(d2Bjdx2)dx \int B_i\left(-\frac{d^2B_j}{dx^2}\right)dx

有时候不如分部积分稳定。

考虑动能项:

Tij=22mBi(x)Bj(x)dx T_{ij} = -\frac{\hbar^2}{2m} \int B_i(x)B_j''(x)\,dx

分部积分:

BiBjdx=[BiBj]boundaryBiBjdx \int B_i B_j''dx = \left[B_iB_j'\right]_{\text{boundary}} - \int B_i'B_j'dx

如果 Dirichlet 边界下基函数或波函数边界为零,边界项消失:

[BiBj]boundary=0 \left[B_iB_j'\right]_{\text{boundary}}=0

所以:

Tij=22mBi(x)Bj(x)dx T_{ij} = \frac{\hbar^2}{2m} \int B_i'(x)B_j'(x)\,dx

因此:

Hij=22mBiBjdx+BiVBjdx \boxed{ H_{ij} = \frac{\hbar^2}{2m}\int B_i'B_j'dx + \int B_i V B_j dx }

这是实际计算中常用的弱形式。


为什么出现重叠矩阵 SS

普通正交基满足:

ϕiϕjdx=δij \int \phi_i\phi_jdx=\delta_{ij}

所以本征方程是:

Hc=Ec H\mathbf c=E\mathbf c

但 B-样条通常不是正交基:

BiBjdxδij \int B_iB_jdx\neq \delta_{ij}

所以右边出现:

Sc S\mathbf c

即:

Hc=ESc H\mathbf c=ES\mathbf c

不建议显式求 S1S^{-1}

讲义里写:

(S1H)c=Ec (S^{-1}H)\mathbf c=E\mathbf c

数学上可以这样写,但数值上不推荐显式求逆。

因为:

  1. S1HS^{-1}H 可能破坏对称性;
  2. 显式求逆误差大;
  3. 矩阵可能变稠密。

更好的做法是直接解广义本征值问题:

Python

from scipy.linalg import eigh

eigvals, eigvecs = eigh(H, S)

如果一定要转成标准形式,可以做 Cholesky 分解:

S=LLT S=LL^T

令:

c=LTy \mathbf c=L^{-T}\mathbf y

代入:

HLTy=ESLTy H L^{-T}\mathbf y = E S L^{-T}\mathbf y

因为:

S=LLT S=L L^T

所以:

SLT=L S L^{-T}=L

左乘 L1L^{-1}

L1HLTy=Ey L^{-1}H L^{-T}\mathbf y=E\mathbf y

得到标准对称本征值问题:

H~y=Ey \boxed{ \tilde H\mathbf y=E\mathbf y }

其中:

H~=L1HLT \tilde H=L^{-1}HL^{-T}

转换为标准本征值问题需要求 B1B^{-1}(最直观)

(B1H)c=Ec (B^{-1} H) \mathbf{c} = E \mathbf{c}

说人话:B-样条和基矢展开法类似,但基函数不是解析多项式,而是分段拼接的函数段。矩阵方程中多了一个重叠矩阵 B,需要求逆转换。

B-样条节点怎么选?

常见节点分布:

1. 均匀节点

ti=t0+ih t_i=t_0+ih

适合变化均匀的问题。

2. 指数加密节点

原点附近密,远处稀:

ti=tmin+eai1eaN1(tmaxtmin) t_i=t_{\min} + \frac{e^{ai}-1}{e^{aN}-1} (t_{\max}-t_{\min})

适合原子、核、束缚态径向问题。

3. 分段节点

某些区域加密,其他区域粗化。

📊 精度与阶数的关系

随着 B-样条阶数 M 增大,精度单调改善。但需要注意 Nyquist 准则:格点间距不能太大,否则无法分辨波函数的振荡细节。

# 伪代码:B-样条展开法求解一维 Schrödinger 方程
# 1. 构造节点序列(边界加密)
knots = make_knots(x_min, x_max, n_basis, order=M)
# 2. 计算重叠矩阵 B 和 Hamiltonian 矩阵 H
B = overlap_matrix(knots, M)
H = hamiltonian_matrix(knots, M, potential_func)
# 3. 广义本征值问题 → 标准本征值问题
from scipy.linalg import eigh
B_inv = np.linalg.inv(B)
eigvals, eigvecs = eigh(B_inv @ H)

🔬 应用实例:形变体系的能级分布

在核物理中,B-样条被广泛用于求解轴对称形变势阱中的单粒子能级。利用对称性(角动量投影)可以极大降低矩阵维度。思考:对称性破缺后好量子数如何变化?


第八章:小波分析与多小波展开

💡 物理直觉

小波分析是一种多分辨率表示方法——对于波函数中振荡剧烈的区域,自动用精细的基来描述;对于平缓的区域,用粗糙的基来描述。这就像地图:城市用1:10000,沙漠用1:100000。

核心

Fourier 基函数是全局的:

eikx e^{ikx}

它知道频率,但不知道这个频率出现在空间哪里。

小波基函数是局域的:

ψjk(x)=2j/2ψ(2jxk) \psi_{jk}(x) = 2^{j/2}\psi(2^jx-k)

它同时有:

  • 空间位置;
  • 分辨率尺度。

其中:

  • jj:尺度,也叫 level;
  • kk:位置;
  • 2j2^j:缩放因子。
  • 2j/22^{j/2} 归一化因子

小波的两种表示方式

小波基具有两个核心操作:

  • 平移 (Translation):移动基函数的中心位置
  • 伸缩 (Dilation):缩放基函数的宽度

基函数族:$\psi_{jk}(x) = 2^{j/2} \psi(2^j x - k)$

其中 j 控制分辨率级别(level),k 控制中心位置。

多小波展开的核心思想

在 n-level 空间上展开波函数:

f(x)=isinϕin(x)+l=0n1idilψil(x) f(x) = \sum_i s_i^n \phi_i^n(x) + \sum_{l=0}^{n-1} \sum_i d_i^l \psi_i^l(x)

其中:

  • sins_i^n 是 n-level 的平滑系数(大尺度信息)
  • dild_i^l 是各 level 的细节系数(逐级精细信息)
  • 系数较小的 dild_i^l 可以截断 → 非均匀格点自动加密

核心:大尺度轮廓 + 各层细节修正

多小波是什么?

普通小波每个格子上通常一个 scaling function。

多小波 multiwavelet 在每个区间上使用多个基函数,比如 Legendre 多项式:

ϕ0(x),ϕ1(x),,ϕp1(x) \phi_0(x),\phi_1(x),\dots,\phi_{p-1}(x)

这样每个单元内部不是只用一个常数,而是用高阶多项式。

优点:

  • 高阶精度;
  • 局部支撑;
  • 自适应;
  • 正交性好;
  • 适合并行。

系数如何计算?

如果基函数正交,则:

si0=ϕi0f=ϕi0(x)f(x)dx s_i^0=\langle \phi_i^0|f\rangle = \int \phi_i^0(x)f(x)\,dx

如果某些细节系数很小:

dil<ϵ |d_i^l|<\epsilon

就可以丢掉。

这就是自适应压缩。

🚀 算法创新

如果某个区域函数平滑,那么高层小波系数很小。

因为高层小波描述局部细节,而平滑区域没有多少局部细节。

所以: $$ d_i^l\approx 0 $$ 这些系数可以删掉。

如果某个区域函数剧烈变化,高层小波系数大,必须保留。

因此:

小波展开自动在变化快的地方保留更多自由度,在变化慢的地方保留更少自由度。

小波方法的核心创新:将微分方程转化为积分方程,迭代求解。这是代表性工作 MADNESS —— green方法啥的(G.I. Fann 等,ORNL)的核心思想。

说人话:小波方法=图像压缩算法的数学推广。JPEG 压缩扔掉高频细节,小波方法也扔掉小的展开系数,结果就是"波函数振荡的地方格点自动加密,平缓的地方格点自动稀疏"——无需人工干预!

流程类比

┌─────────────────────────────────────────────┐
│  输入: 微分方程 + 边界条件                     │
│    ↓                                        │
│  转换为积分方程                               │
│    ↓                                        │
│  多小波基展开 (n-level)                       │
│    ↓                                        │
│  截断小系数 → 自适应非均匀格点                  │
│    ↓                                        │
│  迭代求解 (如 GMRES)                          │
│    ↓                                        │
│  输出: 数值解 + 误差估计                       │
└─────────────────────────────────────────────┘

高性能实现

  • TBB(Threading Building Blocks):多线程并行
  • Elemental:全局矩阵的分块分布式计算

第九章:有限元方法 FEM

💡 物理直觉

有限差分法在处理不规则形状边界时非常痛苦——网格线总不能完美贴合复杂边界。有限元法(FEM)的解决方案:"把复杂蛋糕切成简单小块,在每一块上做简单近似,最后拼起来。"

有限差分法的想法是:

在规则网格上,用上下左右差分近似导数。

但 FEM 的想法完全不同:

不一定用规则网格,而是把区域切成很多小块。 每个小块里用简单函数近似 uu。 最后把所有小块拼成一个整体。

FEM 不直接用差分近似二阶导数。

FEM 会说:

我不知道真实解 u(x)u(x),但我可以用一堆简单函数拼出来。

令:

uh(x)=jUjNj(x) u_h(x)=\sum_j U_j N_j(x)

其中:

  • uh(x)u_h(x):数值近似解;
  • UjU_j:第 jj 个节点的未知值;
  • Nj(x)N_j(x):第 jj 个节点对应的基函数,也叫形函数 shape function。

它满足:

N1(x1)=1 N_1(x_1)=1

也就是说:

N1N_1 在自己的节点为 1,在相邻节点为 0。

类似地:

Ni(xj)=δij N_i(x_j)=\delta_{ij}

这跟 DVR 里面的 cardinal property 有点像。

原方程是:

u=f -u''=f

如果直接代入:

uh=jUjNj u_h=\sum_j U_jN_j

会出现二阶导数 NjN_j''

但一维线性帽子函数是分段线性的,它的一阶导数是分段常数,二阶导数在节点处会有奇异性。

所以 FEM 不喜欢直接处理二阶导数。

于是它使用一个技巧:

把方程乘以测试函数,再积分,通过分部积分把二阶导数降成一阶导数。

这就叫 弱形式 weak form

原方程:

u(x)=f(x) -u''(x)=f(x)

取一个测试函数 v(x)v(x),两边乘以 v(x)v(x)

u(x)v(x)=f(x)v(x) -u''(x)v(x)=f(x)v(x)

在整个区间积分:

0Lu(x)v(x)dx=0Lf(x)v(x)dx \int_0^L -u''(x)v(x)\,dx = \int_0^L f(x)v(x)\,dx

所以:

0Luvdx=[uv]0L+0Luvdx -\int_0^L u''v\,dx = -\left[u'v\right]_0^L + \int_0^L u'v'\,dx

因此:

0Luvdx[uv]0L=0Lfvdx \int_0^L u'v'\,dx - \left[u'v\right]_0^L = \int_0^L fv\,dx

如果是 Dirichlet 边界:

u(0)=0,u(L)=0 u(0)=0,\qquad u(L)=0

测试函数也取边界为零:

v(0)=0,v(L)=0 v(0)=0,\qquad v(L)=0

于是边界项:

[uv]0L=0 \left[u'v\right]_0^L=0

所以得到:

0Lu(x)v(x)dx=0Lf(x)v(x)dx \boxed{ \int_0^L u'(x)v'(x)\,dx = \int_0^L f(x)v(x)\,dx }

这就是弱形式。

只要求一阶导数存在 所以 FEM可以用 分段线形函数

弱形式把“点点都严格满足微分方程”变成“整体积分意义上满足方程”

Galerkin 方法:测试函数也选形函数

近似解:

uh(x)=jUjNj(x) u_h(x)=\sum_j U_jN_j(x)

弱形式:

uhvdx=fvdx \int u_h'v'\,dx=\int fv\,dx

FEM/Galerkin 方法选择:

v=Ni v=N_i

也就是说,用每个形函数当测试函数。

代入:

(jUjNj)Nidx=fNidx \int \left( \sum_j U_jN_j' \right) N_i'\,dx = \int fN_i\,dx

把求和拿出来:

jUjNjNidx=fNidx \sum_j U_j \int N_j'N_i'\,dx = \int fN_i\,dx

定义矩阵:

Kij=NiNjdx K_{ij} = \int N_i'N_j'\,dx

定义右端:

Fi=fNidx F_i = \int fN_i\,dx

于是得到:

KU=F \boxed{ K\mathbf U=\mathbf F }

这就是 FEM 的矩阵方程。

K就是刚度矩阵 对于局部 就是 局部的刚度矩阵

组装就是:每个小单元算出一个局部矩阵,然后按节点编号加到全局矩阵的对应位置。

二维就用更高级的三角形

FEM 的基本步骤

  1. 剖分区域:将求解域分割成大量小单元(二维用三角形,三维用四面体)
  2. 选择插值函数:在每个单元内用多项式插值近似场量
  3. 弱形式:将 PDE 乘以检验函数并分部积分,降低微分阶数
  4. 组装与求解:叠加所有单元的贡献,得到线性方程组

例子

考虑:

2ϕ=f -\nabla^2\phi=f

区域:

Ω \Omega

边界:

Ω \partial\Omega

假设 Dirichlet 边界:

ϕ=gon Ω \phi=g \quad \text{on }\partial\Omega

选一个测试函数 vv,满足在 Dirichlet 边界上:

v=0 v=0

将 PDE 乘以 vv,积分:

Ω(2ϕ)vdΩ=ΩfvdΩ \int_\Omega (-\nabla^2\phi)v\,d\Omega = \int_\Omega fv\,d\Omega

对左边分部积分。

利用恒等式:

(vϕ)=vϕ+v2ϕ \nabla\cdot(v\nabla\phi) = \nabla v\cdot\nabla\phi + v\nabla^2\phi

所以:

v2ϕ=(vϕ)vϕ v\nabla^2\phi = \nabla\cdot(v\nabla\phi) - \nabla v\cdot\nabla\phi

因此:

Ωv2ϕdΩ=Ω(vϕ)dΩ+ΩvϕdΩ -\int_\Omega v\nabla^2\phi\,d\Omega = -\int_\Omega \nabla\cdot(v\nabla\phi)d\Omega + \int_\Omega \nabla v\cdot\nabla\phi\,d\Omega

用散度定理:

Ω(vϕ)dΩ=ΩvϕndS \int_\Omega\nabla\cdot(v\nabla\phi)d\Omega = \int_{\partial\Omega}v\frac{\partial\phi}{\partial n}dS

所以:

Ωv2ϕdΩ=ΩvϕdΩΩvϕndS -\int_\Omega v\nabla^2\phi\,d\Omega = \int_\Omega\nabla v\cdot\nabla\phi\,d\Omega - \int_{\partial\Omega} v\frac{\partial\phi}{\partial n}dS

对于 Dirichlet 边界,测试函数 v=0v=0,边界项消失。

于是弱形式为:

ΩvϕdΩ=ΩfvdΩ \boxed{ \int_\Omega\nabla v\cdot\nabla\phi\,d\Omega = \int_\Omega fv\,d\Omega }

此为 FEM的基础 降低微分阶数 —— 因为有限元形函数通常是分片多项式,只要求一阶导存在即可!

Delaunay 三角剖分

有限元法中网格质量直接影响精度。Delaunay 三角剖分是最常用的剖分策略:

  • ✅ 最大化所有三角形的最小角(避免"银针三角形")
  • ✅ 所有三角形的并集 = 点集的凸包
  • ✅ 最近邻点必然由一条边相连

Poisson 方程 Dirichlet 问题的 FEM 推导

在三角形单元内,场量 ϕ\phi 用三个顶点值插值:

ϕ(x,y)=Na(x,y)ϕa+Nb(x,y)ϕb+Nc(x,y)ϕc \phi(x,y) = N_a(x,y)\,\phi_a + N_b(x,y)\,\phi_b + N_c(x,y)\,\phi_c

其中 Na,Nb,NcN_a, N_b, N_c 是形函数(shape functions)。

通过变分法最小化能量泛函,得到局部刚度矩阵

kab=ΔNaNbdA k_{ab} = \int_\Delta \nabla N_a \cdot \nabla N_b \, dA

组装所有单元的局部刚度矩阵得到全局方程:

Kϕ=r K\phi = r

其中 KK 是对称矩阵,$r$ 是右端向量。

每个单元的局部刚度矩阵(具体形式)

设三角形三个顶点坐标为 (xa,ya),(xb,yb),(xc,yc)(x_a, y_a), (x_b, y_b), (x_c, y_c)

def local_stiffness(verts):
    """计算单个三角形单元的局部刚度矩阵"""
    xa, ya = verts[0]
    xb, yb = verts[1]
    xc, yc = verts[2]
    # 面积的两倍
    J = (xb - xa)*(yc - ya) - (xc - xa)*(yb - ya)
    # 形函数梯度分量
    bx = (yb - yc) / J  # ∂Na/∂x
    cx = (xc - xb) / J  # ∂Na/∂y → 对应 Na
    # ... 轮换得到其他顶点的分量
    # 局部刚度矩阵 3×3
    k = np.zeros((3, 3))
    k[0, 0] = (bx*bx + cx*cx) * J / 2  # 依此类推
    return k

回顾展开推导

三角形线性单元

设一个三角形单元 Δ\Delta 有三个顶点:

a,b,c a,b,c

坐标分别为:

(xa,ya),(xb,yb),(xc,yc) (x_a,y_a),\quad (x_b,y_b),\quad (x_c,y_c)

在这个三角形内部,用线性插值:

ϕ(x,y)=Na(x,y)ϕa+Nb(x,y)ϕb+Nc(x,y)ϕc \phi(x,y) = N_a(x,y)\phi_a + N_b(x,y)\phi_b + N_c(x,y)\phi_c

其中 Na,Nb,NcN_a,N_b,N_c 是形函数。

它们满足:

Na(a)=1,Na(b)=0,Na(c)=0 N_a(a)=1,\quad N_a(b)=0,\quad N_a(c)=0

类似地:

Nb(b)=1,Nc(c)=1 N_b(b)=1,\quad N_c(c)=1

并且:

Na+Nb+Nc=1 N_a+N_b+N_c=1

线性三角形形函数具体形式

形函数可以写成:

Ni(x,y)=ai+bix+ciy2A N_i(x,y) = \frac{a_i+b_ix+c_iy}{2A}

其中 AA 是三角形面积。

对顶点 aa

aa=xbycxcyb a_a=x_by_c-x_cy_b

对顶点 bb

ab=xcyaxayc a_b=x_cy_a-x_ay_c

对顶点 cc

ac=xaybxbya a_c=x_ay_b-x_by_a

面积满足:

2A=1xaya1xbyb1xcyc 2A = \begin{vmatrix} 1&x_a&y_a\\ 1&x_b&y_b\\ 1&x_c&y_c \end{vmatrix}

也就是:

2A=(xbxa)(ycya)(xcxa)(ybya) 2A = (x_b-x_a)(y_c-y_a) - (x_c-x_a)(y_b-y_a)

通常取绝对值保证面积为正。


形函数梯度

因为 NiN_i 是线性的,所以梯度是常数:

Ni=(Nix,Niy)=(bi2A,ci2A) \nabla N_i = \left( \frac{\partial N_i}{\partial x}, \frac{\partial N_i}{\partial y} \right) = \left( \frac{b_i}{2A}, \frac{c_i}{2A} \right)

局部刚度矩阵推导

弱形式对应的局部刚度矩阵为:

kij(e)=ΔeNiNjdA k_{ij}^{(e)} = \int_{\Delta_e} \nabla N_i\cdot\nabla N_j\,dA

由于 Ni\nabla N_iNj\nabla N_j 在三角形内是常数:

kij(e)=(NiNj)ΔedA k_{ij}^{(e)} = \left( \nabla N_i\cdot\nabla N_j \right) \int_{\Delta_e}dA

所以:

kij(e)=bibj+cicj4A \boxed{ k_{ij}^{(e)} = \frac{b_ib_j+c_ic_j}{4A} }

这就是线性三角形单元的局部刚度矩阵。


局部载荷向量

右端:

ri(e)=ΔefNidA r_i^{(e)} = \int_{\Delta_e} f N_i\,dA

如果 ff 在单元内近似为常数,可以取三角形重心处值:

fe=f(xcentroid,ycentroid) f_e=f(x_{\text{centroid}},y_{\text{centroid}})

则:

ri(e)feΔeNidA r_i^{(e)} \approx f_e\int_{\Delta_e}N_i\,dA

线性三角形中:

ΔeNidA=A3 \int_{\Delta_e}N_i\,dA=\frac{A}{3}

所以:

ri(e)A3fe \boxed{ r_i^{(e)} \approx \frac{A}{3}f_e }

组装全局矩阵

每个单元有一个 3×33\times 3 局部刚度矩阵:

k(e) k^{(e)}

假设该单元三个局部节点对应全局编号:

Ia,Ib,Ic I_a,I_b,I_c

那么把局部矩阵加到全局矩阵:

KIpIq+=kpq(e) K_{I_p I_q} \mathrel{+}= k_{pq}^{(e)}

右端同理:

rIp+=rp(e) r_{I_p}\mathrel{+}=r_p^{(e)}

最后得到:

Kϕ=r \boxed{ K\boldsymbol\phi=\mathbf r }

Dirichlet 边界怎么处理?

如果某个边界点已知:

ϕi=gi \phi_i=g_i

常见处理方式:

  1. 把该自由度从未知量中删除;
  2. 或者修改矩阵第 ii 行:
Kii=1,Kij=0 (ji) K_{ii}=1,\quad K_{ij}=0\ (j\neq i)

右端设为:

ri=gi r_i=g_i

为了保持对称性,通常还要同时修改列。


Neumann 边界在 FEM 中很自然

如果边界给:

ϕn=q \frac{\partial\phi}{\partial n}=q

弱形式中边界项不会消失:

ΩvϕndS -\int_{\partial\Omega} v\frac{\partial\phi}{\partial n}dS

根据方程符号约定,它会进入右端。

所以 FEM 里 Neumann 条件是自然边界条件。


FEM 本征值问题中的质量矩阵

如果求 Schrödinger 方程:

Hψ=Eψ H\psi=E\psi

FEM 展开:

ψ=iciNi \psi=\sum_i c_iN_i

投影后得到:

Hc=EMc H\mathbf c=E M\mathbf c

这里 MM 是质量矩阵:

Mij=NiNjdΩ M_{ij} = \int N_iN_j\,d\Omega

对线性三角形,局部质量矩阵为:

M(e)=A12(211121112) M^{(e)} = \frac{A}{12} \begin{pmatrix} 2&1&1\\ 1&2&1\\ 1&1&2 \end{pmatrix}

这和 B-样条里的重叠矩阵 SS 是同一个角色。

FEM vs 有限差分法

维度 有限差分法 有限元法 FEM
网格 规则矩形网格 任意三角形/四面体
边界拟合 困难 自然
数学基础 Taylor 展开 变分法 / 弱形式
精度控制 加密网格 加密网格+提高插值阶数
编程复杂度 简单 复杂
典型应用 学术计算 工程仿真(ANSYS, COMSOL)

第十章:边界条件进阶 — 多极展开、周期性、Twisted

💡 物理直觉

前面讨论的是"给定边界值"的简单情况。实际科研中,边界条件本身就是个难题。比如 Coulomb 势在无穷远处衰减极慢(~1/r),怎么截断?

1. Coulomb 势边界条件 — 多极展开法

对于长程 Coulomb 势,在边界外面还有贡献。处理方法:

步骤:将边界上的源 ρb\rho_b 分离出来:

2ϕ=4πρ \nabla^2\phi = -4\pi\rho

在边界上的贡献用多极展开(Spherical Harmonics YmY_{\ell m})解析计算:

ϕboundary=,mQmr+1Ym(θ,ϕ) \phi_{\text{boundary}} = \sum_{\ell,m} \frac{Q_{\ell m}}{r^{\ell+1}} Y_{\ell m}(\theta, \phi)

其中 Qm=rYm(θ,ϕ)ρ(r)d3rQ_{\ell m} = \int r^\ell Y_{\ell m}^*(\theta, \phi) \,\rho(\mathbf{r})\, d^3r 是多极矩。

然后用有限差分法求解内部:$\nabla^2\phi = -4\pi(\rho - \rho_b)$(减去边界源的贡献)。

说人话:把长程部分用球谐函数解析算了,剩下的短程部分用差分法。分而治之!

2. 周期性边界条件 PBC

傅里叶微分算符天然处理周期性边界:$\phi(x+L) = \phi(x)$。

在固体物理、晶格 QCD 中,PBC 是标配。

但有一个问题:有限盒子的假量子化效应——本该连续的谱被离散化了。

3. Twisted 边界条件 TBC

Twisted 边界条件是对 PBC 的推广:

ϕ(x+L)=eiθϕ(x) \phi(x+L) = e^{i\theta} \phi(x)
  • 物理动机:通过变化 twist 角 θ\theta 来恢复连续谱
  • 实现:修改傅里叶动量 k=(2πn+θ)/Lk = (2\pi n + \theta)/L
  • 应用:晶格 QCD、量子 Monte Carlo、凝聚态物理、中子星壳层 Pasta 结构

4. 吸收边界条件 ABC

对于散射态/连续谱问题,不让波函数在边界反射回来:

入射波 → 计算区域 → 透射(吸收)
           ↛ 反射回来!

三种边界条件对比

类型 条件 适用场景
PBC ϕ(x+L)=ϕ(x)\phi(x+L) = \phi(x) 晶体、周期结构
TBC ϕ(x+L)=eiθϕ(x)\phi(x+L) = e^{i\theta}\phi(x) 有限系统连续谱恢复
ABC 吸收出射波 散射态、连续谱

第十一章:Jacobi 松弛迭代法

💡 物理直觉

对于 Poisson 方程 2u=f\nabla^2 u = -f,离散化后得到 Au=bA\mathbf{u} = \mathbf{b}。直接求逆对大规模矩阵不现实(O(N³))。Jacobi 迭代的一条思路:"方程两边同时加回主对角项,变成不动点迭代。"

先乱猜一个解, 然后反复使用“邻居平均值”进行修正,直到整体平均平衡!!!

Jacobi 迭代公式推导

从五点差分公式出发:

ui+1,j+ui1,j+ui,j+1+ui,j14ui,jh2=fi,j \frac{u_{i+1,j} + u_{i-1,j} + u_{i,j+1} + u_{i,j-1} - 4u_{i,j}}{h^2} = -f_{i,j}

移项,解出 ui,ju_{i,j}

ui,j(new)=14[ui+1,j(old)+ui1,j(old)+ui,j+1(old)+ui,j1(old)+h2fi,j] u_{i,j}^{\text{(new)}} = \frac{1}{4} \left[ u_{i+1,j}^{\text{(old)}} + u_{i-1,j}^{\text{(old)}} + u_{i,j+1}^{\text{(old)}} + u_{i,j-1}^{\text{(old)}} + h^2 f_{i,j} \right]

说人话:每个格点的新值 = 四个邻居旧值的平均值 + 源项修正。不断重复直到收敛。本质上,这就是让势函数慢慢"松弛"到平衡态!它会慢慢把不平衡的势函数抹平,直到满足平衡条件。

数值实现

import numpy as np

def jacobi_poisson_2d(u, f, h, tol=1e-6, max_iter=10000):
    u_old = u.copy()
    u_new = u.copy()

    for it in range(max_iter):
        u_old[:, :] = u_new

        u_new[1:-1, 1:-1] = 0.25 * (
            u_old[2:, 1:-1]
            + u_old[:-2, 1:-1]
            + u_old[1:-1, 2:]
            + u_old[1:-1, :-2]
            + h**2 * f[1:-1, 1:-1]
        )

        diff = np.max(np.abs(u_new - u_old))

        if diff < tol:
            print("Jacobi 收敛步数:", it)
            break

    return u_new

加速技巧

  • Gauss-Seidel 迭代:使用最新值而非旧值(Jacobian→Gauss-Seidel,收敛翻倍)
  • 超松弛 SOR:加一个加速因子 ω\omega($1 < \omega < 2$)
  • 多重网格法:粗网格上快速收敛低频分量,细网格上打磨高频分量

总结与对比

核心思想归纳

  1. 多维 PDE 的密钥 → 投影转换为一维:矩阵形式的本质就是把 2D/3D 格点压扁成一个大向量
  2. 不同算法的精度关键 → 微分算符:如何逼近导数决定了方法的上限
  3. 两大流派:基空间(灵活高效)vs 格点空间(精确但计算量大)

七种方法终极对比表

方法 微分算符 边界处理 精度 计算量 适用场景 格点要求
有限差分 局部差分公式 显式修改 ~O(h²) 大(稀疏矩阵) 规则区域 均匀
FFT 谱方法 乘 ik(精确) 周期边界 指数收敛 O(NlogN)O(N\log N) 光滑周期问题 均匀
基矢展开 解析积分 基函数自带 高(基完备) 束缚态 无网格
DVR 解析+对角势 基函数自带 极高 本征值问题 高斯积分点
B-样条 解析递推 需处理边界 非均匀网格 非均匀
小波/多小波 迭代积分 自然的 自适应 中-高 多尺度问题 自适应
有限元 FEM 弱形式+变分 自然拟合任意形状 高(h&p 自适应) 工程仿真、复杂边界 任意三角形

📊 方法选择决策树

遇到 PDE 问题
├── 规则区域 + 周期边界 → FFT 谱方法(最快)
├── 规则区域 + 一般边界 → 有限差分法(最直接)
├── 束缚态本征值问题
│   ├── 基函数合适 → 基矢展开法(最高效)
│   ├── 需要高精度 → DVR(最优收敛)
│   └── 需要非均匀网格 → B-样条(最灵活)
├── 多尺度 / 自适应需求 → 多小波分析(最智能)
├── 不规则复杂边界 → 有限元法(最通用)
└── 超大规模稀疏 → Jacobi / 多重网格迭代

🔗 PDE 方法与物理问题的对应

物理方程 类型 推荐方法 注意事项
Poisson 方程 ∇²u = −ρ 椭圆型 五点差分 + 迭代 稀疏矩阵,迭代收敛快
Schrödinger 方程 Hψ = Eψ 本征值型 DVR / B-样条 精度要求高,边界条件关键
扩散方程 ∂u/∂t = D∇²u 抛物型 有限差分 + 时间步进 稳定性条件 Δt ≤ h²/2D
波动方程 ∂²u/∂t² = c²∇²u 双曲型 FFT 谱方法 无耗散,适合周期性结构

💡 课程金句备忘

  • "多维问题的关键是投影转换为一维"
  • "不同算法的精度关键是微分算符"
  • "基空间灵活高效,格点空间精确但计算量大"
  • "利用对称性和好量子数可以降维,打破对称性则计算量增加几个量级"
  • "Nyquist 准则:格点间距不能大于最小波长的 1/2,否则信息丢失"

笔记结束 · 2026-06-07

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...