原理介绍
雅可比迭代法与高斯迭代法主要用于求解线性方程组,经过n次迭代收敛于精确值达到求解近似解的目的
雅可比迭代法与高斯迭代法区别
雅可比迭代法
雅可比迭代法迭代原理为,每次迭代均使用上次迭代的值,如以下方程组
通过变换可得
总结公式为:
高斯迭代法
高斯迭代法比雅可比速度更快,高斯迭代法采用将每次迭代过程结果带入的原理进行迭代,在
雅可比算法上进行了优化,具体过程如下:
总结公式为:
附C++代码
//雅可比迭代法
//4x + 2x + x = 11 (x1 ,x2, x3) 范例
//x + 4x + 2x = 18
//2x + x + 5x = 22
// " * "为参数数量更改需要更改处
#include<iostream>
#include<cmath>
#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<iostream>
#include<cmath>
#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)的近似解,故高斯-塞德尔迭代法得效率远远大于雅可比迭代法得效率。