外观
Picard 迭代与 Newton 迭代:以 Navier–Stokes 方程为例
求解非线性方程时,常见的思路是:从一个猜测出发,每次解一个较容易的子问题,再逐步修正这个猜测。Picard 迭代和 Newton 迭代都属于这类方法,但它们构造子问题的方式不同:
- Picard 迭代:构造不动点映射;在非线性 PDE 中,常表现为冻结一部分系数。
- Newton 迭代:对整个残差做一阶线性化,求一个消除当前残差的修正量。
下面先从标量方程说明两者的区别,再推导它们在定常不可压缩 Navier–Stokes 方程中的形式。
1. 从一个标量方程开始
考虑
F(x)=x+x2−2=0.
它有两个根 1 和 −2。下面从 x0=0 出发,观察趋近正根 x∗=1 的过程。上标 k 表示迭代次数。
1.1 Picard:把旧值当成系数
将方程写成
(1+x)x=2.
在第 k 步,冻结括号里的 x,只把后面的 x 作为未知量:
(1+xk)xk+1=2,xk+1=1+xk2.
于是得到不动点迭代 xk+1=G(xk),其中
G(x)=1+x2.
在正根处,
G′(1)=−21.
为什么导数决定了误差的变化?定义误差 ek=xk−1,即 xk=1+ek。由于 1 是不动点,满足 G(1)=1,所以
ek+1=xk+1−1=G(xk)−G(1)=G(1+ek)−G(1).
在 1 处对 G 做 Taylor 展开:
G(1+ek)=G(1)+G′(1)ek+O((ek)2).
减去 G(1),便得到
ek+1=G′(1)ek+O((ek)2)=−21ek+O((ek)2).
这里的 O((ek)2) 表示余项在误差足够小时,其绝对值不超过某个常数乘以 (ek)2。因此,只有在根附近、忽略二阶及更高阶项时,才有近似关系
ek+1≈−21ek,
而不是对每一步都严格成立的等式。直观上,导数 G′(1) 就是映射 G 在不动点附近对小误差的放大或缩小系数。
本例还可以直接算出精确的误差关系:
ek+1=1+xk2−1=2+ek2−1=−2+ekek.
当 ek 趋于零时,分母趋于 2,所以非零误差的比值 ek+1/ek 趋于 −1/2。误差一边改变符号,一边大致缩小为原来的一半,这就是典型的线性收敛。
同一个方程,换一种不动点改写,收敛性质可能完全不同。 例如写成
xk+1=2−(xk)2,
则映射在 x∗=1 处的导数为 −2,这个不动点是局部排斥的。从 x0=0 出发,它实际上会落到另一个根 −2。所以“写成了等价方程”并不意味着“得到了合适的迭代”。
1.2 Newton:对残差求导
在当前点附近,用切线近似残差:
F(xk+δx)≈F(xk)+F′(xk)δx.
令这个线性近似等于零,就得到
(1+2xk)δxk=−(xk+(xk)2−2),
再更新
xk+1=xk+δxk.
也就是熟悉的 Newton 公式:
xk+1=xk−1+2xkxk+(xk)2−2.
两种方法从同一初值出发的结果如下。表中的误差相对于正根 1 计算,数值经过舍入。
| k | Picard 的 xk | Picard 误差 | Newton 的 xk | Newton 误差 |
|---|---|---|---|---|
| 0 | 0.000000000 | 1.000 | 0.000000000 | 1.000 |
| 1 | 2.000000000 | 1.000 | 2.000000000 | 1.000 |
| 2 | 0.666666667 | 3.333×10−1 | 1.200000000 | 2.000×10−1 |
| 3 | 1.200000000 | 2.000×10−1 | 1.011764706 | 1.176×10−2 |
| 4 | 0.909090909 | 9.091×10−2 | 1.000045777 | 4.578×10−5 |
| 5 | 1.047619048 | 4.762×10−2 | 1.000000001 | 6.985×10−10 |
对这个例子,可以直接算出 Newton 的误差关系:
ek+1=3+2ek(ek)2.
在根附近,分母接近 3,误差主要按平方缩小。这就是二次收敛。它描述的是接近解以后的行为,并不保证前几步就快速下降。
2. 一般非线性方程中的两种方法
考虑
F(U)=0,
其中 U 可以是有限维向量,也可以是函数空间中的未知量。
2.1 Picard 是不动点迭代
先将问题改写成
U=G(U),
再依次计算
Uk+1=G(Uk).
一个常用的充分条件是:G 将某个非空完备闭集映到自身,并且在这个集合内满足压缩性质
∥G(U)−G(V)∥≤q∥U−V∥,0≤q<1.
此时,不动点存在且唯一,从该集合中的初值出发有
∥Uk+1−U∗∥≤q∥Uk−U∗∥.
对于具有
A(U)U=b
结构的方程,一种常见的 Picard 迭代是
A(Uk)Uk+1=b.
这里的“不动点映射”包含了一次线性求解。Picard 并不意味着只需把旧值代入一个简单的显式公式。
2.2 Newton 是完整的一阶线性化
Newton 方法求解
F′(Uk)δUk=−F(Uk),
然后更新
Uk+1=Uk+δUk.
在有限维情形,F′(Uk) 就是 Jacobian 矩阵;在函数空间中,它是相应的导数算子。关于这层联系,可以参看 Frechet 导数和 Gateaux 导数。
对于 F(U)=A(U)U−b,乘积求导给出
F′(U)[δU]=A(U)δU+A′(U)[δU]U.
Picard 冻结 A(U),Newton 则还考虑 U 的变化会使算子 A(U) 本身发生怎样的变化。后面的 Navier–Stokes 推导就是这个公式的具体例子。
当解处的导数可逆、导数在附近满足适当的 Lipschitz 连续性、初值足够接近解,而且线性子问题精确求解时,Newton 具有局部二次收敛:
∥Uk+1−U∗∥≤C∥Uk−U∗∥2.
因此,“Newton 二次收敛”有明确的局部条件,不能理解为任意初值下都比 Picard 好。
3. Navier–Stokes 的非线性来自哪里
考虑常密度、常黏度的定常不可压缩 Navier–Stokes 方程:
⎩⎨⎧−νΔu+(u⋅∇)u+∇p=f,∇⋅u=0,u=g,在 Ω 内,在 Ω 内,在 ∂Ω 上.
这里:
- u 是速度;
- p 是除以常密度后的压力;
- ν>0 是运动黏度;
- f 是单位质量上的体力。
为集中讨论线性化,本文在整个边界给定速度,并假定数据足够规则、满足通量相容条件
∫∂Ωg⋅nds=0.
此时压力只确定到一个加法常数,可以加上
∫Ωpdx=0
固定其唯一表示。其他边界条件需要相应调整弱形式和压力处理。
常黏度下,黏性项、压力梯度和不可压缩约束都是线性的。非线性来自对流项
N(u)=(u⋅∇)u.
按分量写,
Ni(u)=j=1∑duj∂xj∂ui.
这里的 u 有两个角色:前面的 uj 决定沿哪个方向、以多快的速度输运;后面的 ui 是被输运的速度分量。两者都未知,所以形成二次非线性。
4. Picard:冻结输运速度,得到 Oseen 问题
已知 uk 后,将对流项近似为
(u⋅∇)u⟶(uk⋅∇)uk+1.
于是每一步求解
−νΔuk+1+(uk⋅∇)uk+1+∇pk+1∇⋅uk+1=f,=0.
同时施加 uk+1=g 和压力零均值条件。
因为 uk 已知,这对 (uk+1,pk+1) 是线性的,通常称为 Oseen 问题。它保留了“已知速度场输运未知速度”的结构。
注意,这不是把整个对流项都替换成 (uk⋅∇)uk。后一种做法相当于把对流项整体移到右端,形成另一种不动点迭代,收敛性质也会不同。本文所说的 Navier–Stokes Picard 迭代,特指上述 Oseen 形式。
如果迭代收敛到 (u∗,p∗),在适当的连续性条件下取极限,就重新得到原来的非线性方程。
5. Newton:对两个速度因子同时求导
5.1 展开对流项
令当前速度受到扰动 uk+δu,直接展开:
N(uk+δu)=(uk⋅∇)uk+(uk⋅∇)δu+(δu⋅∇)uk+(δu⋅∇)δu.
最后一项关于 δu 是二次的。一阶线性化保留前面的常数项和两个线性项,因此
N′(uk)[δu]=(uk⋅∇)δu+(δu⋅∇)uk.
两项分别表示:
- (uk⋅∇)δu:原来的流场输运速度扰动;
- (δu⋅∇)uk:输运速度的扰动作用于原来的速度梯度。
第二项正是 Picard 冻结输运速度时没有保留的反馈。
5.2 增量形式:先解修正量,再更新
定义动量残差和连续性残差
RmkRck=−νΔuk+(uk⋅∇)uk+∇pk−f,=∇⋅uk.
Newton 修正量满足
−νΔδuk+(uk⋅∇)δuk+(δuk⋅∇)uk+∇δpk∇⋅δuk=−Rmk,=−Rck.
求解后更新
uk+1=uk+δuk,pk+1=pk+δpk.
若当前速度已满足边界条件 uk=g,则修正量必须满足
δuk=0在 ∂Ω 上.
若当前压力为零均值,则也令 ∫Ωδpkdx=0。
这里不能随意把第二行右端写成零。只有当前速度已经满足相应的不可压缩约束时,才有 ∇⋅δuk=0;一般情况下,Newton 也需要修正当前的散度误差。
5.3 新解形式:右端为什么多出一个对流项
将 δuk=uk+1−uk 和 δpk=pk+1−pk 代入,可以得到等价的全步长形式:
−νΔuk+1+(uk⋅∇)uk+1+(uk+1⋅∇)uk+∇pk+1∇⋅uk+1=f+(uk⋅∇)uk,=0.
右端多出的 (uk⋅∇)uk 来自展开并整理旧值项。也可以直接从
N(uk+1)≈(uk⋅∇)uk+1+(uk+1⋅∇)uk−(uk⋅∇)uk
看出这个符号。
增量形式的右端是负残差,新解形式的右端是整理后的载荷;两者不能混用。 上式描述的是完整 Newton 步。如果使用阻尼,应再对求得的候选解与当前解做加权更新。
6. 弱形式和离散矩阵是什么样的
有限元通常从弱形式出发。令
V0=H01(Ω)d,Vg={v∈H1(Ω)d:v∣∂Ω=g},Q=L02(Ω),
其中 L02(Ω) 表示零均值平方可积函数空间。
用 (⋅,⋅) 表示 L2 内积,并定义
a(u,v)c(w;u,v)b(v,q)=ν(∇u,∇v),=((w⋅∇)u,v),=−(q,∇⋅v).
原问题是求 (u,p)∈Vg×Q,使得对任意 (v,q)∈V0×Q,
a(u,v)+c(u;u,v)+b(v,p)b(u,q)=(f,v),=0.
Picard 每一步满足
a(uk+1,v)+c(uk;uk+1,v)+b(v,pk+1)b(uk+1,q)=(f,v),=0.
定义当前弱残差
Rk(v,q)=a(uk,v)+c(uk;uk,v)+b(v,pk)+b(uk,q)−(f,v).
Newton 则求 (δuk,δpk)∈V0×Q,使
a(δuk,v)+c(uk;δuk,v)+c(δuk;uk,v)+b(v,δpk)+b(δuk,q)=−Rk(v,q).
选取有限元基函数,并处理速度边界自由度和压力常数模态后,Picard 线性子问题与 Newton 修正方程的矩阵分别具有结构
KPk=[A+N(Uk)BBT0],KNk=[A+N(Uk)+W(Uk)BBT0].
这里 Uk 表示离散速度系数向量,且:
- A 来自黏性项 a;
- N(Uk) 来自 c(uk;δu,v);
- W(Uk) 来自 c(δu;uk,v);
- B 来自所定义的散度耦合 b。
Newton 多出的正是 W(Uk),未知量的数量没有因此增加。
对于这里采用的标准、未加稳定化的混合有限元,速度和压力空间应满足离散 inf-sup 条件。线性化方法本身不能修复不稳定的空间配对;使用稳定化方法时,则需要对完整的离散残差一致地线性化。
实际实现中,可以用 Oseen 形式构造 Picard 矩阵,也可以对弱残差自动求导得到 Newton Jacobian;FENaPack 的 Navier–Stokes 示例 展示了这两种构造方式。
7. 为什么一个通常线性收敛,一个局部二次收敛
前面的对流项展开已经揭示了关键:Newton 保留了所有一阶项,遗漏项是
(δu⋅∇)δu,
它对扰动是二次的。Picard 则省略了一项一阶反馈。
还可以直接比较误差方程。令 u∗ 为真解,
ek=uk−u∗,πk+1=pk+1−p∗.
因为各步和真解具有相同的速度边界值,误差在边界上为零。以下比较针对精确线性求解和全步长更新。
7.1 Picard 的误差右端是一阶的
将真解方程与 Picard 方程相减并整理,得到
−νΔek+1+(uk⋅∇)ek+1+∇πk+1=−(ek⋅∇)u∗.
右端关于旧误差 ek 是一阶的。若左端 Oseen 问题有适当的稳定性估计,就可以得到形如
∥ek+1∥V≤q∥ek∥V
的界;还需要 q<1 才能据此推出收敛。小数据或黏性足够强,是获得这类压缩估计的典型条件。
7.2 Newton 的误差右端是二次的
对 Newton 的新解形式做同样的操作,可得
−νΔek+1+(uk⋅∇)ek+1+(ek+1⋅∇)uk+∇πk+1=(ek⋅∇)ek.
右端已经是旧误差的二次项。在解附近,如果线性化算子的逆一致有界,并且对流项满足相应的连续性估计,就能得到
∥ek+1∥V≤C∥ek∥V2.
这说明 Newton 的快速收敛来自完整的一阶抵消,也说明了为什么 Jacobian 接近奇异时,这个结论可能失效。
| 比较项 | Picard / Oseen | Newton |
|---|---|---|
| 线性化方式 | 冻结输运速度 | 对整个残差求导 |
| 对流线性项 | 保留一个 | 保留两个 |
| 典型收敛性质 | 压缩条件下通常线性收敛 | 适当条件下局部二次收敛 |
| 初值要求 | 压缩区域内可收敛,不保证任意初值 | 局部理论要求初值足够接近解 |
| 每步工作 | 更新 Oseen 矩阵并求解 | 更新完整 Jacobian 并求解 |
| 总体成本 | 可能需要较多外层迭代 | 步数可能更少,每步求解难度也可能更高 |
两者的线性系统通常都非对称,而且都保留速度—压力鞍点结构。“Newton 步数更少”不能直接换算成“总耗时更少”。
8. 实际计算时怎样使用
8.1 初值、阻尼和延续
一种常见起点是先解相同边界条件下的 Stokes 问题:
−νΔu0+∇p0=f,∇⋅u0=0.
随后用 Picard 迭代改善初值,在残差已有明显下降时尝试切换到 Newton。这是一种可尝试的策略,切换时机仍需结合残差和求解成本判断。
如果完整更新过大,可以对 Newton 使用阻尼:
Uk+1=Uk+αkδUk,0<αk≤1,
其中这里的 U 包含速度和压力。可以依据非线性残差的下降情况做回溯线搜索;接近正则解时,接受完整步长有助于恢复二次收敛。
Picard 也可以做松弛。先解出 Oseen 候选解 Uk+1,再取
Uk+1=(1−ωk)Uk+ωkUk+1,0<ωk≤1.
阻尼可能改善收敛,但不保证任何问题都能收敛。如果采用参数延续,例如从较大的黏度逐步逼近目标黏度,应使用前一个参数下的解作为下一个问题的初值。
雷诺数 Re=UL/ν 增大时,对流相对黏性增强,求解往往更困难,但不存在脱离几何、边界条件和离散方法的通用切换阈值。对于物理上不稳定的定常解,Newton 仍可能求得它;这不表示真实流动会稳定在该状态。
8.2 用原始非线性残差判断收敛
离散后记完整残差为 R(U)。一种常见停止条件是
∥R(Uk)∥≤εabs+εrel∥R(U0)∥.
动量与连续性残差应做适当的量纲或代数尺度处理,再组合成有意义的范数。
同时可以检查相邻迭代的变化量,但不能只检查
∥Uk+1−Uk∥.
如果阻尼系数很小,更新量可以很小,而原方程残差仍然很大。每次都应将更新后的解代回原始非线性残差,而不是只查看当前线性子问题的残差。
8.3 区分外层非线性迭代和内层线性迭代
Picard 和 Newton 是外层方法;每一步得到的线性系统,还可能由 GMRES 等内层方法求解。
Newton 的经典二次收敛结论假定线性子问题精确求解。采用不精确 Newton 时,可以控制
∥J(Uk)δUk+R(Uk)∥≤ηk∥R(Uk)∥.
固定较小的 ηk 一般不足以保证渐近二次收敛;在其他局部条件成立时,让 ηk→0 可获得超线性收敛,让 ηk=O(∥R(Uk)∥) 可支持二次收敛。这也解释了为什么外层接近解后,内层精度通常需要相应提高。
8.4 非定常问题:时间步与非线性步不同
如果用后向 Euler 离散时间,在 tn+1 需要求解
Δtun+1−un−νΔun+1+(un+1⋅∇)un+1+∇pn+1=fn+1.
这个时间步内部仍然可以做 Picard 或 Newton 迭代,以 un+1,k 表示第 k 次猜测。与定常问题相比,Newton 的速度块增加了质量矩阵项 M/Δt。
如果只把对流速度冻结在上一时间层,使用
(un⋅∇)un+1,
然后仅解一次线性系统,那是一个半隐式时间离散方案。它与“在当前时间步内反复迭代,直到满足全隐式非线性方程”是两种不同的算法。迭代指标 k 也不代表物理时间。
9. 小结
Picard 与 Newton 的差别,可以通过对流项记住:
Picard:Newton:(uk⋅∇)uk+1,(uk⋅∇)uk+1+(uk+1⋅∇)uk−(uk⋅∇)uk.
Picard 冻结输运速度,反复求解 Oseen 问题;Newton 同时考虑两个速度因子的变化,消除全部一阶误差,在适当条件下获得局部二次收敛。
真正实现时,除了多出的那一项,还应处理好修正量的齐次边界条件、压力常数模态、离散空间稳定性,以及原始非线性残差的检查。
延伸阅读
- Frechet 导数和 Gateaux 导数:理解残差算子的一阶线性化。
- inf-sup 条件:理解速度—压力混合离散的稳定性。
- FENaPack:PCD preconditioner for Navier-Stokes equations:查看 Oseen 矩阵与 Newton Jacobian 的具体组装。
- Pollock 等:Analysis of the Picard-Newton iteration for the Navier-Stokes equations:研究每轮先做 Picard、再做 Newton 的复合迭代。这里的复合算法与“先做若干步 Picard,再切换到 Newton”不同,其收敛结论需要结合论文中的假设理解。
版权所有
版权归属:Guisong Wu