方程组的迭代&直接求解
一、迭代算法
理论基础-不动点理论
x
=
ϕ
(
x
)
,
x=\phi(x),
x=ϕ(x),这样一种映射
ϕ
(
x
)
\phi(x)
ϕ(x)存在使得
x
x
x的函数值等于其本身,这样的点看起来像是不动点
Lipzchi条件
∣
∣
x
k
+
1
−
x
k
∣
∣
≤
L
∣
∣
ϕ
(
x
k
+
1
)
−
ϕ
(
x
k
)
∣
∣
||x_{k+1}-x_k||\leq L||\phi(x_{k+1})-\phi(x_k)||
∣∣xk+1−xk∣∣≤L∣∣ϕ(xk+1)−ϕ(xk)∣∣
满足该条件的迭代公式构造的点列收敛
1.一元变量函数的迭代求解
简单迭代
构造迭代函数 x = ϕ ( x ) x=\phi(x) x=ϕ(x)
各种魔改的牛顿迭代
将 f ( x ) = 0 f(x)=0 f(x)=0线性化 L ( x ) = 0 L(x)=0 L(x)=0, L ( x ) = f ( x ) + f ′ ( x ) ( x − x ∗ ) = 0 L(x)=f(x)+f'(x)(x-x*)=0 L(x)=f(x)+f′(x)(x−x∗)=0,构造迭代函数 x k + 1 = x k − f ( x ) / f ′ ( x ) x^{k+1}~=x^k-f(x)/f'(x) xk+1 =xk−f(x)/f′(x)
2.大型方程组(多元变量)的迭代求解
大型方程组构成 A x = b Ax=b Ax=b 的 m ∗ n m*n m∗n 阶矩阵,若使用直接求解法,例如经典而优美的克莱姆法则,虽然可以得到准确解 X ∗ X* X∗,但其计算量太高,不适用于大型矩阵的求解;采用迭代法不断逼近真实解 X ∗ X* X∗
朴素而经典-Jacobi迭代
改进版本的-Seidel迭代
SOR迭代(松弛迭代)
收敛条件
1个充要条件,3个判别条件:
迭代矩阵B的谱半径小于1,
ρ
(
B
)
<
1
\rho(B)<1
ρ(B)<1
d
e
t
(
λ
I
−
B
)
=
0
det(\lambda I - B)=0
det(λI−B)=0 解的最大值
λ
m
a
x
\lambda max
λmax
范数
衡量某种距离
∣
∣
⋅
∣
∣
||·||
∣∣⋅∣∣, 向量范数与矩阵范数不同
常见向量范数有: 1范数,2范数,p范数,无穷范数
常见矩阵范数有: 1范数(列范数),无穷范数(行范数),F范数(元素平方和),2范数(乘转置矩阵求特征值)
现代大规模矩阵迭代求解方法
参考资料 Yosse Sparse Matrix iterative method
比较常用的是Krylov空间方法
GMRes (Generalization minimize residual),CG (conjugate gradient),…
先看看对 A x = b Ax = b Ax=b 的理解
-
朴素线性方程组
a 11 X 1 + a 12 X 2 + a 13 X 3 + . . . + a 1 n X n = 0 a_{11}X_1+a_{12}X_2+a_{13}X_3+...+a_{1n}X_n = 0 a11X1+a12X2+a13X3+...+a1nXn=0
a 21 X 1 + a 22 X 2 + a 23 X 3 + . . . + a 2 n X n = 0 a_{21}X_1+a_{22}X_2+a_{23}X_3+...+a_{2n}X_n = 0 a21X1+a22X2+a23X3+...+a2nXn=0
…
这里的系数矩阵 A A A=
{ a 11 a_{11} a11 a 12 a_{12} a12 a 13 a_{13} a13 … a 1 n a_{1n} a1n
a 21 a_{21} a21 …
… }
可以从一个微分方程组,空间离散/线性化后的得到的; -
牛顿Newton角度
让我们看看牛顿的问题
求解非线性方程 x n + x n − 1 + x n − 2 + . . . . . + x 1 = b x^n+x^{n-1}+x^{n-2}+.....+x^1=b xn+xn−1+xn−2+.....+x1=b
使用 f ( x ) = x n + x n − 1 + x n − 2 + . . . . . + x 1 − b f(x)=x^n+x^{n-1}+x^{n-2}+.....+x^1-b f(x)=xn+xn−1+xn−2+.....+x1−b
则问题转化为 f ( x ) = 0 f(x)=0 f(x)=0 的求根问题
典型的牛顿Newton迭代解法
x k + 1 = x k − f ( x k ) / f ′ ( x k ) x^{k+1}=x^k-f(x^k)/f'(x^k) xk+1=xk−f(xk)/f′(xk), f ′ ( x k ) f'(x^k) f′(xk)是原函数 f ( x ) f(x) f(x)在 x k x^k xk的导数,对于多项式非线性这很好计算;
ok,对于多个非线性方程组则可以构成一个 A x = b Ax=b Ax=b的形式;
x 1 n + x 2 n − 1 + x 3 n − 2 + . . . . . + x n 1 = b 1 x_1^n+x_2^{n-1}+x_3^{n-2}+.....+x_n^1=b_1 x1n+x2n−1+x3n−2+.....+xn1=b1
e x p x 1 + x 2 + x 3 n + . . . . . + x n 1 = b 2 exp^{x_1}+x_2+x_3^{n}+.....+x_n^1=b_2 expx1+x2+x3n+.....+xn1=b2
…
其变量 x = ( x 1 , x 2 , x 3 , . . . ) T \boldsymbol{x}=(x_1,x_2,x_3,...)^T x=(x1,x2,x3,...)T 是一个向量vector,自然其函数 f = ( f 1 , f 2 , f 3 , . . . ) \boldsymbol{f}=(f_1,f_2,f_3,...) f=(f1,f2,f3,...) 也构成一个向量vector。
则其迭代计算也变成了
x k + 1 = x k − f ( x k ) / f ′ ( x k ) \boldsymbol{x^{k+1}=\boldsymbol{x^{k}} - \boldsymbol{f(\boldsymbol{x^k})}/\boldsymbol{f'(\boldsymbol{x^k})} } xk+1=xk−f(xk)/f′(xk)
这里 f ′ ( x k ) \boldsymbol{f'(\boldsymbol{x^k})} f′(xk)构成一个Jacob矩阵 J \boldsymbol{J} J=
∂ f 1 / ∂ x 1 , ∂ f 1 / ∂ x 2 , . . . . \partial f_1/\partial x_1, \partial f_1/\partial x_2,.... ∂f1/∂x1,∂f1/∂x2,....
∂ f 2 / ∂ x 1 , ∂ f 2 / ∂ x 2 , . . . . \partial f_2/\partial x_1, \partial f_2/\partial x_2,.... ∂f2/∂x1,∂f2/∂x2,....
…
则 x k + 1 = x k − J − 1 f ( x k ) \boldsymbol{x^{k+1}=\boldsymbol{x^{k}} - \boldsymbol{J^{-1}}\boldsymbol{f(\boldsymbol{x^k})} } xk+1=xk−J−1f(xk)
令 δ x k = x k + 1 − x k \delta \bold x^k = \bold x^{k+1}- \bold x^k δxk=xk+1−xk,再左乘 J \bold J J得到
J \bold J J δ x k \delta \bold x^k δxk= f ( x k ) \boldsymbol{f(\boldsymbol{x^k}}) f(xk)
即 A x = b Ax=b Ax=b形式,其中 A A A为Jacobain矩阵 J \bold J J, b b b右端向量为 f ( x k ) \boldsymbol{f(\boldsymbol{x^k}}) f(xk)。
这二者每步迭代都需要在 x k \bold {x^k} xk处更新。 -
最优化凸优化角度
定义 r = A x − b r=Ax-b r=Ax−b,这里 r r r是余向量 redisual vector,在 r = 0 r=0 r=0 的时候 A x = b Ax=b Ax=b,所以迭代问题转化为最小化这个余向量 r r r,这个 r r r的本质是最优化问题 f ( x ) = x T A x − x T b f(x)=x^TAx-x^Tb f(x)=xTAx−xTb的梯度方向向量。
可以简单证明,若 A A A为对称正定矩阵(SPD),则 f ( x ) = x T A x − x T b f(x)=x^TAx-x^Tb f(x)=xTAx−xTb 的导数为 A x − b Ax-b Ax−b,导数为零取得优化解,即满足 r = A x − b = 0 r=Ax-b=0 r=Ax−b=0
GMRes中,迭代按照搜索方向 p k p^k pk进行, p k p^k pk与余向量 r r r和A都有关系,力求按照 α \alpha α步长每次在该方向使得 ∣ ∣ r ∣ ∣ ||r|| ∣∣r∣∣到达极小 即minizie。
例如Krylov家族的CG方法:迭代公式为 x k + 1 = x k + α k p k x^{k+1}= x^k + \alpha ^k p^k xk+1=xk+αkpk
此方法最多需要n步即可得出解,远快于朴素的迭代方法 x = ϕ ( x ) x=\phi (x) x=ϕ(x),很适合大规模矩阵求解。GMRes包括Arnoldi求正交基步骤(对Krylov空间求正交基);Gevins 旋转步骤
Krylov空间即向量 ( b , A b , A 2 b , . . . A n − 1 b ) ({{b, Ab, A^2b},...A^{n-1}b}) (b,Ab,A2b,...An−1b)span 张成的空间,其向量构成的矩阵即Krylov矩阵,各向量不一定正交,不一定正定。
3. 方程组的直接求解
Gauss消元法
实质是将 A x = b Ax=b Ax=b中的A矩阵转化为同等的上三角矩阵 U U U,然后回代,解出 x x x
LU分解
将A矩阵分解为两个上下三角矩阵LU的乘积
A
=
L
U
A=LU
A=LU
A
x
=
b
Ax=b
Ax=b
L
U
x
=
b
LUx=b
LUx=b
L
y
=
b
,
U
x
=
y
Ly=b, Ux=y
Ly=b,Ux=y
Doolittle分解
紧凑格式
LDU分解
A = L D U A=LDU A=LDU
追赶法
解决三对角矩阵,即
A
A
A是稀疏的,A呈现条带状分布
计算量少: 5n-4 + 3n-2 乘除法
存储简单:一维数组存储,a,b,c以及 alpha, beta, gamma
关注问题:大规模稀疏方程组
(1)三对角矩阵可以用直接求解:追赶法,Guass-Doolittle
(2)分块迭代
(3)CG共轭梯度法,共轭方向法的一种,利用当前梯度方向构建共轭方向
所谓共轭向量组是满足
d
i
A
d
j
=
0
d_iAd_j = 0
diAdj=0的向量组,其中A是正定矩阵,
x
T
A
x
x^TAx
xTAx>0
S
=
d
0
,
d
1
,
d
2
,
.
.
.
d
k
{S={d_0,d_1,d_2,...d_k}}
S=d0,d1,d2,...dk,共轭向量组
S
S
S是线性无关的,而且是正交的
其沿着共轭方向
d
i
d_i
di,通过
x
k
+
1
=
x
k
+
α
k
d
k
x_{k+1}=x_k+\alpha_k d_k
xk+1=xk+αkdk构造点列
x
0
,
x
1
,
x
2
,
.
.
.
,
x
n
{x_0,x_1,x_2,...,x_n}
x0,x1,x2,...,xn,
优势:具有n步平方收敛
理论基础是 最优化中的求极值?而不是不动点理论
关注问题:矩阵病态问题
误差被放大倍数与条件数 cond(A)相关
c
o
n
d
(
A
)
=
∣
∣
A
∣
∣
⋅
∣
∣
A
−
1
∣
∣
cond(A)=||A||·||A^{-1}||
cond(A)=∣∣A∣∣⋅∣∣A−1∣∣
cond(A)>>1,矩阵是病态的
矩阵预处理,降低条件数cond(A)
利用剩余向量
R
=
A
x
−
b
,
R=Ax-b,
R=Ax−b,精确结果,直到
∣
∣
R
∣
∣
<
ϵ
||R||<\epsilon
∣∣R∣∣<ϵ