解线性方程组的python实现(1)——高斯主元消去法
解线性方程组的python实现1——高斯主元消去法
- 1. 高斯(顺序)主元消去法
- 1.1 消去过程
- 1.2 回代过程求解
- 实现代码
- 2 列主元消去法
- 实现代码
- 3 高斯-约旦(Gauss-Jordan)消去法
- 实现代码
\qquad假设线性方程组
{a00x0+a01x1+⋯+a0,n−1xn−1=b0a10x0+a11x1+⋯+a1,n−1xn−1=b1⋯⋯⋯⋯⋯⋯an−1,0x0+an−1,1x1+⋯+an−1,n−1xn−1=bn−1\qquad\qquad\left\{\begin{aligned}&a_{\scriptscriptstyle00}x_{\scriptscriptstyle0}+a_{\scriptscriptstyle01}x_{\scriptscriptstyle1}+\cdots+a_{\scriptscriptstyle0,n-1}x_{\scriptscriptstyle n-1}=b_{\scriptscriptstyle 0}\\ &a_{\scriptscriptstyle10}x_{\scriptscriptstyle0}+a_{\scriptscriptstyle11}x_{\scriptscriptstyle1}+\cdots+a_{\scriptscriptstyle1,n-1}x_{\scriptscriptstyle n-1}=b_{\scriptscriptstyle 1}\\ &\quad\cdots\quad\cdots\quad\cdots\quad\cdots\quad\cdots\quad\cdots\\ &a_{\scriptscriptstyle n-1,0}x_{\scriptscriptstyle0}+a_{\scriptscriptstyle n-1,1}x_{\scriptscriptstyle1}+\cdots+a_{\scriptscriptstyle n-1,n-1}x_{\scriptscriptstyle n-1}=b_{\scriptscriptstyle n-1}\end{aligned}\right.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a00x0+a01x1+⋯+a0,n−1xn−1=b0a10x0+a11x1+⋯+a1,n−1xn−1=b1⋯⋯⋯⋯⋯⋯an−1,0x0+an−1,1x1+⋯+an−1,n−1xn−1=bn−1
\qquad写成矩阵形式 AX=bAX=bAX=b,也就是
[a00a01⋯a0,n−1a10a11⋯a1,n−1⋮⋮⋮an−1,0an−1,1⋯an−1,n−1]⏟A[x0x1⋮xn−1]⏟X=[b0b1⋮bn−1]⏟b\qquad\qquad\underbrace{\begin{bmatrix} a_{\scriptscriptstyle 00}&a_{\scriptscriptstyle 01}&\cdots&a_{\scriptscriptstyle 0,n-1} \\ a_{\scriptscriptstyle 10}&a_{\scriptscriptstyle 11}&\cdots&a_{\scriptscriptstyle 1,n-1} \\ \vdots&\vdots& &\vdots\\ a_{\scriptscriptstyle n-1,0}&a_{\scriptscriptstyle n-1,1}&\cdots&a_{\scriptscriptstyle n-1,n-1} \end{bmatrix}}_A\underbrace{\begin{bmatrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle n-1}\end{bmatrix}}_X=\underbrace{\begin{bmatrix}b_{\scriptscriptstyle0}\\b_{\scriptscriptstyle1}\\\vdots\\b_{\scriptscriptstyle n-1}\end{bmatrix}}_bA⎣⎢⎢⎢⎡a00a10⋮an−1,0a01a11⋮an−1,1⋯⋯⋯a0,n−1a1,n−1⋮an−1,n−1⎦⎥⎥⎥⎤X⎣⎢⎢⎢⎡x0x1⋮xn−1⎦⎥⎥⎥⎤=b⎣⎢⎢⎢⎡b0b1⋮bn−1⎦⎥⎥⎥⎤
\qquad
\qquad消去法 (Elimination)\text{(Elimination)}(Elimination) 的基本思想,是将原方程组 AX=bAX=bAX=b 化为与其等价的上三角型方程组,并采用回代方法 (back substitution)\text{(back\ substitution)}(back substitution) 求解。
1. 高斯(顺序)主元消去法
\qquad基本的高斯主元消去法,是将系数矩阵 A(k)A^{(k)}A(k) 的对角线元素按默认顺序作为主元(因此,必须满足 akk(k)≠0a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}\neq0akk(k)=0),通过初等行变换将 AAA 的下三角部分元素变换为 000,也就得到了上三角型方程组。
1.1 消去过程
\qquad将初始的系数矩阵 AX=bAX=bAX=b 记为 A(0)X=b(0)A^{(0)}X=b^{(0)}A(0)X=b(0),也就是
[a00(0)a01(0)⋯a0,n−1(0)a10(0)a11(0)⋯a1,n−1(0)⋮⋮⋮an−1,0(0)an−1,1(0)⋯an−1,n−1(0)][x0x1⋮xn−1][b0(0)b1(0)⋮bn−1(0)]\qquad\qquad\left[\begin{matrix} a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}&a_{\scriptscriptstyle 01}^{\scriptscriptstyle(0)}&\cdots&a_{\scriptscriptstyle 0,n-1}^{\scriptscriptstyle(0)} \\ a_{\scriptscriptstyle 10}^{\scriptscriptstyle(0)}&a_{\scriptscriptstyle 11}^{\scriptscriptstyle(0)}&\cdots&a_{\scriptscriptstyle 1,n-1}^{\scriptscriptstyle(0)} \\ \vdots&\vdots& &\vdots\\ a_{\scriptscriptstyle n-1,0}^{\scriptscriptstyle(0)}&a_{\scriptscriptstyle n-1,1}^{\scriptscriptstyle(0)}&\cdots&a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(0)} \end{matrix}\right]\left[\begin{matrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle n-1}\end{matrix}\right]\left[\begin{matrix}b_{\scriptscriptstyle0}^{\scriptscriptstyle(0)}\\b_{\scriptscriptstyle1}^{\scriptscriptstyle(0)}\\\vdots\\b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(0)}\end{matrix}\right]⎣⎢⎢⎢⎡a00(0)a10(0)⋮an−1,0(0)a01(0)a11(0)⋮an−1,1(0)⋯⋯⋯a0,n−1(0)a1,n−1(0)⋮an−1,n−1(0)⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡x0x1⋮xn−1⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡b0(0)b1(0)⋮bn−1(0)⎦⎥⎥⎥⎤
第 0 步\textcolor{crimson}{\text{第 0 步}}第 0 步 :将 a00(0)≠0a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}\neq0a00(0)=0 作为主元,进行初等行变换
\qquad 使得 A(0)A^{(0)}A(0) 第 000 列的第 1∼n−11\sim n-11∼n−1 行的元素 ai0(0)=0,i=1,2,⋯,n−1a_{\scriptscriptstyle i0}^{\scriptscriptstyle(0)}=0,\ i=1,2,\cdots,n-1ai0(0)=0, i=1,2,⋯,n−1
↓\qquad\qquad\qquad\quad\downarrow↓
[a00(0)‾a01(0)⋯a0,n−1(0)a10(0)a11(0)⋯a1,n−1(0)⋮⋮⋮ai0(0)ai1(0)⋯ai,n−1(0)⋮⋮⋮an−1,0(0)an−1,1(0)⋯an−1,n−1(0)]⏟A(0)[x0x1⋮xi⋮xn−1][b0(0)b1(1)⋮bi(1)⋮bn−1(1)]⏟b(0)\qquad\qquad\qquad\underbrace{\left[\begin{matrix} \textcolor{red}{\underline{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}}}&\textcolor{red}{a_{\scriptscriptstyle 01}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}^{\scriptscriptstyle(0)}} \\ \textcolor{blue}{a_{\scriptscriptstyle 10}^{\scriptscriptstyle(0)}}&a_{\scriptscriptstyle 11}^{\scriptscriptstyle(0)}&\cdots&a_{\scriptscriptstyle 1,n-1}^{\scriptscriptstyle(0)} \\ \vdots&\vdots& &\vdots\\ \textcolor{blue}{a_{\scriptscriptstyle i0}^{\scriptscriptstyle(0)}}&a_{\scriptscriptstyle i1}^{\scriptscriptstyle(0)}&\cdots&a_{\scriptscriptstyle i,n-1}^{\scriptscriptstyle(0)} \\ \vdots&\vdots& &\vdots\\ \textcolor{blue}{a_{\scriptscriptstyle n-1,0}^{\scriptscriptstyle(0)}}&a_{\scriptscriptstyle n-1,1}^{\scriptscriptstyle(0)}&\cdots&a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(0)} \end{matrix}\right]}_{A^{(0)}}\left[\begin{matrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle i}\\\vdots\\x_{\scriptscriptstyle n-1}\end{matrix}\right]\underbrace{\left[\begin{matrix}\textcolor{red}{b_{\scriptscriptstyle0}^{\scriptscriptstyle(0)}}\\b_{\scriptscriptstyle1}^{\scriptscriptstyle(1)}\\\vdots\\b_{\scriptscriptstyle i}^{\scriptscriptstyle(1)}\\\vdots\\b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(1)}\end{matrix}\right]}_{b^{(0)}}A(0)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡a00(0)a10(0)⋮ai0(0)⋮an−1,0(0)a01(0)a11(0)⋮ai1(0)⋮an−1,1(0)⋯⋯⋯⋯a0,n−1(0)a1,n−1(0)⋮ai,n−1(0)⋮an−1,n−1(0)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡x0x1⋮xi⋮xn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤b(0)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡b0(0)b1(1)⋮bi(1)⋮bn−1(1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤⟵\begin{matrix} \\ \\ \\ \longleftarrow\\ \\ \\ \end{matrix}⟵
\qquad
\qquad 初等行变换为:{aij(1)=aij(0)−a0j(0)ai0(0)a00(0),i=1∼n−1,j=0∼n−1bi(1)=bi(0)−b0(0)ai0(0)a00(0),i=1∼n−1\left\{\begin{aligned}a_{\scriptscriptstyle ij}^{\scriptscriptstyle(1)}&=a_{\scriptscriptstyle ij}^{\scriptscriptstyle(0)}-a_{\scriptscriptstyle 0j}^{\scriptscriptstyle(0)}\dfrac{a_{\scriptscriptstyle i0}^{\scriptscriptstyle(0)}}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}} ,\quad i=1\sim n-1,\ j=0\sim n-1\\ \\ b_{\scriptscriptstyle i}^{\scriptscriptstyle(1)}&=b_{\scriptscriptstyle i}^{\scriptscriptstyle(0)}-b_{\scriptscriptstyle 0}^{\scriptscriptstyle(0)}\dfrac{a_{\scriptscriptstyle i0}^{\scriptscriptstyle(0)}}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}} ,\quad i=1\sim n-1\end{aligned} \right.⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧aij(1)bi(1)=aij(0)−a0j(0)a00(0)ai0(0),i=1∼n−1, j=0∼n−1=bi(0)−b0(0)a00(0)ai0(0),i=1∼n−1
\qquad
\qquad 从而得到 A(1)X=b(1)A^{(1)}X=b^{(1)}A(1)X=b(1)
\qquad 显然,当 j=0j=0j=0 时,ai0(1)=ai0(0)−a00(0)ai0(0)a00(0)=0,i=1∼n−1a_{\scriptscriptstyle i0}^{\scriptscriptstyle(1)}=a_{\scriptscriptstyle i0}^{\scriptscriptstyle(0)}-a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}\dfrac{a_{\scriptscriptstyle i0}^{\scriptscriptstyle(0)}}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}}=0,\ i=1\sim n-1ai0(1)=ai0(0)−a00(0)a00(0)ai0(0)=0, i=1∼n−1。
\qquad
[a00(0)a01(0)⋯a0,n−1(0)0a11(1)‾⋯a1,n−1(1)⋮⋮⋮0ai1(1)⋯ai,n−1(1)⋮⋮⋮0an−1,1(1)⋯an−1,n−1(1)]⏟A(1)[x0x1⋮xi⋮xn−1][b0(0)b1(1)⋮bi(1)⋮bn−1(1)]⏟b(1)\qquad\qquad\qquad\underbrace{\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}}&\textcolor{red}{a_{\scriptscriptstyle 01}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}^{\scriptscriptstyle(0)}} \\ \textcolor{red}{\scriptstyle0}&\textcolor{red}{\underline{a_{\scriptscriptstyle 11}^{\scriptscriptstyle(1)}}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}^{\scriptscriptstyle(1)}} \\ \vdots&\vdots& &\vdots\\ \textcolor{red}{\scriptstyle0}&a_{\scriptscriptstyle i1}^{\scriptscriptstyle(1)}&\cdots&a_{\scriptscriptstyle i,n-1}^{\scriptscriptstyle(1)} \\ \vdots&\vdots& &\vdots\\ \textcolor{red}{\scriptstyle0}&a_{\scriptscriptstyle n-1,1}^{\scriptscriptstyle(1)}&\cdots&a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(1)} \end{matrix}\right]}_{A^{(1)}}\left[\begin{matrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle i}\\\vdots\\x_{\scriptscriptstyle n-1}\end{matrix}\right]\underbrace{\left[\begin{matrix}\textcolor{red}{b_{\scriptscriptstyle0}^{\scriptscriptstyle(0)}}\\\textcolor{red}{b_{\scriptscriptstyle1}^{\scriptscriptstyle(1)}}\\\vdots\\b_{\scriptscriptstyle i}^{\scriptscriptstyle(1)}\\\vdots\\b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(1)}\end{matrix}\right]}_{b^{(1)}}A(1)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡a00(0)0⋮0⋮0a01(0)a11(1)⋮ai1(1)⋮an−1,1(1)⋯⋯⋯⋯a0,n−1(0)a1,n−1(1)⋮ai,n−1(1)⋮an−1,n−1(1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡x0x1⋮xi⋮xn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤b(1)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡b0(0)b1(1)⋮bi(1)⋮bn−1(1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
\qquad
\qquad紧接着的第 2\text{2}2 步,按照默认次序,以 a11(1)a_{\scriptscriptstyle 11}^{\scriptscriptstyle(1)}a11(1) 作为主元,再次通过初等行变换,消去 A(1)A^{(1)}A(1) 第 111 列的第 2∼n−12\sim n-12∼n−1 行的元素 ai1(1)=0,i=2,⋯,n−1a_{\scriptscriptstyle i1}^{\scriptscriptstyle(1)}=0,\ i=2,\cdots,n-1ai1(1)=0, i=2,⋯,n−1。依次类推……至第 k\text{k}k 步。
\qquad
\qquad
第 k 步\textcolor{crimson}{\text{第 k 步}}第 k 步:线性方程组为 A(k)X=b(k)A^{(k)}X=b^{(k)}A(k)X=b(k),将 akk(k)≠0a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}\neq0akk(k)=0 作为主元,进行初等行变换
\qquad 使得 A(k)A^{(k)}A(k) 第 kkk 列的第 k+1∼n−1k+1\sim n-1k+1∼n−1 行的元素 aik(k)=0,i=k+1,⋯,n−1a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k)}=0,\ i=k+1,\cdots,n-1aik(k)=0, i=k+1,⋯,n−1
↓\qquad\qquad\qquad\qquad\qquad\qquad\qquad\downarrow↓
[a00(0)a01(0)⋯a0k(0)⋯a0,n−1(0)a11(1)⋯a1k(1)⋯a1,n−1(1)⋱⋮⋮akk(k)‾⋯ak,n−1(k)ak+1,k(k)⋯ak+1,n−1(k)⋮⋮aik(k)⋯ai,n−1(k)⋮⋮an−1,k(k)⋯an−1,n−1(k)]⏟A(k)[x0x1⋮xkxk+1⋮xi⋮xn−1][b0(0)b1(1)⋮bk(k)bk+1(k)⋮bi(k)⋮bn−1(k)]⏟b(k)\qquad\qquad\qquad\underbrace{\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}}&\textcolor{red}{a_{\scriptscriptstyle 01}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0k}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}^{\scriptscriptstyle(0)}} \\ &\textcolor{red}{a_{\scriptscriptstyle 11}^{\scriptscriptstyle(1)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1k}^{\scriptscriptstyle(1)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}^{\scriptscriptstyle(1)}} \\ &&\ddots&\vdots&&\vdots\\ &&&\textcolor{red}{\underline{a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle k,n-1}^{\scriptscriptstyle(k)}} \\ &&&\textcolor{blue}{a_{\scriptscriptstyle k+1,k}^{\scriptscriptstyle(k)}}&\cdots&a_{\scriptscriptstyle k+1,n-1}^{\scriptscriptstyle(k)} \\ && &\vdots&&\vdots \\ &&&\textcolor{blue}{a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k)}}&\cdots&a_{\scriptscriptstyle i,n-1}^{\scriptscriptstyle(k)} \\ && &\vdots&&\vdots \\ & & &\textcolor{blue}{a_{\scriptscriptstyle n-1,k}^{\scriptscriptstyle(k)}}&\cdots&a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(k)} \end{matrix}\right]}_{A^{(k)}}\left[\begin{matrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle k}\\ x_{\scriptscriptstyle k+1} \\ \vdots \\ x_{\scriptscriptstyle i}\\\vdots\\x_{\scriptscriptstyle n-1}\end{matrix}\right]\underbrace{\left[\begin{matrix}\textcolor{red}{b_{\scriptscriptstyle0}^{\scriptscriptstyle(0)}}\\\textcolor{red}{b_{\scriptscriptstyle1}^{\scriptscriptstyle(1)}}\\\vdots\\\textcolor{red}{b_{\scriptscriptstyle k}^{\scriptscriptstyle(k)}}\\ b_{\scriptscriptstyle k+1}^{\scriptscriptstyle(k)}\\ \vdots\\b_{\scriptscriptstyle i}^{\scriptscriptstyle(k)}\\\vdots\\b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(k)}\end{matrix}\right]}_{b^{(k)}}A(k)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a00(0)a01(0)a11(1)⋯⋯⋱a0k(0)a1k(1)⋮akk(k)ak+1,k(k)⋮aik(k)⋮an−1,k(k)⋯⋯⋯⋯⋯⋯a0,n−1(0)a1,n−1(1)⋮ak,n−1(k)ak+1,n−1(k)⋮ai,n−1(k)⋮an−1,n−1(k)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x0x1⋮xkxk+1⋮xi⋮xn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤b(k)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡b0(0)b1(1)⋮bk(k)bk+1(k)⋮bi(k)⋮bn−1(k)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⟵\begin{matrix} \\ \\ \\ \\ \\ \\ \longleftarrow\\ \\ \\ \end{matrix}⟵
\qquad
\qquad 初等行变换为:{aij(k+1)=aij(k)−akj(k)aik(k)akk(k),i=k+1∼n−1,j=k∼n−1bi(k+1)=bi(k)−bk(k)aik(k)akk(k),i=k+1∼n−1\left\{\begin{aligned}a_{\scriptscriptstyle ij}^{\scriptscriptstyle(k+1)}&=a_{\scriptscriptstyle ij}^{\scriptscriptstyle(k)}-a_{\scriptscriptstyle kj}^{\scriptscriptstyle(k)}\dfrac{a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k)}}{a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}} ,\quad i=k+1\sim n-1,\ j=k\sim n-1\\ \\ b_{\scriptscriptstyle i}^{\scriptscriptstyle(k+1)}&=b_{\scriptscriptstyle i}^{\scriptscriptstyle(k)}-b_{\scriptscriptstyle k}^{\scriptscriptstyle(k)}\dfrac{a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k)}}{a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}} ,\quad i=k+1\sim n-1 \end{aligned} \right.⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧aij(k+1)bi(k+1)=aij(k)−akj(k)akk(k)aik(k),i=k+1∼n−1, j=k∼n−1=bi(k)−bk(k)akk(k)aik(k),i=k+1∼n−1
\qquad
\qquad 从而得到 A(k+1)X=b(k+1)A^{(k+1)}X=b^{(k+1)}A(k+1)X=b(k+1)
\qquad 显然,当 j=kj=kj=k 时,aik(k+1)=aik(k)−akk(k)aik(k)akk(k)=0,i=k+1∼n−1a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k+1)}=a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k)}-a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}\dfrac{a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k)}}{a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}}=0,\ i=k+1\sim n-1aik(k+1)=aik(k)−akk(k)akk(k)aik(k)=0, i=k+1∼n−1。
\qquad
[a00(0)a01(0)⋯a0k(0)a0,k+1(0)⋯a0,n−1(0)a11(1)⋯a1k(1)a1,k+1(0)⋯a1,n−1(1)⋱⋮⋮⋮akk(k)ak,k+1(k)⋯ak,n−1(k)0ak+1,k+1(k+1)⋯ak+1,n−1(k+1)⋮⋮⋮0ai,k+1(k+1)⋯ai,n−1(k+1)⋮⋮⋮0an−1,k+1(k+1)⋯an−1,n−1(k+1)]⏟A(k+1)[x0x1⋮xkxk+1⋮xi⋮xn−1][b0(0)b1(1)⋮bk(k)bk+1(k+1)⋮bi(k+1)⋮bn−1(k+1)]⏟b(k+1)\qquad\qquad\qquad\underbrace{\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}}&\textcolor{red}{a_{\scriptscriptstyle 01}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0k}^{\scriptscriptstyle(0)}}&\textcolor{red}{a_{\scriptscriptstyle 0,k+1}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}^{\scriptscriptstyle(0)}} \\ &\textcolor{red}{a_{\scriptscriptstyle 11}^{\scriptscriptstyle(1)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1k}^{\scriptscriptstyle(1)}}&\textcolor{red}{a_{\scriptscriptstyle 1,k+1}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}^{\scriptscriptstyle(1)}} \\ &&\ddots&\vdots&\vdots&&\vdots\\ &&&\textcolor{red}{a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}}&\textcolor{red}{a_{\scriptscriptstyle k,k+1}^{\scriptscriptstyle(k)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle k,n-1}^{\scriptscriptstyle(k)}} \\ &&&\textcolor{red}{\scriptstyle0}&\textcolor{red}{a_{\scriptscriptstyle k+1,k+1}^{\scriptscriptstyle(k+1)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle k+1,n-1}^{\scriptscriptstyle(k+1)}} \\ && &\vdots&\vdots&&\vdots \\ &&&\textcolor{red}{\scriptstyle0}&a_{\scriptscriptstyle i,k+1}^{\scriptscriptstyle(k+1)}&\cdots&a_{\scriptscriptstyle i,n-1}^{\scriptscriptstyle(k+1)} \\ && &\vdots&\vdots&&\vdots \\ & & &\textcolor{red}{\scriptstyle0}&a_{\scriptscriptstyle n-1,k+1}^{\scriptscriptstyle(k+1)}&\cdots&a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(k+1)} \end{matrix}\right]}_{A^{(k+1)}}\left[\begin{matrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle k}\\ x_{\scriptscriptstyle k+1} \\ \vdots \\ x_{\scriptscriptstyle i}\\\vdots\\x_{\scriptscriptstyle n-1}\end{matrix}\right]\underbrace{\left[\begin{matrix}\textcolor{red}{b_{\scriptscriptstyle0}^{\scriptscriptstyle(0)}}\\\textcolor{red}{b_{\scriptscriptstyle1}^{\scriptscriptstyle(1)}}\\\vdots\\\textcolor{red}{b_{\scriptscriptstyle k}^{\scriptscriptstyle(k)}}\\ \textcolor{red}{b_{\scriptscriptstyle k+1}^{\scriptscriptstyle(k+1)}}\\ \vdots\\b_{\scriptscriptstyle i}^{\scriptscriptstyle(k+1)}\\\vdots\\b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(k+1)}\end{matrix}\right]}_{b^{(k+1)}}A(k+1)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a00(0)a01(0)a11(1)⋯⋯⋱a0k(0)a1k(1)⋮akk(k)0⋮0⋮0a0,k+1(0)a1,k+1(0)⋮ak,k+1(k)ak+1,k+1(k+1)⋮ai,k+1(k+1)⋮an−1,k+1(k+1)⋯⋯⋯⋯⋯⋯a0,n−1(0)a1,n−1(1)⋮ak,n−1(k)ak+1,n−1(k+1)⋮ai,n−1(k+1)⋮an−1,n−1(k+1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x0x1⋮xkxk+1⋮xi⋮xn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤b(k+1)⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡b0(0)b1(1)⋮bk(k)bk+1(k+1)⋮bi(k+1)⋮bn−1(k+1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
\qquad
\qquad 若令 mik=aik(k)akk(k)m_{ik}=\dfrac{a_{\scriptscriptstyle ik}^{\scriptscriptstyle(k)}}{a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}}mik=akk(k)aik(k),i=k+1,∼n−1,\quad i=k+1,\sim n-1,i=k+1,∼n−1,得到了高斯消去法的公式:
{aij(k+1)=aij(k)−akj(k)mik,i=k+1∼n−1,j=k∼n−1bi(k+1)=bi(k)−bk(k)mik,i=k+1∼n−1\qquad\qquad\qquad\left\{\begin{aligned}a_{\scriptscriptstyle ij}^{\scriptscriptstyle(k+1)}&=a_{\scriptscriptstyle ij}^{\scriptscriptstyle(k)}-a_{\scriptscriptstyle kj}^{\scriptscriptstyle(k)}m_{ik} ,\quad i=k+1\sim n-1,\ j=k\sim n-1\\ \\ b_{\scriptscriptstyle i}^{\scriptscriptstyle(k+1)}&=b_{\scriptscriptstyle i}^{\scriptscriptstyle(k)}-b_{\scriptscriptstyle k}^{\scriptscriptstyle(k)}m_{ik} ,\quad i=k+1\sim n-1 \end{aligned} \right.⎩⎪⎨⎪⎧aij(k+1)bi(k+1)=aij(k)−akj(k)mik,i=k+1∼n−1, j=k∼n−1=bi(k)−bk(k)mik,i=k+1∼n−1
\qquad经过 nnn 步之后,得到与原方程组等价的方程组 A(n−1)X=b(n−1)A^{(n-1)}X=b^{(n-1)}A(n−1)X=b(n−1),也就是
[a00(0)a01(0)⋯a0,n−1(0)a11(1)⋯a1,n−1(1)⋱⋮an−1,n−1(n−1)]⏟A(n−1)[x0x1⋮xn−1][b0(0)b1(1)⋮bn−1(n−1)]⏟b(n−1)\qquad\qquad\qquad\underbrace{\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}}&\textcolor{red}{a_{\scriptscriptstyle 01}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}^{\scriptscriptstyle(0)}} \\ &\textcolor{red}{a_{\scriptscriptstyle 11}^{\scriptscriptstyle(1)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}^{\scriptscriptstyle(1)}} \\ &&\ddots&\vdots\\ &&&\textcolor{red}{a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(n-1)}} \end{matrix}\right]}_{A^{(n-1)}}\left[\begin{matrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle n-1}\end{matrix}\right]\underbrace{\left[\begin{matrix}\textcolor{red}{b_{\scriptscriptstyle0}^{\scriptscriptstyle(0)}}\\\textcolor{red}{b_{\scriptscriptstyle1}^{\scriptscriptstyle(1)}}\\\vdots\\\textcolor{red}{b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(n-1)}}\end{matrix}\right]}_{b^{(n-1)}}A(n−1)⎣⎢⎢⎢⎡a00(0)a01(0)a11(1)⋯⋯⋱a0,n−1(0)a1,n−1(1)⋮an−1,n−1(n−1)⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡x0x1⋮xn−1⎦⎥⎥⎥⎤b(n−1)⎣⎢⎢⎢⎡b0(0)b1(1)⋮bn−1(n−1)⎦⎥⎥⎥⎤
\qquad
1.2 回代过程求解
\qquad如果 A(n−1)X=b(n−1)A^{(n-1)}X=b^{(n-1)}A(n−1)X=b(n−1) 中的 A(n−1)A^{(n-1)}A(n−1) 是可逆,那么方程组具有唯一解。
\qquad由于 A(n−1)A^{(n-1)}A(n−1) 是上三角阵,因此求解 X=[x0,⋯,xn−1]TX=[x_0,\cdots,x_{n-1}]^TX=[x0,⋯,xn−1]T 是一个回代过程:
(1)\qquad(1)(1) 首先由第 n−1n-1n−1 (最后一个)方程,求出 xn−1=bn−1(n−1)an−1,n−1(n−1)x_{n-1}=\dfrac{b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(n-1)}}{a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(n-1)}}xn−1=an−1,n−1(n−1)bn−1(n−1)
(2)\qquad(2)(2) 将已求出的 xn−1x_{n-1}xn−1 代入到第 n−2n-2n−2 (倒数第二个)方程,求出 xn−2x_{n-2}xn−2
(3)\qquad(3)(3) 依次类推,直到 x1,⋯,xn−1x_1,\cdots,x_{n-1}x1,⋯,xn−1 都求出之后,代入到第 000 方程(第一个)方程,求出 x0x_0x0
\qquad其计算公式归纳为:
{xn−1=bn−1(n−1)an−1,n−1(n−1)xk=bk(k)−∑j=k+1n−1akj(k)xjakk(k),i=n−2,n−3,⋯,0\qquad\qquad\qquad\left\{\begin{aligned}x_{\scriptscriptstyle n-1}&=\dfrac{b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(n-1)}}{a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(n-1)}}\\ \\ x_{\scriptscriptstyle k}&=\dfrac{b_{\scriptscriptstyle k}^{\scriptscriptstyle(k)}-\sum\limits_{j=k+1}^{n-1}a_{\scriptscriptstyle kj}^{\scriptscriptstyle(k)}x_{\scriptscriptstyle j}}{a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}} ,\quad i=n-2,n-3,\cdots,0 \end{aligned} \right.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧xn−1xk=an−1,n−1(n−1)bn−1(n−1)=akk(k)bk(k)−j=k+1∑n−1akj(k)xj,i=n−2,n−3,⋯,0
\qquad
实现代码
import numpy as npdef basic_gauss(A,b):# 基本高斯消去法augA = np.concatenate((A,b),axis=1)print('augmented A:\n',augA)rows = A.shape[0]# eliminationfor k in range(rows):for i in range(k+1,rows):mi = augA[i,k]/augA[k,k] # augA[k,k]不能为0augA[i,:] = augA[i,:] - augA[k,:]*miprint('#elimination:\n',augA) # back substitution x = np.zeros(rows) k = rows-1x[k] = augA[k,-1]/augA[k,k] for k in range(rows-2,-1,-1):tx = x[k+1:]ta = augA[k,k+1:-1].flatten()x[k] = (augA[k,-1]-np.sum(tx*ta))/augA[k,k] return x
if __name__ == '__main__': A = np.array([[1, 1, 1, 1],[0, 4,-1, 2],[2,-2, 1, 4],[3, 1,-3, 2]],dtype='float')b = np.array([[10,13,17,4]],dtype='float').Tx = basic_gauss(A,b)print('x =',x)
计算结果:
augmented A:[[ 1. 1. 1. 1. 10.][ 0. 4. -1. 2. 13.][ 2. -2. 1. 4. 17.][ 3. 1. -3. 2. 4.]]
#elimination:[[ 1. 1. 1. 1. 10.][ 0. 4. -1. 2. 13.][ 0. -4. -1. 2. -3.][ 0. -2. -6. -1. -26.]]
#elimination:[[ 1. 1. 1. 1. 10. ][ 0. 4. -1. 2. 13. ][ 0. 0. -2. 4. 10. ][ 0. 0. -6.5 0. -19.5]]
#elimination:[[ 1. 1. 1. 1. 10.][ 0. 4. -1. 2. 13.][ 0. 0. -2. 4. 10.][ 0. 0. 0. -13. -52.]]
#elimination:[[ 1. 1. 1. 1. 10.][ 0. 4. -1. 2. 13.][ 0. 0. -2. 4. 10.][ 0. 0. 0. -13. -52.]]
x = [1. 2. 3. 4.]
\qquad
2 列主元消去法
\qquad在高斯消去法将系数矩阵 AAA 变换为上三角矩阵的过程中:
(1)\qquad(1)(1) 如果出现 akk(k)=0a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}=0akk(k)=0 的情况,会导致消去法无法继续;
(2)\qquad(2)(2) 如果 akk(k)a_{\scriptscriptstyle kk}^{\scriptscriptstyle(k)}akk(k) 非常接近于 000,会导致其他系数值的严重增长和舍入误差的扩散。
\qquad 也就是说,小主元可能会带来额外的问题,应尽量避免使用绝对值较小的主元。
\qquad为了解决这两个问题,可以采用“列主元消去法”。
\qquad
\qquad考虑线性方程组的增广矩阵 [A∣b][\ A\ |\ b\ ][ A ∣ b ],
\qquad第0步\textbf{第 0 步}第 0 步 在 AAA 的第 000 列中选取绝对值最大的元素作为主元素
\qquad 若第 i0i_0i0 行的主元 ∣ai0,0∣=max0≤i≤n−1∣ai,0∣\vert a_{\scriptscriptstyle i_0,0}\vert=\displaystyle\max_{\scriptscriptstyle 0\le i\le n-1}\vert a_{\scriptscriptstyle i,0}\vert∣ai0,0∣=0≤i≤n−1max∣ai,0∣,那么交换第 i0i_0i0 行和第 000 行后,开始进行该列的消去过程。
[A(0)∣b(0)]=[a00a01⋯a0,n−1b0a10a11⋯a1,n−1b1⋮⋮⋮⋮ai0,0ai0,1⋯ai0,n−1bi0⋮⋮⋮⋮an−1,0an−1,1⋯an−1,n−1bn−1]⟵∼[ai0,0‾ai0,1⋯ai0,n−1bi0a10a11⋯a1,n−1b1⋮⋮⋮⋮a00a01⋯a0,n−1b0⋮⋮⋮⋮an−1,0an−1,1⋯an−1,n−1bn−1]∼[ai0,0ai0,1⋯ai0,n−1bi00a11⋯a1,n−1b1⋮⋮⋮⋮0a01⋯a0,n−1b0⋮⋮⋮⋮0an−1,1⋯an−1,n−1bn−1]=[A(1)∣b(1)]\qquad\qquad\begin{aligned}[\ A^{(0)}\ |\ b^{(0)}\ ]&=\left[\begin{matrix} a_{\scriptscriptstyle 00}&a_{\scriptscriptstyle 01}&\cdots&a_{\scriptscriptstyle 0,n-1}&b_{\scriptscriptstyle0} \\ a_{\scriptscriptstyle 10}&a_{\scriptscriptstyle 11}&\cdots&a_{\scriptscriptstyle 1,n-1} &b_{\scriptscriptstyle1} \\ \vdots&\vdots& &\vdots&\vdots\\ a_{\scriptscriptstyle i_0,0}&a_{\scriptscriptstyle i_0,1}&\cdots&a_{\scriptscriptstyle i_0,n-1} &b_{\scriptscriptstyle i_0} \\ \vdots&\vdots& &\vdots&\vdots\\ a_{\scriptscriptstyle n-1,0}&a_{\scriptscriptstyle n-1,1}&\cdots&a_{\scriptscriptstyle n-1,n-1}&b_{\scriptscriptstyle n-1} \end{matrix}\right]\begin{matrix} \\\\ \\ \\ \longleftarrow\\ \\ \\ \\ \end{matrix}\\ &\sim\left[\begin{matrix} \textcolor{red}{\underline{a_{\scriptscriptstyle i_0,0}}}&\textcolor{red}{a_{\scriptscriptstyle i_0,1}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle i_0,n-1}} &\textcolor{red}{b_{\scriptscriptstyle i_0}} \\ \textcolor{blue}{a_{\scriptscriptstyle 10}}&a_{\scriptscriptstyle 11}&\cdots&a_{\scriptscriptstyle 1,n-1} &b_{\scriptscriptstyle1} \\ \vdots&\vdots& &\vdots&\vdots\\ \textcolor{blue}{a_{\scriptscriptstyle 00}}&a_{\scriptscriptstyle 01}&\cdots&a_{\scriptscriptstyle 0,n-1}&b_{\scriptscriptstyle0} \\\vdots&\vdots& &\vdots&\vdots\\ \textcolor{blue}{a_{\scriptscriptstyle n-1,0}}&a_{\scriptscriptstyle n-1,1}&\cdots&a_{\scriptscriptstyle n-1,n-1}&b_{\scriptscriptstyle n-1} \end{matrix}\right]\\ &\sim\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle i_0,0}}&\textcolor{red}{a_{\scriptscriptstyle i_0,1}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle i_0,n-1}} &\textcolor{red}{b_{\scriptscriptstyle i_0}} \\ \textcolor{blue}{\scriptstyle 0}&a_{\scriptscriptstyle 11}&\cdots&a_{\scriptscriptstyle 1,n-1} &b_{\scriptscriptstyle1} \\ \vdots&\vdots& &\vdots&\vdots\\ \textcolor{blue}{\scriptstyle 0}&a_{\scriptscriptstyle 01}&\cdots&a_{\scriptscriptstyle 0,n-1}&b_{\scriptscriptstyle0} \\\vdots&\vdots& &\vdots&\vdots\\ \textcolor{blue}{\scriptstyle 0}&a_{\scriptscriptstyle n-1,1}&\cdots&a_{\scriptscriptstyle n-1,n-1}&b_{\scriptscriptstyle n-1} \end{matrix}\right]=[\ A^{(1)}\ |\ b^{(1)}\ ]\end{aligned}[ A(0) ∣ b(0) ]=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡a00a10⋮ai0,0⋮an−1,0a01a11⋮ai0,1⋮an−1,1⋯⋯⋯⋯a0,n−1a1,n−1⋮ai0,n−1⋮an−1,n−1b0b1⋮bi0⋮bn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤⟵∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡ai0,0a10⋮a00⋮an−1,0ai0,1a11⋮a01⋮an−1,1⋯⋯⋯⋯ai0,n−1a1,n−1⋮a0,n−1⋮an−1,n−1bi0b1⋮b0⋮bn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡ai0,00⋮0⋮0ai0,1a11⋮a01⋮an−1,1⋯⋯⋯⋯ai0,n−1a1,n−1⋮a0,n−1⋮an−1,n−1bi0b1⋮b0⋮bn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=[ A(1) ∣ b(1) ]
\qquad依次类推……一直到第 kkk 步。
\qquad第k步\textbf{第 k 步}第 k 步 在 AAA 的第 kkk 列中,选取第 kkk 行到 n−1n-1n−1 行中绝对值最大的元素作为主元
\qquad 若第 iki_kik 行的主元 ∣aik,k∣=maxk≤i≤n−1∣ai,k∣\vert a_{\scriptscriptstyle i_k,k}\vert=\displaystyle\max_{\scriptscriptstyle k\le i\le n-1}\vert a_{\scriptscriptstyle i,k}\vert∣aik,k∣=k≤i≤n−1max∣ai,k∣,那么交换第 iki_kik 行和第 kkk 行后,开始进行该列的消去过程。
[A(k)∣b(k)]=[a00a01⋯⋯a0k⋯a0,n−1b0a11⋯⋯a1k⋯a1,n−1b1⋱⋮⋮⋮ak−1,k−1ak−1,k⋯ak−1,n−1bk−1akk⋯ak,n−1bkak+1,k⋯ak+1,n−1bk+1⋮⋮⋮aik,k⋯aik,n−1bik⋮⋮⋮an−1,k⋯an−1,n−1bn−1]⟵∼[a00a01⋯⋯a0k⋯a0,n−1b0a11⋯⋯a1k⋯a1,n−1b1⋱⋮⋮⋮ak−1,k−1ak−1,k⋯ak−1,n−1bk−1aik,k‾⋯aik,n−1bikak+1,k⋯ak+1,n−1bk+1⋮⋮⋮akk⋯ak,n−1bk⋮⋮⋮an−1,k⋯an−1,n−1bn−1]∼[a00a01⋯⋯a0k⋯a0,n−1b0a11⋯⋯a1k⋯a1,n−1b1⋱⋮⋮⋮ak−1,k−1ak−1,k⋯ak−1,n−1bk−1aik,k⋯aik,n−1bik0⋯ak+1,n−1bk+1⋮⋮⋮0⋯ak,n−1bk⋮⋮⋮0⋯an−1,n−1bn−1]=[A(k+1)∣b(k+1)]\qquad\qquad\begin{aligned}[\ A^{(k)}\ |\ b^{(k)}\ ]&=\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}}&\textcolor{red}{a_{\scriptscriptstyle 01}}&\cdots&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}} &\textcolor{red}{b_{\scriptscriptstyle0}}\\ &\textcolor{red}{a_{\scriptscriptstyle 11}}&\cdots&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}}&\textcolor{red}{b_{\scriptscriptstyle1}} \\ &&\ddots&&\vdots&&\vdots&\vdots\\ &&&\textcolor{red}{a_{\scriptscriptstyle k-1,k-1}}&\textcolor{red}{a_{\scriptscriptstyle k-1,k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle k-1,n-1}}&\textcolor{red}{b_{\scriptscriptstyle k-1}} \\ &&&&a_{\scriptscriptstyle kk}&\cdots&a_{\scriptscriptstyle k,n-1}&b_{\scriptscriptstyle k} \\ &&&&a_{\scriptscriptstyle k+1,k}&\cdots&a_{\scriptscriptstyle k+1,n-1}&b_{\scriptscriptstyle k+1} \\ &&& &\vdots&&\vdots&\vdots \\ &&&&a_{\scriptscriptstyle i_k,k}&\cdots&a_{\scriptscriptstyle i_k,n-1} &b_{\scriptscriptstyle i_k}\\ &&& &\vdots&&\vdots&\vdots \\ && & &a_{\scriptscriptstyle n-1,k}&\cdots&a_{\scriptscriptstyle n-1,n-1}&b_{\scriptscriptstyle n-1} \end{matrix}\right] \begin{matrix} \\\\ \\ \\\\\\ \longleftarrow\\\end{matrix}\\\\ &\sim\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}}&\textcolor{red}{a_{\scriptscriptstyle 01}}&\cdots&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}} &\textcolor{red}{b_{\scriptscriptstyle0}}\\ &\textcolor{red}{a_{\scriptscriptstyle 11}}&\cdots&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}}&\textcolor{red}{b_{\scriptscriptstyle1}} \\ &&\ddots&&\vdots&&\vdots&\vdots\\ &&&\textcolor{red}{a_{\scriptscriptstyle k-1,k-1}}&\textcolor{red}{a_{\scriptscriptstyle k-1,k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle k-1,n-1}}&\textcolor{red}{b_{\scriptscriptstyle k-1}} \\ &&&&\textcolor{crimson}{\underline{a_{\scriptscriptstyle i_k,k}}}&\cdots&\textcolor{crimson}{a_{\scriptscriptstyle i_k,n-1}} &\textcolor{crimson}{b_{\scriptscriptstyle i_k}}\\ &&&&\textcolor{blue}{a_{\scriptscriptstyle k+1,k}}&\cdots&a_{\scriptscriptstyle k+1,n-1}&b_{\scriptscriptstyle k+1} \\ &&& &\vdots&&\vdots&\vdots \\ &&&&\textcolor{blue}{a_{\scriptscriptstyle kk}}&\cdots&a_{\scriptscriptstyle k,n-1}&b_{\scriptscriptstyle k} \\ &&& &\vdots&&\vdots&\vdots \\ && & &\textcolor{blue}{a_{\scriptscriptstyle n-1,k}}&\cdots&a_{\scriptscriptstyle n-1,n-1}&b_{\scriptscriptstyle n-1} \end{matrix}\right] \\ &\sim\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}}&\textcolor{red}{a_{\scriptscriptstyle 01}}&\cdots&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}} &\textcolor{red}{b_{\scriptscriptstyle0}}\\ &\textcolor{red}{a_{\scriptscriptstyle 11}}&\cdots&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}}&\textcolor{red}{b_{\scriptscriptstyle1}} \\ &&\ddots&&\vdots&&\vdots&\vdots\\ &&&\textcolor{red}{a_{\scriptscriptstyle k-1,k-1}}&\textcolor{red}{a_{\scriptscriptstyle k-1,k}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle k-1,n-1}}&\textcolor{red}{b_{\scriptscriptstyle k-1}} \\ &&&&\textcolor{crimson}{a_{\scriptscriptstyle i_k,k}}&\cdots&\textcolor{crimson}{a_{\scriptscriptstyle i_k,n-1}} &\textcolor{crimson}{b_{\scriptscriptstyle i_k}}\\ &&&&\textcolor{blue}{\scriptstyle 0}&\cdots&a_{\scriptscriptstyle k+1,n-1}&b_{\scriptscriptstyle k+1} \\ &&& &\vdots&&\vdots&\vdots \\ &&&&\textcolor{blue}{\scriptstyle 0}&\cdots&a_{\scriptscriptstyle k,n-1}&b_{\scriptscriptstyle k} \\ &&&&\vdots&&\vdots&\vdots \\ &&&&\textcolor{blue}{\scriptstyle 0}&\cdots&a_{\scriptscriptstyle n-1,n-1}&b_{\scriptscriptstyle n-1} \end{matrix}\right]=[\ A^{(k+1)}\ |\ b^{(k+1)}\ ]\end{aligned}[ A(k) ∣ b(k) ]=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a00a01a11⋯⋯⋱⋯⋯ak−1,k−1a0ka1k⋮ak−1,kakkak+1,k⋮aik,k⋮an−1,k⋯⋯⋯⋯⋯⋯⋯a0,n−1a1,n−1⋮ak−1,n−1ak,n−1ak+1,n−1⋮aik,n−1⋮an−1,n−1b0b1⋮bk−1bkbk+1⋮bik⋮bn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⟵∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a00a01a11⋯⋯⋱⋯⋯ak−1,k−1a0ka1k⋮ak−1,kaik,kak+1,k⋮akk⋮an−1,k⋯⋯⋯⋯⋯⋯⋯a0,n−1a1,n−1⋮ak−1,n−1aik,n−1ak+1,n−1⋮ak,n−1⋮an−1,n−1b0b1⋮bk−1bikbk+1⋮bk⋮bn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a00a01a11⋯⋯⋱⋯⋯ak−1,k−1a0ka1k⋮ak−1,kaik,k0⋮0⋮0⋯⋯⋯⋯⋯⋯⋯a0,n−1a1,n−1⋮ak−1,n−1aik,n−1ak+1,n−1⋮ak,n−1⋮an−1,n−1b0b1⋮bk−1bikbk+1⋮bk⋮bn−1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=[ A(k+1) ∣ b(k+1) ]
\qquad经过 nnn 步之后,得到与原方程组等价的方程组 A(n−1)X=b(n−1)A^{(n-1)}X=b^{(n-1)}A(n−1)X=b(n−1),也就是
[a00(0)a01(0)⋯a0,n−1(0)a11(1)⋯a1,n−1(1)⋱⋮an−1,n−1(n−1)]⏟A(n−1)[x0x1⋮xn−1][b0(0)b1(1)⋮bn−1(n−1)]⏟b(n−1)\qquad\qquad\qquad\underbrace{\left[\begin{matrix} \textcolor{red}{a_{\scriptscriptstyle 00}^{\scriptscriptstyle(0)}}&\textcolor{red}{a_{\scriptscriptstyle 01}^{\scriptscriptstyle(0)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 0,n-1}^{\scriptscriptstyle(0)}} \\ &\textcolor{red}{a_{\scriptscriptstyle 11}^{\scriptscriptstyle(1)}}&\cdots&\textcolor{red}{a_{\scriptscriptstyle 1,n-1}^{\scriptscriptstyle(1)}} \\ &&\ddots&\vdots\\ &&&\textcolor{red}{a_{\scriptscriptstyle n-1,n-1}^{\scriptscriptstyle(n-1)}} \end{matrix}\right]}_{A^{(n-1)}}\left[\begin{matrix}x_{\scriptscriptstyle0}\\x_{\scriptscriptstyle1}\\\vdots\\x_{\scriptscriptstyle n-1}\end{matrix}\right]\underbrace{\left[\begin{matrix}\textcolor{red}{b_{\scriptscriptstyle0}^{\scriptscriptstyle(0)}}\\\textcolor{red}{b_{\scriptscriptstyle1}^{\scriptscriptstyle(1)}}\\\vdots\\\textcolor{red}{b_{\scriptscriptstyle n-1}^{\scriptscriptstyle(n-1)}}\end{matrix}\right]}_{b^{(n-1)}}A(n−1)⎣⎢⎢⎢⎡a00(0)a01(0)a11(1)⋯⋯⋱a0,n−1(0)a1,n−1(1)⋮an−1,n−1(n−1)⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡x0x1⋮xn−1⎦⎥⎥⎥⎤b(n−1)⎣⎢⎢⎢⎡b0(0)b1(1)⋮bn−1(n−1)⎦⎥⎥⎥⎤
\qquad同样采用 1.2\text{1.2}1.2 节中描述的回代方法求解。
\qquad
实现代码
import numpy as np
def gauss_colpivot(A,b):# 列主元消去法augA = np.concatenate((A,b),axis=1) print('augmented A:\n',augA)rows = A.shape[0]# eliminationfor k in range(rows):prow = np.argmax(np.abs(augA[k:,k])) + kpivot = augA[prow,k]if prow!=k:augA[[k,prow],:] = augA[[prow,k],:]for i in range(k+1,rows): mi = augA[i,k]/pivotaugA[i,:] = augA[i,:] - augA[k,:]*miprint('#elimination:\n',augA) # back substitution x = np.zeros(rows) k = rows-1x[k] = augA[k,-1]/augA[k,k] for k in range(rows-2,-1,-1):tx = x[k+1:]ta = augA[k,k+1:-1].flatten()x[k] = (augA[k,-1]-np.sum(tx*ta))/augA[k,k] return xif __name__ == '__main__': A = np.array([[1, 1, 1, 1],[0, 4,-1, 2],[2,-2, 1, 4],[3, 1,-3, 2]],dtype='float')b = np.array([[10,13,17,4]],dtype='float').Tx = gauss_colpivot(A,b)print('x =',x)
计算结果:
augmented A:[[ 1. 1. 1. 1. 10.][ 0. 4. -1. 2. 13.][ 2. -2. 1. 4. 17.][ 3. 1. -3. 2. 4.]]
#elimination:[[ 3. 1. -3. 2. 4. ][ 0. 4. -1. 2. 13. ][ 0. -2.66666667 3. 2.66666667 14.33333333][ 0. 0.66666667 2. 0.33333333 8.66666667]]
#elimination:[[ 3. 1. -3. 2. 4. ][ 0. 4. -1. 2. 13. ][ 0. 0. 2.33333333 4. 23. ][ 0. 0. 2.16666667 0. 6.5 ]]
#elimination:[[ 3. 1. -3. 2. 4. ][ 0. 4. -1. 2. 13. ][ 0. 0. 2.33333333 4. 23. ][ 0. 0. 0. -3.71428571 -14.85714286]]
#elimination:[[ 3. 1. -3. 2. 4. ][ 0. 4. -1. 2. 13. ][ 0. 0. 2.33333333 4. 23. ][ 0. 0. 0. -3.71428571 -14.85714286]]x = [1. 2. 3. 4.]
3 高斯-约旦(Gauss-Jordan)消去法
\qquad高斯消去法始终只是消去对角线下方的元素,使之变换为上三角矩阵后,再采用回代法求解。
\qquad高斯-约旦(Gauss-Jordan)\text{(Gauss-Jordan)}(Gauss-Jordan)消去法,对高斯消去法做了修正,在消去过程中只保留对角线上的元素,即同时消去对角线上方和下方的元素。
[A∣b]⟶[A(n−1)∣b(n−1)]=[1b^01b^1⋱⋮1b^n−1]\qquad\qquad[\ A\ |\ b\ ]\longrightarrow[\ A^{(n-1)}\ |\ b^{(n-1)}\ ]=\left[\begin{matrix}1&&&&\hat b_{0}\\&1&&&\hat b_{1}\\&&\ddots&&\vdots\\&&&1&\hat b_{n-1}\end{matrix}\right][ A ∣ b ]⟶[ A(n−1) ∣ b(n−1) ]=⎣⎢⎢⎢⎡11⋱1b^0b^1⋮b^n−1⎦⎥⎥⎥⎤
\qquad高斯-约旦消去法的最大优点在于:由于系数矩阵变成了单位矩阵,增广矩阵的最后一列 [b^0,b^0,⋯,b^n−1]T[\hat b_{0},\hat b_{0},\cdots,\hat b_{n-1}]^T[b^0,b^0,⋯,b^n−1]T 就是线性方程组的解,免去了高斯消去法中的回代法求解过程,也就是通过消去法就直接可以得到线性方程组的解 X=[b^0,b^0,⋯,b^n−1]TX=[\hat b_{0},\hat b_{0},\cdots,\hat b_{n-1}]^TX=[b^0,b^0,⋯,b^n−1]T。
\qquad高斯-约旦消去法还可以用于矩阵的求逆:
[A∣In]⟶[A(n−1)∣b(n−1)]=[1b^01b^1⋱⋮1b^n−1]=[In∣A−1]\qquad\qquad[\ A\ |\ I_n\ ]\longrightarrow[\ A^{(n-1)}\ |\ b^{(n-1)}\ ]=\left[\begin{matrix}1&&&&\hat b_{0}\\&1&&&\hat b_{1}\\&&\ddots&&\vdots\\&&&1&\hat b_{n-1}\end{matrix}\right]=[\ I_n\ |\ A^{-1}\ ][ A ∣ In ]⟶[ A(n−1) ∣ b(n−1) ]=⎣⎢⎢⎢⎡11⋱1b^0b^1⋮b^n−1⎦⎥⎥⎥⎤=[ In ∣ A−1 ]
\qquad此时的线性方程组相当于:AX=In⟹X=A−1AX=I_n\Longrightarrow X=A^{-1}AX=In⟹X=A−1
实现代码
import numpy as np
def gauss_jordan(A,b,mode=''): # 高斯约当消去法(不用回代)——基于列主元消去法augA = np.concatenate((A,b),axis=1) print('augmented A:\n',augA)rows = A.shape[0]# eliminationfor k in range(rows):prow = np.argmax(np.abs(augA[k:,k])) + kpivot = augA[prow,k]augA[prow,:] = augA[prow,:]/pivotif prow!=k:augA[[k,prow],:] = augA[[prow,k],:]for i in range(rows): if i==k:continue mi = augA[i,k]augA[i,:] = augA[i,:] - augA[k,:]*miprint('#elimination:\n',augA) if mode=='inv':return augA[:,rows:2*rows] else:return augA[:,-1].flatten()if __name__ == '__main__': A = np.array([[1, 1, 1, 1],[0, 4,-1, 2],[2,-2, 1, 4],[3, 1,-3, 2]],dtype='float')b = np.array([[10,13,17,4]],dtype='float').Tx = gauss_jordan(A,b)print('x =',x) # gauss jordan 求逆A = np.array([[1, 2, 3],[2, 4, 5],[3, 5, 6]],dtype='float')b = np.eye(A.shape[0])x = gauss_jordan(A,b,'inv')print('inverse of A: \n',x)
解线性方程组的计算结果:
augmented A:[[ 1. 1. 1. 1. 10.][ 0. 4. -1. 2. 13.][ 2. -2. 1. 4. 17.][ 3. 1. -3. 2. 4.]]
#elimination:[[ 1. 0.33333333 -1. 0.66666667 1.33333333][ 0. 4. -1. 2. 13. ][ 0. -2.66666667 3. 2.66666667 14.33333333][ 0. 0.66666667 2. 0.33333333 8.66666667]]
#elimination:[[ 1. 0. -0.91666667 0.5 0.25 ][ 0. 1. -0.25 0.5 3.25 ][ 0. 0. 2.33333333 4. 23. ][ 0. 0. 2.16666667 0. 6.5 ]]
#elimination:[[ 1. 0. 0. 2.07142857 9.28571429][ 0. 1. 0. 0.92857143 5.71428571][ 0. 0. 1. 1.71428571 9.85714286][ 0. 0. 0. -3.71428571 -14.85714286]]
#elimination:[[ 1. 0. 0. 0. 1.][ 0. 1. 0. 0. 2.][ 0. 0. 1. 0. 3.][-0. -0. -0. 1. 4.]]x = [1. 2. 3. 4.]
矩阵求逆的计算结果:
augmented A:[[1. 2. 3. 1. 0. 0.][2. 4. 5. 0. 1. 0.][3. 5. 6. 0. 0. 1.]]
#elimination:[[ 1. 1.66666667 2. 0. 0. 0.33333333][ 0. 0.66666667 1. 0. 1. -0.66666667][ 0. 0.33333333 1. 1. 0. -0.33333333]]
#elimination:[[ 1. 0. -0.5 0. -2.5 2. ][ 0. 1. 1.5 0. 1.5 -1. ][ 0. 0. 0.5 1. -0.5 0. ]]
#elimination:[[ 1. 0. 0. 1. -3. 2.][ 0. 1. 0. -3. 3. -1.][ 0. 0. 1. 2. -1. 0.]]
inverse of A: [[ 1. -3. 2.][-3. 3. -1.][ 2. -1. 0.]]
参考:
解线性方程组的python实现(2)——矩阵三角分解法
解线性方程组的python实现(1)——高斯主元消去法相关推荐
- 解线性方程组的python实现(2)——矩阵三角分解法
解线性方程组的python实现2--矩阵三角分解法 1. 矩阵三角分解法 实现代码 2. LU分解 2.1 基本步骤 2.2 LU分解的计算公式 2.3 LU分解的结果表示 实现代码 3. 选主元的L ...
- [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题
[AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算 ...
- 选主元的高斯-约旦(Gauss-Jordan)消元法解线性方程组/求逆矩阵
选主元的高斯-约当(Gauss-Jordan)消元法在很多地方都会用到,例如求一个矩阵的逆矩阵.解线性方程组(插一句:LM算法求解的一个步骤),等等.它的速度不是最快的,但是它非常稳定(来自网上的定义 ...
- 选主元的高斯-约当(Gauss-Jordan)消元法解线性方程组和求逆矩阵
选主元的高斯-约当(Gauss-Jordan)消元法在很多地方都会用到,例如求一个矩阵的逆矩阵.解线性方程组(插一句:LM算法求解的一个步骤),等等.它的速度不是最快的,但是它非常稳定(来自网上的定义 ...
- 高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现
高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现 代码 运行 手算例题 迭代法解线性方程组的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则,有不同的 ...
- 高斯列主元消去法解线性方程组
最近在看惯导的东西,然后想要用C++解惯导控制方程,然后就重头把C++解方程组这方面的知识回顾了一下,首先就是高斯列主元消去法,这个方法还算实用,这里以3*3的矩阵为例,里面注释很详细,各位小白可以参 ...
- 第三十四章 数论——高斯消元解线性方程组
第三十四章 数论--高斯消元解线性方程组 一.高斯消元 1.线性方程组 2.高斯消元步骤 (1)数学知识铺垫 增广矩阵和阶梯矩阵 初等变换 (2)高斯消元步骤 二.代码模板 1.问题: 2.代码 一. ...
- 数值分析—行主元消去法解线性方程组—FORTRAN程序
数值分析-行主元消去法解线性方程组-FORTRAN程序 program main implicit none real8,dimension( :,: ),allocatable::A real8,d ...
- 数值计算(一)之解线性方程组(高斯消去法,列选主元消去法,全选主元消去法,杜立特尔分解,克洛特分解,乔里斯基分解)
解线性方程组即解一个多元一次方程组,例如 目录 消去法 分解法 消去法 原理 没有学过高级的解法也没关系,凭借我们初高中的知识足以解决这个问题 这是一个多元一次方程组,拥有n个未知量,也有n方程 我们 ...
最新文章
- C#生成的图片无法在ps中打开
- Nutanix企业云助力广播传媒的融合媒体发展之路
- 【Android 应用开发】Android 工程修改包名流程 ( 修改 applicationId | 修改 package | 修改 R 资源引用 | 修改 BuildConfig 引用 )
- 亲身经历揭露淘宝上主板交换的陷阱
- 360脱壳-native函数还原笔记-2017-06-25
- 设计模式(装饰模式)
- Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 错误解决
- 【Django】Django web项目部署(Nginx+uwsgi)
- leetcode练习——栈(1)
- python3.6,--登录知乎
- zookeeper多种方式安装
- 基于深度学习的咖啡叶病害识别和严重程度评估(源代码+数据集)
- python怎么画小海龟_python画图之“小海龟”turtle
- PCWorld:HTML5会终结移动应用程序吗?
- 简单七个步骤写一份策划方案(上)
- 无法定位程序输入点于动态链接库
- 计算机三级网络技术大题详解,教你快速拿到60分,附三级题库绿色免安装
- 【进阶】数位DP详解
- flutter 文字下划线 行距
- poedb.tw itemgen.php,流放之路【POE】【异界地图】初步了解如何开始打异界
热门文章
- ye lynn yama Loafer 已发送,请注意查收
- 아 / 어/여서与고 的区别
- python调用百度地图API 实现单点沿线轨迹运动
- 如何判断2的n次方?用四种方式来扒一扒。
- springBoot启动错误:Field categoryMapper in xxx.xxx.service.impl.CategoryServiceImpl required a bean of
- 蓝牙遥控小车2.0版发布啦
- JGG论坛:赵方庆研究员解析肠道菌群与人体健康(11月10日10:00)
- 修改32位的AutoCAD2012,使其能在64位系统上安装
- 拼多多搜索词统计 API接口操作展示说明
- 证券业上云内参: 深圳证券信息