MATLAB和Python迭代和最小二乘法求解线性系统

数学背景

本节介绍矢量范数的概念以及矢量空间 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 ana<ε,nN

例如,序列

当 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=01

因为,如果我们对 ε > 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+1n1=n+11=n+11<εn>ε11=ε1ε

因此,如果我们让

N = ∣ 1 − ε ε ∣ N=\left| \frac{1-\varepsilon}{\varepsilon} \right| N=ε1ε

那么对于任何 n ⩾ N n\geqslant N nN的整数,我们发现

∣ n n + 1 − 1 ∣ < ε \left| \frac{n}{n+1}-1 \right|<\varepsilon n+1n1<ε

向量范数

如果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}} xp=(j=1nxjp)p1=(x1p+x2p++xnp)p1

满足 ∥ x ∥ 1 ⩾ ∥ x ∥ 2 ⩾ ⋯ ⩾ ∥ x ∥ ∞ \left\| x \right\| _1\geqslant \left\| x \right\| _2\geqslant \cdots \geqslant \left\| x \right\| _{\infty} x1x2x。 范数 ∥ x ∥ 2 \left\| x \right\| _2 x2给出了经典的欧几里得距离:

∥ 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}} x2=x12+x22+xn2

Python函数norm(位于numpy.linalg库中)接收向量x和整数p或np.inf,并返回 ∥ x ∥ p \left\| x \right\| _p xp

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} xy1,xy2,xy定义。 通常,将 ∥ x − y ∥ 2 , 或 ∥ x − y ∥ ∞ \left\| x-y \right\| _{2,}或\left\| x-y \right\| _{\infty} xy2,xy用作两个向量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(s1)<ε的某些向量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)} xx(s)

通常,有两种迭代方法:

  1. 静态迭代方法:在迭代k时,迭代方法从 x ( k − 1 ) x^{\left( k-1 \right)} x(k1)计算 x ( k ) x^{\left( k \right)} x(k),而无需参考先前的历史记录。 这类方法包括Jacobi方法,Gauss-Seidel方法和松弛方法。
  2. 非平稳迭代方法:在迭代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(k1)来计算 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^* klimx(k)=x

序列的生成在某些迭代s处停止,如

∥ x ( s ) − x ( s − 1 ) ∥ < ε \left\| x^{\left( s \right)}-x^{\left( s-1 \right)} \right\| <\varepsilon x(s)x(s1)<ε

在平稳迭代方法中,矩阵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=bTx

由于S是可逆的,所以我们将两侧乘以S -1并得到一个线性系统: x = B x + c x=Bx+c x=Bx+c

其中 B = S − 1 T B=S^{-1}T B=S1T C = S − 1 b C=S^{-1}b C=S1b

上述线性系统的解是不动点 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,1an2,1an1,1an,100a3,2an2,2an1,2an,2000an2,3an1,3an,30000an1,n2an,n200000an,n1000000

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,1000000a2,2000000a3,3000000an2,n2000000an1,n1000000an,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=l000000a1,200000a1,3a2,30000a1,n2a2,n2a3,n2000a1,n1a2,n1a3,n1an2,n100a1,na2,na3,nan2,nan1,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=b2ai1x1+ai2x2++ainxn=bian1x1+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(b1a12x2an1xn)x2=a221(b2a21x1a23x3an1xn)xi=aii1(biai1x1aii1xi1aii+1xi+1ainxn)xn=ann1(bnan1x1ann1xn1)

雅可比法是一种迭代方法,它从对解 [ 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(b1a12x2(k)an1xn(k))x2(k+1)=a221(b2a21x1(k)a23x3(k)an1xn(k))xi(k+1)=aii1(biai1x1(k)aii1xi1(k)aii+1xi+1(k)ainxn(k))xn(k+1)=ann1(bnan1x1(k)ann1xn1(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)=aii1bij=1,j=inaijxj(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) 221152114x1x2x3=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(3x1(k)+2x2(k))

  1. 第一次迭代 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+00)=21x2(1)=51(1+2x1(0)+x3(0))=51(1+2(0)+0)=51x3(1)=41(3x1(0)+2x2(0))=41(30+2(0))=43

  2. 第二次迭代 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+5143)=4031x2(2)=51(1+2x1(1)+x3(1))=51(1+221+43)=203x3(2)=41(3x1(1)+2x2(1))=41(321+251)=4039

  3. 第三次迭代 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+2034039)=8073x2(3)=51(1+2x1(2)+x3(2))=51(1+240318073)=20017x3(3)=41(3x1(2)+2x2(2))=41(34031+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) 512161234x1x2x3=1311

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]]

矩阵形式的雅可比法

向量形式的高斯-塞德尔方法

松弛法

最小二乘解

最小二乘解的一些应用

详情请参考 - 亚图跨际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值