解线性方程组的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.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​​a00​x0​+a01​x1​+⋯+a0,n−1​xn−1​=b0​a10​x0​+a11​x1​+⋯+a1,n−1​xn−1​=b1​⋯⋯⋯⋯⋯⋯an−1,0​x0​+an−1,1​x1​+⋯+an−1,n−1​xn−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⎣⎢⎢⎢⎡​a00​a10​⋮an−1,0​​a01​a11​⋮an−1,1​​⋯⋯⋯​a0,n−1​a1,n−1​⋮an−1,n−1​​⎦⎥⎥⎥⎤​​​X⎣⎢⎢⎢⎡​x0​x1​⋮xn−1​​⎦⎥⎥⎥⎤​​​=b⎣⎢⎢⎢⎡​b0​b1​⋮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)​​⎦⎥⎥⎥⎤​⎣⎢⎢⎢⎡​x0​x1​⋮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)​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​​​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​x0​x1​⋮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⋮0​a01(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)​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​​​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​x0​x1​⋮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)​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​​​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​x0​x1​⋮xk​xk+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⋮0​a0,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)​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​​​⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​x0​x1​⋮xk​xk+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)​​⎦⎥⎥⎥⎤​​​⎣⎢⎢⎢⎡​x0​x1​⋮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−1​xk​​=an−1,n−1(n−1)​bn−1(n−1)​​=akk(k)​bk(k)​−j=k+1∑n−1​akj(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∣=max⁡0≤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) ]​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​a00​a10​⋮ai0​,0​⋮an−1,0​​a01​a11​⋮ai0​,1​⋮an−1,1​​⋯⋯⋯⋯​a0,n−1​a1,n−1​⋮ai0​,n−1​⋮an−1,n−1​​b0​b1​⋮bi0​​⋮bn−1​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​⟵​∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​ai0​,0​​a10​⋮a00​⋮an−1,0​​ai0​,1​a11​⋮a01​⋮an−1,1​​⋯⋯⋯⋯​ai0​,n−1​a1,n−1​⋮a0,n−1​⋮an−1,n−1​​bi0​​b1​⋮b0​⋮bn−1​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​ai0​,0​0⋮0⋮0​ai0​,1​a11​⋮a01​⋮an−1,1​​⋯⋯⋯⋯​ai0​,n−1​a1,n−1​⋮a0,n−1​⋮an−1,n−1​​bi0​​b1​⋮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∣=max⁡k≤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) ]​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​a00​​a01​a11​​⋯⋯⋱​⋯⋯ak−1,k−1​​a0k​a1k​⋮ak−1,k​akk​ak+1,k​⋮aik​,k​⋮an−1,k​​⋯⋯⋯⋯⋯⋯⋯​a0,n−1​a1,n−1​⋮ak−1,n−1​ak,n−1​ak+1,n−1​⋮aik​,n−1​⋮an−1,n−1​​b0​b1​⋮bk−1​bk​bk+1​⋮bik​​⋮bn−1​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​⟵​∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​a00​​a01​a11​​⋯⋯⋱​⋯⋯ak−1,k−1​​a0k​a1k​⋮ak−1,k​aik​,k​​ak+1,k​⋮akk​⋮an−1,k​​⋯⋯⋯⋯⋯⋯⋯​a0,n−1​a1,n−1​⋮ak−1,n−1​aik​,n−1​ak+1,n−1​⋮ak,n−1​⋮an−1,n−1​​b0​b1​⋮bk−1​bik​​bk+1​⋮bk​⋮bn−1​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​∼⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​a00​​a01​a11​​⋯⋯⋱​⋯⋯ak−1,k−1​​a0k​a1k​⋮ak−1,k​aik​,k​0⋮0⋮0​⋯⋯⋯⋯⋯⋯⋯​a0,n−1​a1,n−1​⋮ak−1,n−1​aik​,n−1​ak+1,n−1​⋮ak,n−1​⋮an−1,n−1​​b0​b1​⋮bk−1​bik​​bk+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)​​⎦⎥⎥⎥⎤​​​⎣⎢⎢⎢⎡​x0​x1​⋮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) ]=⎣⎢⎢⎢⎡​1​1​⋱​1​b^0​b^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) ]=⎣⎢⎢⎢⎡​1​1​⋱​1​b^0​b^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)——高斯主元消去法相关推荐

  1. 解线性方程组的python实现(2)——矩阵三角分解法

    解线性方程组的python实现2--矩阵三角分解法 1. 矩阵三角分解法 实现代码 2. LU分解 2.1 基本步骤 2.2 LU分解的计算公式 2.3 LU分解的结果表示 实现代码 3. 选主元的L ...

  2. [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题

    [AcWing]883. 高斯消元解线性方程组(C++实现)高斯消元解线性方程组模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算 ...

  3. 选主元的高斯-约旦(Gauss-Jordan)消元法解线性方程组/求逆矩阵

    选主元的高斯-约当(Gauss-Jordan)消元法在很多地方都会用到,例如求一个矩阵的逆矩阵.解线性方程组(插一句:LM算法求解的一个步骤),等等.它的速度不是最快的,但是它非常稳定(来自网上的定义 ...

  4. 选主元的高斯-约当(Gauss-Jordan)消元法解线性方程组和求逆矩阵

    选主元的高斯-约当(Gauss-Jordan)消元法在很多地方都会用到,例如求一个矩阵的逆矩阵.解线性方程组(插一句:LM算法求解的一个步骤),等等.它的速度不是最快的,但是它非常稳定(来自网上的定义 ...

  5. 高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现

    高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现 代码 运行 手算例题 迭代法解线性方程组的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则,有不同的 ...

  6. 高斯列主元消去法解线性方程组

    最近在看惯导的东西,然后想要用C++解惯导控制方程,然后就重头把C++解方程组这方面的知识回顾了一下,首先就是高斯列主元消去法,这个方法还算实用,这里以3*3的矩阵为例,里面注释很详细,各位小白可以参 ...

  7. 第三十四章 数论——高斯消元解线性方程组

    第三十四章 数论--高斯消元解线性方程组 一.高斯消元 1.线性方程组 2.高斯消元步骤 (1)数学知识铺垫 增广矩阵和阶梯矩阵 初等变换 (2)高斯消元步骤 二.代码模板 1.问题: 2.代码 一. ...

  8. 数值分析—行主元消去法解线性方程组—FORTRAN程序

    数值分析-行主元消去法解线性方程组-FORTRAN程序 program main implicit none real8,dimension( :,: ),allocatable::A real8,d ...

  9. 数值计算(一)之解线性方程组(高斯消去法,列选主元消去法,全选主元消去法,杜立特尔分解,克洛特分解,乔里斯基分解)

    解线性方程组即解一个多元一次方程组,例如 目录 消去法 分解法 消去法 原理 没有学过高级的解法也没关系,凭借我们初高中的知识足以解决这个问题 这是一个多元一次方程组,拥有n个未知量,也有n方程 我们 ...

最新文章

  1. C#生成的图片无法在ps中打开
  2. Nutanix企业云助力广播传媒的融合媒体发展之路
  3. 【Android 应用开发】Android 工程修改包名流程 ( 修改 applicationId | 修改 package | 修改 R 资源引用 | 修改 BuildConfig 引用 )
  4. 亲身经历揭露淘宝上主板交换的陷阱
  5. 360脱壳-native函数还原笔记-2017-06-25
  6. 设计模式(装饰模式)
  7. Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 错误解决
  8. 【Django】Django web项目部署(Nginx+uwsgi)
  9. leetcode练习——栈(1)
  10. python3.6,--登录知乎
  11. zookeeper多种方式安装
  12. 基于深度学习的咖啡叶病害识别和严重程度评估(源代码+数据集)
  13. python怎么画小海龟_python画图之“小海龟”turtle
  14. PCWorld:HTML5会终结移动应用程序吗?
  15. 简单七个步骤写一份策划方案(上)
  16. 无法定位程序输入点于动态链接库
  17. 计算机三级网络技术大题详解,教你快速拿到60分,附三级题库绿色免安装
  18. 【进阶】数位DP详解
  19. flutter 文字下划线 行距
  20. poedb.tw itemgen.php,流放之路【POE】【异界地图】初步了解如何开始打异界

热门文章

  1. ye lynn yama Loafer 已发送,请注意查收
  2. 아 / 어/여서与고 的区别
  3. python调用百度地图API 实现单点沿线轨迹运动
  4. 如何判断2的n次方?用四种方式来扒一扒。
  5. springBoot启动错误:Field categoryMapper in xxx.xxx.service.impl.CategoryServiceImpl required a bean of
  6. 蓝牙遥控小车2.0版发布啦
  7. JGG论坛:赵方庆研究员解析肠道菌群与人体健康(11月10日10:00)
  8. 修改32位的AutoCAD2012,使其能在64位系统上安装
  9. 拼多多搜索词统计 API接口操作展示说明
  10. 证券业上云内参: 深圳证券信息