数学背景
本节介绍矢量范数的概念以及矢量空间 R n \mathbb{R}^n Rn中序列的收敛性。
收敛序列与Cauchi收敛
设a为 R \mathbb{R}^{} R中的任意点,而 ε ∈ R + \varepsilon \in \mathbb{R}^+ ε∈R+为任何正实数。 a的 ε \varepsilon ε 邻域(用 N ( α , ε ) \mathscr{N}\left( \alpha ,\varepsilon \right) N(α,ε) 表示)是位于开放区间 ( α − ε , α + ε ) \left( \alpha -\varepsilon ,\alpha +\varepsilon \right) (α−ε,α+ε) 中的所有点 χ ∈ R \chi \in \mathbb{R} χ∈R的集合。 也就是说, N ( α , ε ) = { χ ∈ R : ∣ χ − α ∣ < ε } \mathscr{N}\left( \alpha ,\varepsilon \right) =\left\{ \chi \in \mathbb{R}:\left| \chi -\alpha \right|<\varepsilon \right\} N(α,ε)={χ∈R:∣χ−α∣<ε} 。
实数序列 { a n } n = 0 ∞ = a 0 , a 1 , a 2 , ⋯ \left\{ a_n \right\} _{n=0}^{\infty}=a_{0,}a_1,a_2,\cdots {an}n=0∞=a0,a1,a2,⋯ 表示收敛到 α ∈ R \alpha \in \mathbb{R} α∈R,如果对于任何 ε > 0 \varepsilon >0 ε>0的选择, N ( α , ε ) \mathscr{N}\left( \alpha ,\varepsilon \right) N(α,ε) 包含一个 { a n } n = 0 ∞ \left\{ a_n \right\} _{n=0}^{\infty} {an}n=0∞无限子序列 { a n } n = N ∞ = a N , a N + 1 , a N + 2 , ⋯ \left\{ a_n \right\} _{n=N}^{\infty}=a_{N,}a_{N+1},a_{N+2},\cdots {an}n=N∞=aN,aN+1,aN+2,⋯ 。为了数学上表达序列 { a n } n = 0 ∞ \left\{ a_n \right\} _{n=0}^{\infty} {an}n=0∞的收敛性,我们写成
∣ a n − a ∣ < ε , ∀ n ⩾ N \left| a_n-a \right|<\varepsilon ,\forall _n\geqslant N ∣an−a∣<ε,∀n⩾N
例如,序列
当 n → ∞ 时 { n n + 1 } n = 0 ∞ → 1 当n\rightarrow \infty 时\left\{ \frac{n}{n+1} \right\} _{n=0}^{\infty}\rightarrow 1 当n→∞时{n+1n}n=0∞→1
因为,如果我们对 ε > 0 \varepsilon >0 ε>0作任何选择,那么
∣ n n + 1 − 1 ∣ = ∣ − 1 n + 1 ∣ = 1 n + 1 < ε ⟹ n > 1 ε − 1 = 1 − ε ε \left| \frac{n}{n+1}-1 \right|=\left| \frac{-1}{n+1} \right|=\frac{1}{n+1}<\varepsilon \Longrightarrow n>\frac{1}{\varepsilon}-1=\frac{1-\varepsilon}{\varepsilon} ∣∣∣∣n+1n−1∣∣∣∣=∣∣∣∣n+1−1∣∣∣∣=n+11<ε⟹n>ε1−1=ε1−ε
因此,如果我们让
N = ∣ 1 − ε ε ∣ N=\left| \frac{1-\varepsilon}{\varepsilon} \right| N=∣∣∣∣ε1−ε∣∣∣∣
那么对于任何 n ⩾ N n\geqslant N n⩾N的整数,我们发现
∣ n n + 1 − 1 ∣ < ε \left| \frac{n}{n+1}-1 \right|<\varepsilon ∣∣∣∣n+1n−1∣∣∣∣<ε
向量范数
如果x是具有分量 x 1 , x 2 , ⋯ , x n x_{1,}x_{2,}\cdots ,x_n x1,x2,⋯,xn的向量,则其 p t h p^{th} pth-范数定义为:
∥ x ∥ p = ( ∑ j = 1 n ∣ x j ∣ p ) 1 p = ( ∣ x 1 ∣ p + ∣ x 2 ∣ p + ⋯ + ∣ x n ∣ p ) 1 p \left\| x \right\| _p=\left( \sum_{j=1}^n{\left| x_j \right|^p} \right) ^{\frac{1}{p}}=\left( \left| x_1 \right|^p+\left| x_2 \right|^p+\cdots +\left| x_n \right|^p \right) ^{\frac{1}{p}} ∥x∥p=(j=1∑n∣xj∣p)p1=(∣x1∣p+∣x2∣p+⋯+∣xn∣p)p1
满足 ∥ x ∥ 1 ⩾ ∥ x ∥ 2 ⩾ ⋯ ⩾ ∥ x ∥ ∞ \left\| x \right\| _1\geqslant \left\| x \right\| _2\geqslant \cdots \geqslant \left\| x \right\| _{\infty} ∥x∥1⩾∥x∥2⩾⋯⩾∥x∥∞。 范数 ∥ x ∥ 2 \left\| x \right\| _2 ∥x∥2给出了经典的欧几里得距离:
∥ x ∥ 2 = x 1 2 + x 2 2 + ⋯ x n 2 \left\| x \right\| _2=\sqrt{x_{1}^{2}+x_{2}^{2}+\cdots x_{n}^{2}} ∥x∥2=x12+x22+⋯xn2
Python函数norm(位于numpy.linalg库中)接收向量x和整数p或np.inf,并返回 ∥ x ∥ p \left\| x \right\| _p ∥x∥p。
In [27]: x = np.array([1, -1, 2, -2, 3, -3])
In [28]: from numpy.linalg import norm
In [29]: n1, n2, n3 = norm(x, 1), norm(x, 2), norm(x, np.inf)
In [30]: print(n1, n2, n3)
12.0
5.29150262213
3.0
向量的收敛序列
向量空间中的距离可以使用任何范数来定义。 如果我们有两个向量x和y都在 R n \mathbb{R}^n Rn中,则x和y之间的距离可以由 ∥ x − y ∥ 1 , ∥ x − y ∥ 2 , ⋯ 或 ∥ x − y ∥ ∞ \left\| x-y \right\| _{1,}\left\| x-y \right\| _{2,}\cdots 或\left\| x-y \right\| _{\infty} ∥x−y∥1,∥x−y∥2,⋯或∥x−y∥∞定义。 通常,将 ∥ x − y ∥ 2 , 或 ∥ x − y ∥ ∞ \left\| x-y \right\| _{2,}或\left\| x-y \right\| _{\infty} ∥x−y∥2,或∥x−y∥∞用作两个向量x和y之间距离的值。
迭代方法
解决方程组线性系统的迭代方法是从给定的初始猜测 x ( 0 ) x^{\left( 0 \right)} x(0)开始并生成向量 x ( 0 ) , x ( 1 ) , ⋯ x^{\left( 0 \right)},x^{\left( 1 \right)},\cdots x(0),x(1),⋯ 的序列,收敛到线性系统 x = x ∗ x=x^* x=x∗的解。 生成的序列在满足 ∥ x ( s ) − x ( s − 1 ) ∥ < ε \left\| x^{\left( s \right)}-x^{\left( s-1 \right)} \right\| <\varepsilon ∥∥x(s)−x(s−1)∥∥<ε的某些向量x(s)处停止。
其中 ∥ ∥ \left\| \right\| ∥∥ 是 R n \mathbb{R}^n Rn中的一些范数,并且ε> 0是给定的公差。 然后,线性系统 x ∗ x^* x∗的解近似为 x ( s ) x^{\left( s \right)} x(s),即 x ∗ ≈ x ( s ) x^*\approx x^{\left( s \right)} x∗≈x(s)。
通常,有两种迭代方法:
- 静态迭代方法:在迭代k时,迭代方法从 x ( k − 1 ) x^{\left( k-1 \right)} x(k−1)计算 x ( k ) x^{\left( k \right)} x(k),而无需参考先前的历史记录。 这类方法包括Jacobi方法,Gauss-Seidel方法和松弛方法。
- 非平稳迭代方法:在迭代k时,迭代方法引用整个历史 x ( 0 ) , x ( 1 ) , ⋯ , x ( k − 1 ) x^{\left( 0 \right)},x^{\left( 1 \right)},\cdots ,x^{\left( k-1 \right)} x(0),x(1),⋯,x(k−1)来计算 x ( k ) x^{\left( k \right)} x(k)。 这类方法包括共轭梯度法和GMRES子空间法。
整体思路
给定线性系统Ax = b,ε> 0且初始点 x ( 0 ) x^{\left( 0 \right)} x(0)。 目的是在 R n \mathbb{R}^n Rn中生成向量序列:
x ( 0 ) , x ( 1 ) , x ( 2 ) , ⋯ x^{\left( 0 \right)},x^{\left( 1 \right)},x^{\left( 2 \right)},\cdots x(0),x(1),x(2),⋯
收敛到线性系统 A x = b Ax=b Ax=b的解,即是 lim k → ∞ x ( k ) = x ∗ \underset{k\rightarrow \infty}{\lim}x^{\left( k \right)}=x^* k→∞limx(k)=x∗。
序列的生成在某些迭代s处停止,如
∥ x ( s ) − x ( s − 1 ) ∥ < ε \left\| x^{\left( s \right)}-x^{\left( s-1 \right)} \right\| <\varepsilon ∥∥∥x(s)−x(s−1)∥∥∥<ε
在平稳迭代方法中,矩阵A表示为两个矩阵S和T的总和,即A = S T,其中S是可逆矩阵。 然后,将线性系统Ax = b替换为 ( S + T ) x = b \left( S+T \right) x=b (S+T)x=b或 S x = b − T x Sx=b-Tx Sx=b−Tx。
由于S是可逆的,所以我们将两侧乘以S -1并得到一个线性系统: x = B x + c x=Bx+c x=Bx+c。
其中 B = S − 1 T B=S^{-1}T B=S−1T和 C = S − 1 b C=S^{-1}b C=S−1b。
上述线性系统的解是不动点 x ∗ x^* x∗,其中 x ∗ = B x ∗ + c x^*=Bx^*+c x∗=Bx∗+c。
从给定的初始点 x ( 0 ) x^{\left( 0 \right)} x(0)开始,通过使用迭代关系 x ( k + 1 ) = B x ( k ) + c x^{\left( k+1 \right)}=Bx^{\left( k \right)}+c x(k+1)=Bx(k)+c来迭代逼近固定点。
在本节的整个过程中,我们假设矩阵A是三个矩阵L,D和U的和,其中:
L = ( l 0 0 0 ⋯ 0 0 0 a 2 , 1 0 0 ⋯ 0 0 0 a 3 , 1 a 3 , 2 0 ⋯ 0 0 0 ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ a n − 2 , 1 a n − 2 , 2 a n − 2 , 3 ⋯ 0 0 0 a n − 1 , 1 a n − 1 , 2 a n − 1 , 3 ⋯ a n − 1 , n − 2 0 0 a n , 1 a n , 2 a n , 3 ⋯ a n , n − 2 a n , n − 1 0 ) L=\left( \begin{matrix}{l} 0& 0& 0& \cdots& 0& 0& 0\\ a_{2,1}& 0& 0& \cdots& 0& 0& 0\\ a_{3,1}& a_{3,2}& 0& \cdots& 0& 0& 0\\ \vdots& \vdots& \vdots& \ddots& \vdots& \vdots& \vdots\\ a_{n-2,1}& a_{n-2,2}& a_{n-2,3}& \cdots& 0& 0& 0\\ a_{n-1,1}& a_{n-1,2}& a_{n-1,3}& \cdots& a_{n-1,n-2}& 0& 0\\ a_{n,1}& a_{n,2}& a_{n,3}& \cdots& a_{n,n-2}& a_{n,n-1}& 0\\\end{matrix} \right) L=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛l0a2,1a3,1⋮an−2,1an−1,1an,100a3,2⋮an−2,2an−1,2an,2000⋮an−2,3an−1,3an,3⋯⋯⋯⋱⋯⋯⋯000⋮0an−1,n−2an,n−2000⋮00an,n−1000⋮000⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
D = ( l a 1 , 1 0 0 ⋯ 0 0 0 0 a 2 , 2 0 ⋯ 0 0 0 0 0 a 3 , 3 ⋯ 0 0 0 ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ 0 0 0 ⋯ a n − 2 , n − 2 0 0 0 0 0 ⋯ 0 a n − 1 , n − 1 0 0 0 0 ⋯ 0 0 a n , n ) \boldsymbol{D}=\left( \begin{matrix}{l} \boldsymbol{a}_{1,1}& 0& 0& \cdots& 0& 0& 0\\ 0& \boldsymbol{a}_{2,2}& 0& \cdots& 0& 0& 0\\ 0& 0& \boldsymbol{a}_{3,3}& \cdots& 0& 0& 0\\ \vdots& \vdots& \vdots& \ddots& \vdots& \vdots& \vdots\\ 0& 0& 0& \cdots& \boldsymbol{a}_{\boldsymbol{n}-2,\boldsymbol{n}-2}& 0& 0\\ 0& 0& 0& \cdots& 0& \boldsymbol{a}_{\boldsymbol{n}-1,\boldsymbol{n}-1}& 0\\ 0& 0& 0& \cdots& 0& 0& \boldsymbol{a}_{\boldsymbol{n},\boldsymbol{n}}\\\end{matrix} \right) D=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛la1,100⋮0000a2,20⋮00000a3,3⋮000⋯⋯⋯⋱⋯⋯⋯000⋮an−2,n−200000⋮0an−1,n−10000⋮00an,n⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
U = ( l 0 a 1 , 2 a 1 , 3 ⋯ a 1 , n − 2 a 1 , n − 1 a 1 , n 0 0 a 2 , 3 ⋯ a 2 , n − 2 a 2 , n − 1 a 2 , n 0 0 0 ⋯ a 3 , n − 2 a 3 , n − 1 a 3 , n ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ 0 0 0 ⋯ 0 a n − 2 , n − 1 a n − 2 , n 0 0 0 ⋯ 0 0 a n − 1 , n 0 0 0 ⋯ 0 0 a n , n ) \boldsymbol{U}=\left( \begin{matrix}{l} 0& \boldsymbol{a}_{1,2}& \boldsymbol{a}_{1,3}& \cdots& \boldsymbol{a}_{1,\boldsymbol{n}-2}& \boldsymbol{a}_{1,\boldsymbol{n}-1}& \boldsymbol{a}_{1,\boldsymbol{n}}\\ 0& 0& \boldsymbol{a}_{2,3}& \cdots& \boldsymbol{a}_{2,\boldsymbol{n}-2}& \boldsymbol{a}_{2,\boldsymbol{n}-1}& \boldsymbol{a}_{2,\boldsymbol{n}}\\ 0& 0& 0& \cdots& \boldsymbol{a}_{3,\boldsymbol{n}-2}& \boldsymbol{a}_{3,\boldsymbol{n}-1}& \boldsymbol{a}_{3,\boldsymbol{n}}\\ \vdots& \vdots& \vdots& \ddots& \vdots& \vdots& \vdots\\ 0& 0& 0& \cdots& 0& \boldsymbol{a}_{\boldsymbol{n}-2,\boldsymbol{n}-1}& \boldsymbol{a}_{\boldsymbol{n}-2,\boldsymbol{n}}\\ 0& 0& 0& \cdots& 0& 0& \boldsymbol{a}_{\boldsymbol{n}-1,\boldsymbol{n}}\\ 0& 0& 0& \cdots& 0& 0& \boldsymbol{a}_{\boldsymbol{n},\boldsymbol{n}}\\\end{matrix} \right) U=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛l000⋮000a1,200⋮000a1,3a2,30⋮000⋯⋯⋯⋱⋯⋯⋯a1,n−2a2,n−2a3,n−2⋮000a1,n−1a2,n−1a3,n−1⋮an−2,n−100a1,na2,na3,n⋮an−2,nan−1,nan,n⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
在MATLAB中,可以使用以下命令获得矩阵L,D和U:
>> D = diag(diag(A)) ;
>> L = tril(A) - D ;
>> U = triu(A) - D;
在Python中,tril,triu在scipy.linalg包中实现,而diag在scipy和numpy中都实现。 可以通过以下命令获得它们:
In [1]: import scipy as sp, numpy as np
In [2]: A = np.array([[4, 1, -1], [-1, 5, 1], [0, -1, 4]])
In [3]: print(’L = \n’, sp.linalg.tril(A), ’\nU = \n’,
sp.linalg.triu(A), ...
’\nD = \n’, np.diag(np.diag(A)))
L =
[[ 4 0 0]
[-1 5 0]
[ 0 -1 4]]
U =
[[ 4 1 -1]
[ 0 5 1]
[ 0 0 4]]
D =
[[4 0 0]
[0 5 0]
[0 0 4]]
雅可比法
给定方程的线性系统:
a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋮ a i 1 x 1 + a i 2 x 2 + ⋯ + a i n x n = b i ⋮ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b b \boldsymbol{a}_{11}\boldsymbol{x}_1+\boldsymbol{a}_{12}\boldsymbol{x}_2+\cdots +\boldsymbol{a}_{1\boldsymbol{n}}\boldsymbol{x}_{\boldsymbol{n}}=\boldsymbol{b}_1\\\boldsymbol{a}_{21}\boldsymbol{x}_1+\boldsymbol{a}_{22}\boldsymbol{x}_2+\cdots +\boldsymbol{a}_{2\boldsymbol{n}}\boldsymbol{x}_{\boldsymbol{n}}=\boldsymbol{b}_2\\\vdots \\\boldsymbol{a}_{\boldsymbol{i}1}\boldsymbol{x}_1+\boldsymbol{a}_{\boldsymbol{i}2}\boldsymbol{x}_2+\cdots +\boldsymbol{a}_{\boldsymbol{in}}\boldsymbol{x}_{\boldsymbol{n}}=\boldsymbol{b}_{\boldsymbol{i}}\\\vdots \\\boldsymbol{a}_{\boldsymbol{n}1}\boldsymbol{x}_1+\boldsymbol{a}_{\boldsymbol{n}2}\boldsymbol{x}_2+\cdots +\boldsymbol{a}_{\boldsymbol{nn}}\boldsymbol{x}_{\boldsymbol{n}}=\boldsymbol{b}_{\boldsymbol{b}} a11x1+a12x2+⋯+a1nxn=b1a21x1+a22x2+⋯+a2nxn=b2⋮ai1x1+ai2x2+⋯+ainxn=bi⋮an1x1+an2x2+⋯+annxn=bb
从上面的等式可以得出:
x 1 = 1 a 11 ( b 1 − a 12 x 2 − ⋯ − a n 1 x n ) x 2 = 1 a 22 ( b 2 − a 21 x 1 − a 23 x 3 − ⋯ − a n 1 x n ) ⋮ ⋮ x i = 1 a i i ( b i − a i 1 x 1 − ⋯ − a i i − 1 x i − 1 − a i i + 1 x i + 1 − ⋯ − a i n x n ) ⋮ ⋮ x n = 1 a n n ( b n − a n 1 x 1 − ⋯ − a n n − 1 x n − 1 ) \boldsymbol{x}_1=\frac{1}{\boldsymbol{a}_{11}}\left( \boldsymbol{b}_1-\boldsymbol{a}_{12}\boldsymbol{x}_2-\cdots -\boldsymbol{a}_{\boldsymbol{n}1}\boldsymbol{x}_{\boldsymbol{n}} \right) \\\boldsymbol{x}_2=\frac{1}{\boldsymbol{a}_{22}}\left( \boldsymbol{b}_2-\boldsymbol{a}_{21}\boldsymbol{x}_1-\boldsymbol{a}_{23}\boldsymbol{x}_3-\cdots -\boldsymbol{a}_{\boldsymbol{n}1}\boldsymbol{x}_{\boldsymbol{n}} \right) \\\vdots \,\, \vdots \\\boldsymbol{x}_{\boldsymbol{i}}=\frac{1}{\boldsymbol{a}_{\boldsymbol{ii}}}\left( \boldsymbol{b}_{\boldsymbol{i}}-\boldsymbol{a}_{\boldsymbol{i}1}\boldsymbol{x}_1-\cdots -\boldsymbol{a}_{\boldsymbol{ii}-1}\boldsymbol{x}_{\boldsymbol{i}-1}-\boldsymbol{a}_{\boldsymbol{ii}+1}\boldsymbol{x}_{\boldsymbol{i}+1}-\cdots -\boldsymbol{a}_{\boldsymbol{in}}\boldsymbol{x}_{\boldsymbol{n}} \right) \\\vdots \,\, \vdots \\\boldsymbol{x}_{\boldsymbol{n}}=\frac{1}{\boldsymbol{a}_{\boldsymbol{nn}}}\left( \boldsymbol{b}_{\boldsymbol{n}}-\boldsymbol{a}_{\boldsymbol{n}1}\boldsymbol{x}_1-\cdots -\boldsymbol{a}_{\boldsymbol{nn}-1}\boldsymbol{x}_{\boldsymbol{n}-1} \right) x1=a111(b1−a12x2−⋯−an1xn)x2=a221(b2−a21x1−a23x3−⋯−an1xn)⋮⋮xi=aii1(bi−ai1x1−⋯−aii−1xi−1−aii+1xi+1−⋯−ainxn)⋮⋮xn=ann1(bn−an1x1−⋯−ann−1xn−1)
雅可比法是一种迭代方法,它从对解
[
x
1
(
0
)
,
x
2
(
0
)
,
⋯
,
x
n
(
0
)
]
T
\left[ \boldsymbol{x}_{1}^{\left( 0 \right)},\boldsymbol{x}_{2}^{\left( 0 \right)},\cdots ,\boldsymbol{x}_{\boldsymbol{n}}^{\left( 0 \right)} \right] ^{\boldsymbol{T}}
[x1(0),x2(0),⋯,xn(0)]T的初始猜测开始。 然后,使用迭代
k
k
k中的解来找到迭代
k
+
1
k+1
k+1中系统解的近似值。
完成如下:
x 1 ( k + 1 ) = 1 a 11 ( b 1 − a 12 x 2 ( k ) − ⋯ − a n 1 x n ( k ) ) x 2 ( k + 1 ) = 1 a 22 ( b 2 − a 21 x 1 ( k ) − a 23 x 3 ( k ) − ⋯ − a n 1 x n ( k ) ) ⋮ ⋮ x i ( k + 1 ) = 1 a i i ( b i − a i 1 x 1 ( k ) − ⋯ − a i i − 1 x i − 1 ( k ) − a i i + 1 x i + 1 ( k ) − ⋯ − a i n x n ( k ) ) ⋮ ⋮ x n ( k + 1 ) = 1 a n n ( b n − a n 1 x 1 ( k ) − ⋯ − a n n − 1 x n − 1 ( k ) ) \boldsymbol{x}_{1}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{\boldsymbol{a}_{11}}\left( \boldsymbol{b}_1-\boldsymbol{a}_{12}\boldsymbol{x}_{2}^{\left( \boldsymbol{k} \right)}-\cdots -\boldsymbol{a}_{\boldsymbol{n}1}\boldsymbol{x}_{\boldsymbol{n}}^{\left( \boldsymbol{k} \right)} \right) \\\boldsymbol{x}_{2}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{\boldsymbol{a}_{22}}\left( \boldsymbol{b}_2-\boldsymbol{a}_{21}\boldsymbol{x}_{1}^{\left( \boldsymbol{k} \right)}-\boldsymbol{a}_{23}\boldsymbol{x}_{3}^{\left( \boldsymbol{k} \right)}-\cdots -\boldsymbol{a}_{\boldsymbol{n}1}\boldsymbol{x}_{\boldsymbol{n}}^{\left( \boldsymbol{k} \right)} \right) \\\vdots \,\, \vdots \\\boldsymbol{x}_{\boldsymbol{i}}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{\boldsymbol{a}_{\boldsymbol{ii}}}\left( \boldsymbol{b}_{\boldsymbol{i}}-\boldsymbol{a}_{\boldsymbol{i}1}\boldsymbol{x}_{1}^{\left( \boldsymbol{k} \right)}-\cdots -\boldsymbol{a}_{\boldsymbol{ii}-1}\boldsymbol{x}_{\boldsymbol{i}-1}^{\left( \boldsymbol{k} \right)}-\boldsymbol{a}_{\boldsymbol{ii}+1}\boldsymbol{x}_{\boldsymbol{i}+1}^{\left( \boldsymbol{k} \right)}-\cdots -\boldsymbol{a}_{\boldsymbol{in}}\boldsymbol{x}_{\boldsymbol{n}}^{\left( \boldsymbol{k} \right)} \right) \\\vdots \,\, \vdots \\\boldsymbol{x}_{\boldsymbol{n}}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{\boldsymbol{a}_{\boldsymbol{nn}}}\left( \boldsymbol{b}_{\boldsymbol{n}}-\boldsymbol{a}_{\boldsymbol{n}1}\boldsymbol{x}_{1}^{\left( \boldsymbol{k} \right)}-\cdots -\boldsymbol{a}_{\boldsymbol{nn}-1}\boldsymbol{x}_{\boldsymbol{n}-1}^{\left( \boldsymbol{k} \right)} \right) x1(k+1)=a111(b1−a12x2(k)−⋯−an1xn(k))x2(k+1)=a221(b2−a21x1(k)−a23x3(k)−⋯−an1xn(k))⋮⋮xi(k+1)=aii1(bi−ai1x1(k)−⋯−aii−1xi−1(k)−aii+1xi+1(k)−⋯−ainxn(k))⋮⋮xn(k+1)=ann1(bn−an1x1(k)−⋯−ann−1xn−1(k))
通常,迭代 x i ( k + 1 ) \boldsymbol{x}_{\boldsymbol{i}}^{\left( \boldsymbol{k}+1 \right)} xi(k+1)中的解可以表示为:
x i ( k + 1 ) = 1 a i i ( b i − ∑ j = 1 , j ≠ i n a i j x j ( k ) ) , i = 1 , ⋯ , n \boldsymbol{x}_{\boldsymbol{i}}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{\boldsymbol{a}_{\boldsymbol{ii}}}\left( \boldsymbol{b}_{\boldsymbol{i}}-\sum_{\boldsymbol{j}=1,\boldsymbol{j}\ne \boldsymbol{i}}^{\boldsymbol{n}}{\boldsymbol{a}_{\boldsymbol{ij}}\boldsymbol{x}_{\boldsymbol{j}}^{\left( \boldsymbol{k} \right)}} \right) ,\boldsymbol{i}=1,\cdots ,\boldsymbol{n} xi(k+1)=aii1⎝⎛bi−j=1,j=i∑naijxj(k)⎠⎞,i=1,⋯,n
对于任意 ε > 0 \boldsymbol{\varepsilon }>0 ε>0,当 ∥ x i ( k + 1 ) − x i ( k ) ∥ < ε \left\| \boldsymbol{x}_{\boldsymbol{i}}^{\left( \boldsymbol{k}+1 \right)}-\boldsymbol{x}_{\boldsymbol{i}}^{\left( \boldsymbol{k} \right)} \right\| <\boldsymbol{\varepsilon } ∥∥∥xi(k+1)−xi(k)∥∥∥<ε时,雅可比迭代停止。
**示例1,**为线性系统编写雅可比方法的前三个迭代:
( 2 − 1 1 − 2 5 − 1 1 − 2 4 ) ( x 1 x 2 x 3 ) = ( − 1 1 3 ) \left( \begin{matrix} 2& -1& 1\\ -2& 5& -1\\ 1& -2& 4\\\end{matrix} \right) \left( \begin{array}{c} \boldsymbol{x}_1\\ \boldsymbol{x}_2\\ \boldsymbol{x}_3\\\end{array} \right) =\left( \begin{array}{c} -1\\ 1\\ 3\\\end{array} \right) ⎝⎛2−21−15−21−14⎠⎞⎝⎛x1x2x3⎠⎞=⎝⎛−113⎠⎞
从零向量开始
x ( 0 ) = ( 0 0 0 ) \boldsymbol{x}^{\left( 0 \right)}=\left( \begin{array}{c} 0\\ 0\\ 0\\\end{array} \right) x(0)=⎝⎛000⎠⎞
解决
我们写成:
x 1 ( k + 1 ) = 1 2 ( − 1 + x 2 ( k ) − x 3 ( k ) ) x 2 ( k + 1 ) = 1 5 ( 1 + 2 x 1 ( k ) + x 3 ( k ) ) x 3 ( k + 1 ) = 1 4 ( 3 − x 1 ( k ) + 2 x 2 ( k ) ) \boldsymbol{x}_{1}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{2}\left( -1+\boldsymbol{x}_{2}^{\left( \boldsymbol{k} \right)}-\boldsymbol{x}_{3}^{\left( \boldsymbol{k} \right)} \right) \\\boldsymbol{x}_{2}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{5}\left( 1+2\boldsymbol{x}_{1}^{\left( \boldsymbol{k} \right)}+\boldsymbol{x}_{3}^{\left( \boldsymbol{k} \right)} \right) \\\boldsymbol{x}_{3}^{\left( \boldsymbol{k}+1 \right)}=\frac{1}{4}\left( 3-\boldsymbol{x}_{1}^{\left( \boldsymbol{k} \right)}+2\boldsymbol{x}_{2}^{\left( \boldsymbol{k} \right)} \right) x1(k+1)=21(−1+x2(k)−x3(k))x2(k+1)=51(1+2x1(k)+x3(k))x3(k+1)=41(3−x1(k)+2x2(k))
-
第一次迭代 k = 0 k=0 k=0
x 1 ( 1 ) = 1 2 ( − 1 + x 2 ( 0 ) − x 3 ( 0 ) ) = 1 2 ( − 1 + 0 − 0 ) = − 1 2 x 2 ( 1 ) = 1 5 ( 1 + 2 x 1 ( 0 ) + x 3 ( 0 ) ) = 1 5 ( 1 + 2 ( 0 ) + 0 ) = 1 5 x 3 ( 1 ) = 1 4 ( 3 − x 1 ( 0 ) + 2 x 2 ( 0 ) ) = 1 4 ( 3 − 0 + 2 ( 0 ) ) = 3 4 \boldsymbol{x}_{1}^{\left( 1 \right)}=\frac{1}{2}\left( -1+\boldsymbol{x}_{2}^{\left( 0 \right)}-\boldsymbol{x}_{3}^{\left( 0 \right)} \right) =\frac{1}{2}\left( -1+0-0 \right) =-\frac{1}{2}\\\boldsymbol{x}_{2}^{\left( 1 \right)}=\frac{1}{5}\left( 1+2\boldsymbol{x}_{1}^{\left( 0 \right)}+\boldsymbol{x}_{3}^{\left( 0 \right)} \right) =\frac{1}{5}\left( 1+2\left( 0 \right) +0 \right) =\frac{1}{5}\\\boldsymbol{x}_{3}^{\left( 1 \right)}=\frac{1}{4}\left( 3-\boldsymbol{x}_{1}^{\left( 0 \right)}+2\boldsymbol{x}_{2}^{\left( 0 \right)} \right) =\frac{1}{4}\left( 3-0+2\left( 0 \right) \right) =\frac{3}{4} x1(1)=21(−1+x2(0)−x3(0))=21(−1+0−0)=−21x2(1)=51(1+2x1(0)+x3(0))=51(1+2(0)+0)=51x3(1)=41(3−x1(0)+2x2(0))=41(3−0+2(0))=43
-
第二次迭代 k = 1 k=1 k=1
x 1 ( 2 ) = 1 2 ( − 1 + x 2 ( 1 ) − x 3 ( 1 ) ) = 1 2 ( − 1 + 1 5 − 3 4 ) = − 31 40 x 2 ( 2 ) = 1 5 ( 1 + 2 x 1 ( 1 ) + x 3 ( 1 ) ) = 1 5 ( 1 + 2 ⋅ − 1 2 + 3 4 ) = 3 20 x 3 ( 2 ) = 1 4 ( 3 − x 1 ( 1 ) + 2 x 2 ( 1 ) ) = 1 4 ( 3 − − 1 2 + 2 1 5 ) = 39 40 \boldsymbol{x}_{1}^{\left( 2 \right)}=\frac{1}{2}\left( -1+\boldsymbol{x}_{2}^{\left( 1 \right)}-\boldsymbol{x}_{3}^{\left( 1 \right)} \right) =\frac{1}{2}\left( -1+\frac{1}{5}-\frac{3}{4} \right) =-\frac{31}{40}\\\boldsymbol{x}_{2}^{\left( 2 \right)}=\frac{1}{5}\left( 1+2\boldsymbol{x}_{1}^{\left( 1 \right)}+\boldsymbol{x}_{3}^{\left( 1 \right)} \right) =\frac{1}{5}\left( 1+2\cdot \frac{-1}{2}+\frac{3}{4} \right) =\frac{3}{20}\\\boldsymbol{x}_{3}^{\left( 2 \right)}=\frac{1}{4}\left( 3-\boldsymbol{x}_{1}^{\left( 1 \right)}+2\boldsymbol{x}_{2}^{\left( 1 \right)} \right) =\frac{1}{4}\left( 3-\frac{-1}{2}+2\frac{1}{5} \right) =\frac{39}{40} x1(2)=21(−1+x2(1)−x3(1))=21(−1+51−43)=−4031x2(2)=51(1+2x1(1)+x3(1))=51(1+2⋅2−1+43)=203x3(2)=41(3−x1(1)+2x2(1))=41(3−2−1+251)=4039
-
第三次迭代 k = 2 k=2 k=2
x 1 ( 3 ) = 1 2 ( − 1 + x 2 ( 2 ) − x 3 ( 2 ) ) = 1 2 ( − 1 + 3 20 − 39 40 ) = − 73 80 x 2 ( 3 ) = 1 5 ( 1 + 2 x 1 ( 2 ) + x 3 ( 2 ) ) = 1 5 ( 1 + 2 ⋅ − 31 40 − − 73 80 ) = 17 200 x 3 ( 3 ) = 1 4 ( 3 − x 1 ( 2 ) + 2 x 2 ( 2 ) ) = 1 4 ( 3 − 31 40 + 2 3 20 ) = 163 160 \boldsymbol{x}_{1}^{\left( 3 \right)}=\frac{1}{2}\left( -1+\boldsymbol{x}_{2}^{\left( 2 \right)}-\boldsymbol{x}_{3}^{\left( 2 \right)} \right) =\frac{1}{2}\left( -1+\frac{3}{20}-\frac{39}{40} \right) =-\frac{73}{80}\\\boldsymbol{x}_{2}^{\left( 3 \right)}=\frac{1}{5}\left( 1+2\boldsymbol{x}_{1}^{\left( 2 \right)}+\boldsymbol{x}_{3}^{\left( 2 \right)} \right) =\frac{1}{5}\left( 1+2\cdot \frac{-31}{40}-\frac{-73}{80} \right) =\frac{17}{200}\\\boldsymbol{x}_{3}^{\left( 3 \right)}=\frac{1}{4}\left( 3-\boldsymbol{x}_{1}^{\left( 2 \right)}+2\boldsymbol{x}_{2}^{\left( 2 \right)} \right) =\frac{1}{4}\left( 3-\frac{31}{40}+2\frac{3}{20} \right) =\frac{163}{160} x1(3)=21(−1+x2(2)−x3(2))=21(−1+203−4039)=−8073x2(3)=51(1+2x1(2)+x3(2))=51(1+2⋅40−31−80−73)=20017x3(3)=41(3−x1(2)+2x2(2))=41(3−4031+2203)=160163
**示例2,**雅可比方法将用于求解线性系统:
( − 5 1 − 2 1 6 3 2 − 1 − 4 ) ( x 1 x 2 x 3 ) = ( 13 1 − 1 ) \left( \begin{matrix} -5& 1& -2\\ 1& 6& 3\\ 2& -1& -4\\\end{matrix} \right) \left( \begin{array}{c} \boldsymbol{x}_1\\ \boldsymbol{x}_2\\ \boldsymbol{x}_3\\\end{array} \right) =\left( \begin{array}{c} 13\\ 1\\ -1\\\end{array} \right) ⎝⎛−51216−1−23−4⎠⎞⎝⎛x1x2x3⎠⎞=⎝⎛131−1⎠⎞
MATLAB代码
function x = JacobiSolve(A, b, Eps)
n = length(b) ;
x0 = zeros(3, 1) ;
x = ones(size(x0)) ;
while norm(x-x0, inf) ≥ Eps
x0 = x ;
for i = 1 : n
x(i) = b(i) ;
for j = 1 : n
if j , i
x(i) = x(i) - A(i, j)*x0(j) ;
end
end
x(i) = x(i) / A(i, i) ;
end
>> A = [-5 1 -2; 1 6 3; 2 -1 -4] ;
>> b = [13; 1; -1] ;
>> JacobiSolveLinSystem(A, b)
-2.0000
1.0000
-1.0000
使用Python,功能JacobiSolve具有以下代码:
def JacobiSolve(A, b, Eps):
import numpy as np
n = len(b)
x0, x = np.zeros((n, 1), 'float'), np.ones((n, 1), 'float')
while np.linalg.norm(x-x0, np.inf) ≥ Eps:
x0 = x.copy()
for i in range(n):
x[i] = b[i]
for j in range(n):
if j != i:
x[i] -= A[i][j]*x0[j]
x[i] /= A[i][i]
return x
通过调用函数JacobiSolve求解给定的线性系统,我们获得:
In [3]: A = np.array([[-5, 1, -2], [1, 6, 3], [2, -1, -4]])
In [4]: b = np.array([[13], [1], [-1]])
In [5]: x = JacobiSolve(A, b, Eps)
In [6]: print(’x = \n’, x)
Out[6]:
x =
[[-2. ],
[ 1.00000002],
[-1.00000002]]
矩阵形式的雅可比法
向量形式的高斯-塞德尔方法
松弛法
最小二乘解
最小二乘解的一些应用
详情请参考 - 亚图跨际