Gauss消去法(C++)

文章目录

  • 算法描述
    • 顺序Gauss消去法
    • 列选主元Gauss消去法
    • 全选主元Gauss消去法
    • Gauss-Jordan消去法
  • 算法实现
    • 顺序Gauss消去法
    • 列选主元Gauss消去法
    • 全选主元Gauss消去法
    • 列选主元Gauss-Jordan消去法
  • 实例分析

Gauss消去法是求解线性方程组较为有效的方法, 它主要包括两个操作, 即消元和回代. 所谓消元是指将线性方程组转化为与其同解的上三角方程组; 回代是指通过上三角方程组逐个解出方程组的未知数. Gauss消去法通常有顺序Gauss消去法, 列主元Gauss消去法, 全主元Gauss消去法及Gauss-Jordan消去法.

算法描述

顺序Gauss消去法

顺序Gauss消去法是最简单的Gauss消去法, 其基本步骤如下:

  1. 将线性方程组的增广矩阵通过行变换, 化简成一个上三角矩阵. 这可以通过交换两行位置或者用一个数乘某一行加到另一行上面来实现.
  2. 从增广矩阵的最后一行开始, 依次回代, 求出解向量. 回代过程中, 需要将从上方得到的解代入下方方程进行求解.

虽然Gauss消去法可以解决线性方程组的问题, 但是它没有稳定性保证. 如果主元素比较小, 舍入误差可能会累积增大, 从而导致解的误差较大.

算法可描述为伪代码如下:

用顺序Gauss消去法求解线性方程组:

