雅可比迭代法与高斯迭代法主要用于求解线性方程组,经过n次迭代收敛于精确值达到求解近似解的目的
雅可比迭代法与高斯迭代法区别 雅可比迭代法
雅可比迭代法迭代原理为,每次迭代均使用上次迭代的值,如以下方程组
通过变换可得
总结公式为:
高斯迭代法
高斯迭代法比雅可比速度更快,高斯迭代法采用将每次迭代过程结果带入的原理进行迭代,在
雅可比算法上进行了优化,具体过程如下:
总结公式为:
附C++代码//雅可比迭代法 //4x + 2x + x = 11 (x1 ,x2, x3) 范例 //x + 4x + 2x = 18 //2x + x + 5x = 22 // " * "为参数数量更改需要更改处 #include#include #define a 3 //*定义系数个数,这里设置为3 #define b 3 //*一个公式3个系数(a),一共3个式子 using namespace std; double A[a][b] = { 4,2,1 , 1,4,2 , 2,1,5 }; //*系数矩阵 double B[b] = {11,18,22}; //*行列式矩阵 double e = pow(10, -7); //定义精度 double C[b][a + 1]; //记录迭代矩阵 double x0[a] = { 0 }; //初始迭代矩阵 double X[a]; //用来储存第K次迭代后的数值 bool Judge(double x1, double x2, double x3) //*判断精度(本题共有3个系数,所以三个变量,题目改变增加变量) { int m = 0; if (abs(x0[0] - x1) < e) m++; //*(更改系数个数) if (abs(x0[1] - x2) < e) m++; if (abs(x0[2] - x3) < e) m++; if (m == 3) return 1; else return 0; } void output(double X[]) { int i; for (int i = 0; i < a; i++) { printf("%.5f", X[i]); cout << " "; } cout << endl; } void Matrix() //计算迭代公式中的系数矩阵 { for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { C[i][j] = -(A[i][j] / A[i][i]); if (i == j) { C[i][j] = 0; } } C[i][3] = B[i] / A[i][i]; //*(因为系数有三个,所以第i行第四个元素存放第i个式子的数值) } } void J() //雅可比 { int n = 0; //迭代次数 //double X[a]; //用来储存第K次迭代后的数值 for (int i = 0; i < a; i++) { X[i] = x0[i]; } while (true) { for (int i = 0; i < a; i++) { x0[i] = C[i][0] * X[0] + C[i][1] * X[1] + C[i][2] * X[2]+C[i][3]; //* } n++; if (Judge(X[0], X[1], X[2])) { break; } cout << "第" << n << "次迭代结果" << endl; output(X); //打印第i次迭代结果 for (int i = 0; i < a; i++) { X[i] = x0[i]; } } } void main() { Matrix(); cout << "雅可比迭代" << endl; J(); cout << "最终结果" << endl; output(X); }
//高斯迭代法 //4x + 2x + x = 11 (x1 ,x2, x3) 范例 //x + 4x + 2x = 18 //2x + x + 5x = 22 // " * "为参数数量更改需要更改处 #include雅可比迭代法与高斯结果对比#include #define a 3 //*定义系数个数,这里设置为3 #define b 3 //*一个公式3个系数(a),一共3个式子 using namespace std; double A[a][b] = { 4, 2, 1, 1, 4, 2, 2, 1, 5 }; //*系数矩阵 double B[b] = { 11, 18, 22 }; //*行列式矩阵 double e = pow(10, -7); //定义精度 double C[b][a + 1]; //记录迭代矩阵 double x0[a] = { 0 }; //初始迭代矩阵 double X[a]; //用来储存第K次迭代后的数值 bool Judge(double x1, double x2, double x3) //*判断精度(本题共有3个系数,所以三个变量,题目改变增加变量) { int m = 0; if (abs(x0[0] - x1) < e) m++; //*(更改系数个数) if (abs(x0[1] - x2) < e) m++; if (abs(x0[2] - x3) < e) m++; if (m == 3) return 1; else return 0; } void output(double X[]) { int i; for (int i = 0; i < a; i++) { printf("%.5f", X[i]); cout << " "; } cout << endl; } void Matrix() //计算迭代公式中的系数矩阵 { for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { C[i][j] = -(A[i][j] / A[i][i]); if (i == j) { C[i][j] = 0; } } C[i][3] = B[i] / A[i][i]; //*(因为系数有三个,所以第i行第四个元素存放第i个式子的数值) } } void GS() //高斯 { int n = 0; //迭代次数 for (int i = 0; i < a; i++) { X[i] = x0[i]; } while (true) { for (int i = 0; i < a; i++) { x0[i] = C[i][0] * x0[0] + C[i][1] * x0[1] + C[i][2] * x0[2] + C[i][3]; //*(x0初始矩阵变为k+1次迭代结果) } n++; if (Judge(X[0], X[1], X[2])) { break; } cout << "第" << n << "次迭代结果" << endl; output(x0); //打印第i次迭代结果 for (int i = 0; i < a; i++) { X[i] = x0[i]; } } } void main() { Matrix(); cout << "高斯迭代" << endl; GS(); cout << "最终结果" << endl; output(x0); }
雅可比在上述例子中运行50次得到精确度为10^(-7)得近似解,高斯迭代法经过17次便可以得出精确度为10^(-7)的近似解,故高斯-塞德尔迭代法得效率远远大于雅可比迭代法得效率。