{ x + 2 y + 3 z = 1 4 x + 5 y + 6 z = 1 7 x + 8 y = 1 \begin{cases} x+2y+3z=1\\4x+5y+6z=1\\7x+8y=1 \end{cases} x+2y+3z=14x+5y+6z=17x+8y=1

利用顺序Gauss消去法得到如下消元过程:

( 1.000000 2.000000 3.000000 1 4.000000 5.000000 6.000000 1 7.000000 8.000000 0.000000 1 ) → ( 1.000000 2.000000 3.000000 1 0.000000 − 3.000000 − 6.000000 − 3 0.000000 − 6.000000 − 21.000000 − 6 ) → ( 1.000000 2.000000 3.000000 1 0.000000 − 3.000000 − 6.000000 − 3 0.000000 0.000000 − 9.000000 0 ) → ( 1.000000 2.000000 0.000000 1 0.000000 − 3.000000 0.000000 − 3 0.000000 0.000000 1.000000 0 ) → ( 1.000000 0.000000 0.000000 − 1 0.000000 1.000000 0.000000 1 0.000000 0.000000 1.000000 0 ) → ( 1.000000 0.000000 0.000000 − 1 0.000000 1.000000 0.000000 1 0.000000 0.000000 1.000000 0 ) \begin{aligned} &\begin{pmatrix} 1.000000&2.000000&3.000000& 1 \\ 4.000000&5.000000&6.000000& 1 \\ 7.000000&8.000000&0.000000& 1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&2.000000&3.000000& 1 \\ 0.000000&-3.000000&-6.000000& -3 \\ 0.000000&-6.000000&-21.000000& -6 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&2.000000&3.000000& 1 \\ 0.000000&-3.000000&-6.000000& -3 \\ 0.000000&0.000000&-9.000000& 0 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&2.000000&0.000000& 1 \\ 0.000000&-3.000000&0.000000& -3 \\ 0.000000&0.000000&1.000000& 0 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&0.000000&0.000000& -1 \\ 0.000000&1.000000&0.000000& 1 \\ 0.000000&0.000000&1.000000& 0 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&0.000000&0.000000& -1 \\ 0.000000&1.000000&0.000000& 1 \\ 0.000000&0.000000&1.000000& 0 \\ \end{pmatrix} \end{aligned} 1.0000004.0000007.0000002.0000005.0000008.0000003.0000006.0000000.000000111 1.0000000.0000000.0000002.0000003.0000006.0000003.0000006.00000021.000000136 1.0000000.0000000.0000002.0000003.0000000.0000003.0000006.0000009.000000130 1.0000000.0000000.0000002.0000003.0000000.0000000.0000000.0000001.000000130 1.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.000000110 1.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.000000110

列选主元Gauss消去法

在顺序Gauss消去法中, 并没有选择主元的步骤, 而是按照方程组的顺序进行消元和回代. 这种方法在某些情况下可能会因为计算的顺序而产生数值不稳定性, 导致计算结果与精确解的误差较大. 而且顺序Gauss消去法要求系数矩阵的各阶顺序主子式非零, 而这并不是方程组有解的必要条件. 在列选主元的Gauss消去法中, 每一步计算之前都会增加选择主元的步骤. 这个步骤是为了提高数值稳定性, 避免在计算过程中出现除数为零的情况. 因此, 列选主元的Gauss消去法在计算精度上通常优于顺序高斯消去法. 除此之外, 列选主元Gauss消去法只需要系数矩阵的行列式非零就可以进行计算.

算法可描述为伪代码如下:

用列选主元Gauss消去法求解上例线性方程组.

利用列选主元Gauss消去法得到如下消元过程:

( 1.000000 2.000000 3.000000 1 4.000000 5.000000 6.000000 1 7.000000 8.000000 0.000000 1 ) → ( 7.000000 8.000000 0.000000 1 4.000000 5.000000 6.000000 1 1.000000 2.000000 3.000000 1 ) → ( 7.000000 8.000000 0.000000 1 0.000000 0.428571 6.000000 0.428571 0.000000 0.857143 3.000000 0.857143 ) → ( 7.000000 8.000000 0.000000 1 0.000000 0.857143 3.000000 0.857143 0.000000 0.428571 6.000000 0.428571 ) → ( 7.000000 8.000000 0.000000 1 0.000000 0.857143 3.000000 0.857143 0.000000 0.000000 4.500000 0 ) → ( 7.000000 8.000000 0.000000 1 0.000000 0.857143 0.000000 0.857143 0.000000 0.000000 1.000000 0 ) → ( 7.000000 0.000000 0.000000 − 7 0.000000 1.000000 0.000000 1 0.000000 0.000000 1.000000 0 ) → ( 1.000000 0.000000 0.000000 − 1 0.000000 1.000000 0.000000 1 0.000000 0.000000 1.000000 0 ) \begin{aligned} &\begin{pmatrix} 1.000000&2.000000&3.000000& 1 \\ 4.000000&5.000000&6.000000& 1 \\ 7.000000&8.000000&0.000000& 1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 7.000000&8.000000&0.000000& 1 \\ 4.000000&5.000000&6.000000& 1 \\ 1.000000&2.000000&3.000000& 1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 7.000000&8.000000&0.000000& 1 \\ 0.000000&0.428571&6.000000& 0.428571 \\ 0.000000&0.857143&3.000000& 0.857143 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 7.000000&8.000000&0.000000& 1 \\ 0.000000&0.857143&3.000000& 0.857143 \\ 0.000000&0.428571&6.000000& 0.428571 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 7.000000&8.000000&0.000000& 1 \\ 0.000000&0.857143&3.000000& 0.857143 \\ 0.000000&0.000000&4.500000& 0 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 7.000000&8.000000&0.000000& 1 \\ 0.000000&0.857143&0.000000& 0.857143 \\ 0.000000&0.000000&1.000000& 0 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 7.000000&0.000000&0.000000& -7 \\ 0.000000&1.000000&0.000000& 1 \\ 0.000000&0.000000&1.000000& 0 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&0.000000&0.000000& -1 \\ 0.000000&1.000000&0.000000& 1 \\ 0.000000&0.000000&1.000000& 0 \\ \end{pmatrix} \end{aligned} 1.0000004.0000007.0000002.0000005.0000008.0000003.0000006.0000000.000000111 7.0000004.0000001.0000008.0000005.0000002.0000000.0000006.0000003.000000111 7.0000000.0000000.0000008.0000000.4285710.8571430.0000006.0000003.00000010.4285710.857143 7.0000000.0000000.0000008.0000000.8571430.4285710.0000003.0000006.00000010.8571430.428571 7.0000000.0000000.0000008.0000000.8571430.0000000.0000003.0000004.50000010.8571430 7.0000000.0000000.0000008.0000000.8571430.0000000.0000000.0000001.00000010.8571430 7.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.000000710 1.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.000000110

全选主元Gauss消去法

全选主元Gauss消去法是在列选主元Gauss消去法的基础上, 进一步扩大主元的搜索区间到整个矩阵, 精度更高, 但需要更多的计算量. 全选主元法选取了矩阵中最大值的元素作为主元, 并进行列变换. 这使得在回代过程中, 未知数的位置可能发生改变, 因此需要同时对未知量的顺序进行变换, 从而增加了计算量. 实际使用时, 完全主元素消去法比列主元素消去法运算量大得多, 全选主元的计算时间大约是列选主元的两倍.

算法可描述为伪代码如下:

用全选主元Gauss消去法求解上例线性方程组.

利用全选主元Gauss消去法得到如下消元过程:

( 1.000000 2.000000 3.000000 1 4.000000 5.000000 6.000000 1 7.000000 8.000000 0.000000 1 ) → ( 8.000000 7.000000 0.000000 1 5.000000 4.000000 6.000000 1 2.000000 1.000000 3.000000 1 ) → ( 8.000000 7.000000 0.000000 1 0.000000 − 0.375000 6.000000 0.375 0.000000 − 0.750000 3.000000 0.75 ) → ( 8.000000 0.000000 7.000000 1 0.000000 6.000000 − 0.375000 0.375 0.000000 3.000000 − 0.750000 0.75 ) → ( 8.000000 0.000000 7.000000 1 0.000000 6.000000 − 0.375000 0.375 0.000000 0.000000 − 0.562500 0.5625 ) → ( 8.000000 0.000000 0.000000 8 0.000000 6.000000 0.000000 0 0.000000 0.000000 1.000000 − 1 ) → ( 8.000000 0.000000 0.000000 8 0.000000 1.000000 0.000000 0 0.000000 0.000000 1.000000 − 1 ) → ( 1.000000 0.000000 0.000000 1 0.000000 1.000000 0.000000 0 0.000000 0.000000 1.000000 − 1 ) \begin{aligned} &\begin{pmatrix} 1.000000&2.000000&3.000000& 1 \\ 4.000000&5.000000&6.000000& 1 \\ 7.000000&8.000000&0.000000& 1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 8.000000&7.000000&0.000000& 1 \\ 5.000000&4.000000&6.000000& 1 \\ 2.000000&1.000000&3.000000& 1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 8.000000&7.000000&0.000000& 1 \\ 0.000000&-0.375000&6.000000& 0.375 \\ 0.000000&-0.750000&3.000000& 0.75 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 8.000000&0.000000&7.000000& 1 \\ 0.000000&6.000000&-0.375000& 0.375 \\ 0.000000&3.000000&-0.750000& 0.75 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 8.000000&0.000000&7.000000& 1 \\ 0.000000&6.000000&-0.375000& 0.375 \\ 0.000000&0.000000&-0.562500& 0.5625 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 8.000000&0.000000&0.000000& 8 \\ 0.000000&6.000000&0.000000& 0 \\ 0.000000&0.000000&1.000000& -1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 8.000000&0.000000&0.000000& 8 \\ 0.000000&1.000000&0.000000& 0 \\ 0.000000&0.000000&1.000000& -1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&0.000000&0.000000& 1 \\ 0.000000&1.000000&0.000000& 0 \\ 0.000000&0.000000&1.000000& -1 \\ \end{pmatrix} \end{aligned} 1.0000004.0000007.0000002.0000005.0000008.0000003.0000006.0000000.000000111 8.0000005.0000002.0000007.0000004.0000001.0000000.0000006.0000003.000000111 8.0000000.0000000.0000007.0000000.3750000.7500000.0000006.0000003.00000010.3750.75 8.0000000.0000000.0000000.0000006.0000003.0000007.0000000.3750000.75000010.3750.75 8.0000000.0000000.0000000.0000006.0000000.0000007.0000000.3750000.56250010.3750.5625 8.0000000.0000000.0000000.0000006.0000000.0000000.0000000.0000001.000000801 8.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.000000801 1.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.000000101

Gauss-Jordan消去法

Gauss-Jordan消去法是高斯消元法的另一个版本, 其方法与高斯消元法相同. 唯一相异之处是该算法产生出来的矩阵是一个简化行梯阵式, 而不是高斯消元法中的行梯阵式. 相比起高斯消元法, Gauss-Jordan消去法的效率较低, 但可以把方程组的解用矩阵一次过表示出来.

Gauss-Jordan消去法也有顺序, 列选主元和全选主元3种消去方式. 由于列主元素消去法的舍入误差一般已较小, 所以在实际计算中多用列主元素消去法. 故算法实现一般采用列选主元Gauss-Jordan消去法.

算法可描述为伪代码如下:

用列选主元Gauss消去法求解上例线性方程组.

利用列选主元Gauss-Jordan消去法得到如下消元过程:

( 1.000000 2.000000 3.000000 1 4.000000 5.000000 6.000000 1 7.000000 8.000000 0.000000 1 ) → ( 7.000000 8.000000 0.000000 1 4.000000 5.000000 6.000000 1 1.000000 2.000000 3.000000 1 ) → ( 1.000000 1.142857 0.000000 0.142857 0.000000 0.428571 6.000000 0.428571 0.000000 0.857143 3.000000 0.857143 ) → ( 1.000000 1.142857 0.000000 0.142857 0.000000 0.857143 3.000000 0.857143 0.000000 0.428571 6.000000 0.428571 ) → ( 1.000000 0.000000 − 4.000000 − 1 0.000000 1.000000 3.500000 1 0.000000 0.000000 4.500000 0 ) → ( 1.000000 0.000000 0.000000 − 1 0.000000 1.000000 0.000000 1 0.000000 0.000000 1.000000 0 ) \begin{aligned} &\begin{pmatrix} 1.000000&2.000000&3.000000& 1 \\ 4.000000&5.000000&6.000000& 1 \\ 7.000000&8.000000&0.000000& 1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 7.000000&8.000000&0.000000& 1 \\ 4.000000&5.000000&6.000000& 1 \\ 1.000000&2.000000&3.000000& 1 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&1.142857&0.000000& 0.142857 \\ 0.000000&0.428571&6.000000& 0.428571 \\ 0.000000&0.857143&3.000000& 0.857143 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&1.142857&0.000000& 0.142857 \\ 0.000000&0.857143&3.000000& 0.857143 \\ 0.000000&0.428571&6.000000& 0.428571 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&0.000000&-4.000000& -1 \\ 0.000000&1.000000&3.500000& 1 \\ 0.000000&0.000000&4.500000& 0 \\ \end{pmatrix}\\\rightarrow& \begin{pmatrix} 1.000000&0.000000&0.000000& -1 \\ 0.000000&1.000000&0.000000& 1 \\ 0.000000&0.000000&1.000000& 0 \\ \end{pmatrix} \end{aligned} 1.0000004.0000007.0000002.0000005.0000008.0000003.0000006.0000000.000000111 7.0000004.0000001.0000008.0000005.0000002.0000000.0000006.0000003.000000111 1.0000000.0000000.0000001.1428570.4285710.8571430.0000006.0000003.0000000.1428570.4285710.857143 1.0000000.0000000.0000001.1428570.8571430.4285710.0000003.0000006.0000000.1428570.8571430.428571 1.0000000.0000000.0000000.0000001.0000000.0000004.0000003.5000004.500000110 1.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.000000110

算法实现

首先进行预处理如下:

#include <armadillo>
#include <vector>
using namespace arma;
using namespace std;

顺序Gauss消去法

/** 顺序Gauss消去法* A : 系数矩阵* b : 常数向量* uA: 系数矩阵消元过程* ub: 常数向量消元过程* e : 判零标准** 返回(bool):*  true : 求解失败*  false: 求解成功** 不检查矩阵维数是否匹配问题*/
bool Sequential_Gauss(mat A, vec b, vector<mat> &uA, vector<vec> &ub, const double &e = 1e-6)
{uA.clear();ub.clear();uA.push_back(A);ub.push_back(b);unsigned n(A.n_cols - 1), m(-1);// 消元for (unsigned i(0); i != n; ++i) // arma::mat的迭代器不太好用, 最后还是用了下标形式, 效率相比迭代器低一些{if (A.at(i, i) < e && A.at(i, i) > -e)return true;for (unsigned j(i + 1); j != A.n_cols; ++j){double t(A.at(j, i) / A.at(i, i));A.at(j, i) = 0;b.at(j) -= t * b.at(i);for (unsigned k(i + 2); k < A.n_cols; ++k)A.at(j, k) -= t * A.at(i, k);}uA.push_back(A);ub.push_back(b);}// 回代do{if (A.at(n, n) < e && A.at(n, n) > -e)return true;b.at(n) /= A.at(n, n);A.at(n, n) = 1;for (unsigned i(0); i != n; ++i){b.at(i) -= A.at(i, n) * b.at(n);A.at(i, n) = 0;}uA.push_back(A);ub.push_back(b);} while (--n != m);return false;
}

列选主元Gauss消去法

/** 列选主元Gauss消去法* A : 系数矩阵* b : 常数向量* uA: 系数矩阵消元过程* ub: 常数向量消元过程* e : 判零标准** 返回(bool):*  true : 求解失败*  false: 求解成功** 不检查矩阵维数是否匹配问题*/
bool Col_Gauss(mat A, vec b, vector<mat> &uA, vector<vec> &ub, const double &e = 1e-6)
{uA.clear();ub.clear();uA.push_back(A);ub.push_back(b);unsigned n(A.n_cols - 1), m(-1);for (unsigned i(0); i != n; ++i) // 消元{unsigned max(i); // 选列主元for (unsigned j(i + 1); j != A.n_cols; ++j)if (abs(A.at(j, i)) > abs(A.at(max, i)))max = j;if (abs(A.at(max, i)) < e)return true;if (max != i){for (unsigned j(i); j != A.n_cols; ++j){double t(A.at(i, j));A.at(i, j) = A.at(max, j);A.at(max, j) = t;}double t(b.at(max));b.at(max) = b.at(i);b.at(i) = t;uA.push_back(A);ub.push_back(b);}for (unsigned j(i + 1); j != A.n_cols; ++j){double t(A.at(j, i) / A.at(i, i));A.at(j, i) = 0;b.at(j) -= t * b.at(i);for (unsigned k(i + 1); k < A.n_cols; ++k)A.at(j, k) -= t * A.at(i, k);}uA.push_back(A);ub.push_back(b);}do // 回代{if (A.at(n, n) < e && A.at(n, n) > -e)return true;b.at(n) /= A.at(n, n);A.at(n, n) = 1;for (unsigned i(0); i != n; ++i){b.at(i) -= A.at(i, n) * b.at(n);A.at(i, n) = 0;}uA.push_back(A);ub.push_back(b);} while (--n != m);return false;
}

全选主元Gauss消去法

/** 全选主元Gauss消去法* A : 系数矩阵* b : 常数向量* uA: 系数矩阵消元过程* ub: 常数向量消元过程* r : 解向量* e : 判零标准** 返回(bool):*  true : 求解失败*  false: 求解成功** 不检查矩阵维数是否匹配问题*/
bool All_Gauss(mat A, vec b, vector<mat> &uA, vector<vec> &ub, vec &r, const double &e = 1e-6)
{uA.clear();ub.clear();uA.push_back(A);ub.push_back(b);r.zeros(A.n_cols);unsigned n(A.n_cols - 1), m(-1), *a(new unsigned[A.n_cols]);for (unsigned t(0); t < A.n_rows; ++t) // 初始化排序向量a[t] = t;for (unsigned i(0); i != n; ++i) // 消元{unsigned x(i), y(i); // 选主元for (unsigned j(i); j != A.n_cols; ++j)for (unsigned k(i); k != A.n_cols; ++k)if (abs(A.at(j, k)) > abs(A.at(x, y))){x = j;y = k;}if (abs(A.at(x, y)) < e){delete[] a;return true;}bool flag(false);if (x != i){for (unsigned j(i); j < A.n_cols; ++j){double t(A.at(x, j));A.at(x, j) = A.at(i, j);A.at(i, j) = t;}double t(b.at(x));b.at(x) = b.at(i);b.at(i) = t;flag = true;}if (y != i){for (unsigned j(0); j < A.n_cols; ++j){double t(A.at(j, i));A.at(j, i) = A.at(j, y);A.at(j, y) = t;}flag = true;unsigned t(a[i]);a[i] = a[y];a[y] = t;}if (flag){uA.push_back(A);ub.push_back(b);}for (unsigned j(i + 1); j != A.n_cols; ++j){double t(A.at(j, i) / A.at(i, i));A.at(j, i) = 0;b.at(j) -= t * b.at(i);for (unsigned k(i + 2); k < A.n_cols; ++k)A.at(j, k) -= t * A.at(i, k);}uA.push_back(A);ub.push_back(b);}do // 回代{if (abs(A.at(n, n)) < e){delete[] a;return true;}r.at(a[n]) = b.at(n) /= A.at(n, n);A.at(n, n) = 1;for (unsigned i(0); i != n; ++i){b.at(i) -= A.at(i, n) * b.at(n);A.at(i, n) = 0;}uA.push_back(A);ub.push_back(b);} while (--n != m);delete[] a;return false;
}

列选主元Gauss-Jordan消去法

/** 列选主元Gauss-Jordan消去法* A : 系数矩阵* b : 常数向量* uA: 系数矩阵消元过程* ub: 常数向量消元过程* e : 判零标准** 返回(bool):*  true : 求解失败*  false: 求解成功** 不检查矩阵维数是否匹配问题*/
bool Gauss_Jordan(mat A, vec b, vector<mat> &uA, vector<vec> &ub, const double &e = 1e-6)
{uA.clear();ub.clear();uA.push_back(A);ub.push_back(b);unsigned n(A.n_cols - 1);for (unsigned i(0); i != n; ++i){unsigned max(i); // 选列主元for (unsigned j(i + 1); j != A.n_cols; ++j)if (abs(A.at(j, i)) > abs(A.at(max, i)))max = j;if (abs(A.at(max, i)) < e)return true;if (max != i){for (unsigned j(i); j != A.n_cols; ++j){double t(A.at(i, j));A.at(i, j) = A.at(max, j);A.at(max, j) = t;}double t(b.at(max));b.at(max) = b.at(i);b.at(i) = t;uA.push_back(A);ub.push_back(b);}b.at(i) /= A.at(i, i);for (unsigned k(i + 1); k != A.n_cols; ++k)A.at(i, k) /= A.at(i, i);for (unsigned j(i + 1); j < A.n_rows; ++j){b.at(j) -= b.at(i) * A.at(j, i);for (unsigned k(i + 1); k < A.n_cols; ++k)A.at(j, k) -= A.at(i, k) * A.at(j, i);A.at(j, i) = 0;}for (unsigned j(0); j != i; ++j){b.at(j) -= b.at(i) * A.at(j, i);for (unsigned k(i + 1); k < A.n_cols; ++k)A.at(j, k) -= A.at(i, k) * A.at(j, i);A.at(j, i) = 0;}A.at(i, i) = 1;uA.push_back(A);ub.push_back(b);}return false;
}

实例分析

用列主元高斯消去法求解方程组

{ 0.101 x 1 + 2.304 x 2 + 3.555 x 3 = 1.183 − 1.347 x 1 + 3.712 x 2 + 4.623 x 3 = 2.137 − 2.835 x 1 + 1.072 x 2 + 5.643 x 3 = 3.035 \begin{cases} 0.101x_1+2.304x_2+3.555x_3=1.183\\ -1.347x_1+3.712x_2+4.623x_3=2.137\\ -2.835x_1+1.072x_2+5.643x_3=3.035 \end{cases} 0.101x1+2.304x2+3.555x3=1.1831.347x1+3.712x2+4.623x3=2.1372.835x1+1.072x2+5.643x3=3.035

代入程序, 求得列主元高斯消元过程如下:

( 0.101000 2.304000 3.555000 1.183 − 1.347000 3.712000 4.623000 2.137 − 2.835000 1.072000 5.643000 3.035 ) → ( − 2.835000 1.072000 5.643000 3.035 − 1.347000 3.712000 4.623000 2.137 0.101000 2.304000 3.555000 1.183 ) → ( − 2.835000 1.072000 5.643000 3.035 0.000000 3.202658 1.941829 0.694974 0.000000 2.342191 3.756038 1.29113 ) → ( − 2.835000 1.072000 5.643000 3.035 0.000000 3.202658 1.941829 0.694974 0.000000 0.000000 2.335926 0.782872 ) → ( − 2.835000 1.072000 0.000000 1.14378 0.000000 3.202658 0.000000 0.0441809 0.000000 0.000000 1.000000 0.335144 ) → ( − 2.835000 0.000000 0.000000 1.12899 0.000000 1.000000 0.000000 0.0137951 0.000000 0.000000 1.000000 0.335144 ) → ( 1.000000 0.000000 0.000000 − 0.398234 0.000000 1.000000 0.000000 0.0137951 0.000000 0.000000 1.000000 0.335144 ) \begin{aligned} \begin{pmatrix} 0.101000&2.304000&3.555000& 1.183 \\ -1.347000&3.712000&4.623000& 2.137 \\ -2.835000&1.072000&5.643000& 3.035 \\ \end{pmatrix}\\\rightarrow \begin{pmatrix} -2.835000&1.072000&5.643000& 3.035 \\ -1.347000&3.712000&4.623000& 2.137 \\ 0.101000&2.304000&3.555000& 1.183 \\ \end{pmatrix}\\\rightarrow \begin{pmatrix} -2.835000&1.072000&5.643000& 3.035 \\ 0.000000&3.202658&1.941829& 0.694974 \\ 0.000000&2.342191&3.756038& 1.29113 \\ \end{pmatrix}\\\rightarrow \begin{pmatrix} -2.835000&1.072000&5.643000& 3.035 \\ 0.000000&3.202658&1.941829& 0.694974 \\ 0.000000&0.000000&2.335926& 0.782872 \\ \end{pmatrix}\\\rightarrow \begin{pmatrix} -2.835000&1.072000&0.000000& 1.14378 \\ 0.000000&3.202658&0.000000& 0.0441809 \\ 0.000000&0.000000&1.000000& 0.335144 \\ \end{pmatrix}\\\rightarrow \begin{pmatrix} -2.835000&0.000000&0.000000& 1.12899 \\ 0.000000&1.000000&0.000000& 0.0137951 \\ 0.000000&0.000000&1.000000& 0.335144 \\ \end{pmatrix}\\\rightarrow \begin{pmatrix} 1.000000&0.000000&0.000000& -0.398234 \\ 0.000000&1.000000&0.000000& 0.0137951 \\ 0.000000&0.000000&1.000000& 0.335144 \\ \end{pmatrix} \end{aligned} 0.1010001.3470002.8350002.3040003.7120001.0720003.5550004.6230005.6430001.1832.1373.035 2.8350001.3470000.1010001.0720003.7120002.3040005.6430004.6230003.5550003.0352.1371.183 2.8350000.0000000.0000001.0720003.2026582.3421915.6430001.9418293.7560383.0350.6949741.29113 2.8350000.0000000.0000001.0720003.2026580.0000005.6430001.9418292.3359263.0350.6949740.782872 2.8350000.0000000.0000001.0720003.2026580.0000000.0000000.0000001.0000001.143780.04418090.335144 2.8350000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.0000001.128990.01379510.335144 1.0000000.0000000.0000000.0000001.0000000.0000000.0000000.0000001.0000000.3982340.01379510.335144

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式Regex

是什么&#xff1a;一句话&#xff0c;正则表达式是对字符串执行模式匹配的技术。 从一段字符串中提取出所有英文单词、数字、字母和数字。 如果采用传统方法&#xff1a;将字符串的所有字符分割成单个&#xff0c;根据ASCII码判断&#xff0c;在一定范围内就是字母&#xff…

pymssql 报错误解决办法:20002, severity 9

错误 解决办法 python3.6&#xff0c;安装pymssql低版本&#xff08;pymssql-2.1.5-cp36-cp36m-win32.whl&#xff09;

【教3妹学编程-算法题】构造限制重复的字符串

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开森。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;最近一周都是大晴天&#xff0c;艳阳高照 2哥&#xff1a;是啊&am…

相比其他关系型数据库,亚信安慧AntDB JDBC驱动特性有哪些不同之处

关键字&#xff1a;JDBC&#xff0c;双引擎语法&#xff0c;安全加强&#xff0c;批量更新 使用Java语言进行各类应用程序的快速开发成为目前比较主要且流行的开发方式。JDBC是 Java 语言中用来连接和操作关系型数据库的 API&#xff0c;在业务程序与关系型数据库通信时&#…

一文了解Git(所有命令)附带图片

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…

机器学习算法理论:线性回归

线性回归 回归的理论解释&#xff1a;回归分析是确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型&#xff0c;可分为线性回归分析和非线性回归分析。 如果在回归分析中&#xff0c;只包括一个自变量和一个因变量&#xff0c;…

【Linux】Linux基础之权限

目录 一、Linux中的用户1.1 用户之间的身份切换1.2 指令提权 二、权限管理2.1 文件权限2.2 权限操作2.3 chown和chgrp 三、文件类型四、目录文件的权限操作五、权限掩码六、粘滞位 一、Linux中的用户 Linux中主要有两种用户&#xff1a; root&#xff0c;超级用户非root&…

Netfilter 是如何工作的(六):连接跟踪信息的入口创建(in)和出口确认(confirm)

Articles (gitee.io) IPtables-朱双印博客 (zsythink.net) 在 Netfilter 是如何工作的(五) 中连接跟踪信息使用的创建-确认机制的 Netfilter在报文进入系统的入口处&#xff0c;将连接跟踪信息记录在报文上&#xff0c;在出口进行confirm.确认后的连接信息 本文以一个本机上送…

【MATLAB】CEEMDAN+FFT+HHT组合算法

代码原理 集成经验模态分解&#xff08;CEEMDAN&#xff09;是一种信号处理方法&#xff0c;旨在将非线性和非平稳信号分解为本质模态函数&#xff08;IMF&#xff09;。这种方法通过对信号进行多轮迭代&#xff0c;结合了噪声干扰的累计退化&#xff0c;从而更好地处理了信号…

关于React你必须知道的3个错误用法。

1. 你知道如何使用“&&”吗? 在React程序中,我经常使用“&&”运算符来决定是否显示内容,如下所示: 我的组长: “你不知道&&运算符的特性吗?当请求还没有成功返回时,会直接渲染“0”。” 我并不信服, 因为我一直都是这样编写代码,从未出过错。为了…

计算机网络技术-2022期末考试解析

【前言】 这是计算机网络技术这门课&#xff0c;感觉和计网还是有不一样的&#xff0c;但也有能做的&#xff0c;把能做的做了。 一、单项选择题&#xff08;每题2分&#xff0c;共20分&#xff09; 1. 用于测试两台计算机连通状况的命令是 。 ( ) A. cmd B. ping C. ipconf…

Java副本的概念

在Java中&#xff0c;"副本"&#xff08;copy&#xff09;一词可以用于描述不同的概念&#xff0c;具体取决于上下文。以下是两个常见的用法&#xff1a; 对象的副本&#xff1a;在Java中&#xff0c;当你创建一个对象并将其赋值给另一个变量时&#xff0c;实际上是创…

配置CentOS系统以支持静态HTTP服务

CentOS是一个流行的Linux发行版&#xff0c;广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Web服务器软件&#xff1a;CentOS自带了Apache HTTP服务器软件&#xff0c;您可以使用以下命令安装它&#xff1…

Go 知多少?

作为一名已接触过其他语言的开发&#xff0c;再去学习一门新语言可比之前轻松不少&#xff0c; 语言之间存在很多相似点&#xff0c;但是新语言也有自己的不同点&#xff0c;通常我会先了解它与其他语言常遇到的不同点有哪些&#xff0c; 使自己先能够上手编写基础程序&#…

Java多线程:初识多线程!左手画方,右手画圆

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

DNS 正/反向解析 主从复制 分离解析

一 DNS概念它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网 每一台 DNS 服务器都只负责管理一个有限范围 根域: 全球根服务器节点只有13个,10个在美国&#xff0c;1个荷兰&#xff0c;1个瑞典&#xff0c;1个日本 一级域名&#xff…

【已解决】C语言实现多线程的同步与异步

说真的写了这篇博文时&#xff0c;才知道c语言本身不支持多线程&#xff0c;而是一些windowsapi让c语言拥有多线程的能力&#xff0c;那下面内容就以打开对话框为例&#xff0c;展现如何实现多线程的同步与异步。 文章目录 问题起源c语言多线程同步方案c语言多线程异步方案总结…

Typora使用及Markdow学习笔记1

编程如画&#xff0c;我是panda&#xff01; 最近有在学习Markdown&#xff0c;所以这次分享一下我的Markdown学习笔记 目录 前言 一、标题 二、段落 1.换行 2.分割线 三、文字显示 1.字体 2.上下标 四、列表 1.无序列表 2.有序列表 3.任务列表 五、区块 六、代…

【Linux运维】LVM和RAID学习及实践

LVM和RAID学习及实践 背景LVM简介新加硬盘的操作RAID-磁盘阵列应用场景RAID0RAID1其他结构RAID制作RAID 小结 背景 某台服务器的磁盘管理需要自己动手处理&#xff0c;找了一些资料也踩了一些坑&#xff0c;在这里记录一下&#xff0c;先介绍一下LVM和RAID这两个东西。在计算机…

【天龙八部】攻略day6

关键字&#xff1a; 灵武、寻宝要求、雁门 1】灵武选择 西凉枫林&#xff0c;锦带&#xff0c;短匕 白溪湖&#xff0c;明镜&#xff0c;双刺 竹海&#xff0c;玉钩&#xff0c;锁甲 2】楼兰寻宝需求 等级80级&#xff0c;40级前6本心法 3】雁门奖励 简单35*4元佑碎金 普…