在这篇文章中,不会有太多的讲解,主要是因为Sor迭代法和高斯-赛德尔(gauss-seidle)迭代法的程序只有迭代公式的一点点区别,当松弛因子为1的时候,Sor迭代法和高斯-赛德尔(gauss-seidle)迭代法是一致的。
高斯-赛德尔(gauss-seidle)迭代法
Sor迭代法
附上实现程序(Visual Studio 2019)
#include <iostream>
#include <iomanip>
using namespace std;
double a[8][8];//定义系数矩阵
double b[8];//定义b矩阵元素
double w;//定义松弛因子
double G_X1[8]; //定义每次迭代后的X1
double G_X2[8]; //定义每次迭代后的X2
double G_X3[8]; //定义每次迭代后的X3
double G_X4[8]; //定义每次迭代后的X4
double x1, x2, x3, x4;//定义初始向量
void Func_Sor(double x_1, double x_2, double x_3, double x_4, int m);//定义sor迭代法
int main()
{
int N;//定义迭代次数
cout << "请输入迭代次数:" << endl;
cin >> N;//赋值迭代次数N
for (int i = 1; i <= 4; i++)
{
cout << "请输入第" << i << "行的系数:" << endl;
for (int j = 1; j <= 4; j++)
{
cin >> a[i][j];
}
}//赋值系数矩阵
cout << "请输入松弛因子w:" << endl;
cin >> w;//赋值松弛因子
cout << "请输入b矩阵" << endl;
for (int j = 1; j <= 4; j++)
{
cin >> b[j];
} // 赋值b矩阵
cout << "请输入初始向量:" << endl;
cin >> x1 >> x2 >> x3 >> x4;
Func_Sor(x1, x2, x3, x4, N);//调用Func_Sor函数
cout << "---->>>迭代结果显示<<<----" << endl;//建立分隔符
cout << "迭代次数" << " x1" << " , x2" << " , x3 " << " , x4 " << endl;//建立输出结果的表头
for (int i = 1; i <= N; i++) //输出每次迭代的结果
{
cout << setiosflags(ios::fixed) << setprecision(8);//输出结果保留8位小数
cout << " 第" << i << "次: " << G_X1[i] << " , " << G_X2[i] << " , " << G_X3[i] << " , " << G_X4[i] << endl;
}
return 0;
}
void Func_Sor(double x_1, double x_2, double x_3, double x_4, int m)//Sor迭代法解析
{
G_X1[0] = x_1;
G_X2[0] = x_2;
G_X3[0] = x_3;
G_X4[0] = x_4;
for (int i = 0; i < m; i++)
{
G_X1[i + 1] = G_X1[i] + w * (b[1] - a[1][1] * G_X1[i] - a[1][2] * G_X2[i] - a[1][3] * G_X3[i] - a[1][4] * G_X4[i]) / a[1][1];
G_X2[i + 1] = G_X2[i] + w * (b[2] - a[2][1] * G_X1[i + 1] - a[2][2] * G_X2[i] - a[2][3] * G_X3[i] - a[2][4] * G_X4[i]) / a[2][2];
G_X3[i + 1] = G_X3[i] + w * (b[3] - a[3][1] * G_X1[i + 1] - a[3][2] * G_X2[i + 1] - a[3][3] * G_X3[i] - a[3][4] * G_X4[i]) / a[3][3];
G_X4[i + 1] = G_X4[i] + w * (b[4] - a[4][1] * G_X1[i + 1] - a[4][2] * G_X2[i + 1] - a[4][3] * G_X3[i+1] - a[4][4] * G_X4[i]) / a[4][4];
}
}
例题
程序输出结果:
特别注意:
C++学习日记#1——三元一次方程组进行高斯-赛德尔(gauss-seidle)迭代法求解C++学习日记#1——三元一次方程组进行高斯-赛德尔(gauss-seidle)迭代法求解_ALEX_2814的博客-CSDN博客
和这篇文章都是固定系数矩阵阶数的,也就是说在不改变代码的前提下,《三元一次方程组进行高斯-赛德尔(gauss-seidle)迭代法求解》这篇文章中的程序只能适用于三元一次方程组和这篇文章的程序只能适用于四元一次方程组。
———————————————————2021.11.12———————————————————
将该程序推向n阶系数矩阵,sor迭代法求解
附上实现程序(Visual Studio 2019)
#include <iostream>
#include <iomanip>
using namespace std;
double a[100][100];//定义系数3阶矩阵系数
void Func_Gauss(int N, int n);//定义高斯迭代法
double b[100];//定义b矩阵元素
double x[100][100];//定义迭代后的值(p.s 前面的括号值为迭代次数,后面括号值为x1,x2,....xn
double w;//定义松弛因子
int main()
{
int N; //定义迭代次数N
cout << "请输入迭代次数N" << endl;
cin >> N;
int n; //系数矩阵的阶数
cout << "请输入系数矩阵的阶数n" << endl;
cin >> n;
for (int i = 1; i <= n; i++)
{
cout << "请依次输入系数矩阵A第" << i << "行系数" << endl;
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
}
}
cout << "对应的b矩阵" << endl;
for (int j = 1; j <= n; j++)
{
cin >> b[j];
}
cout << "请输入初始向量" << endl;
for (int j = 1; j <= n; j++)
{
cin >> x[0][j];
}
cout << "请输入松弛因子w:" << endl;
cin >> w;
Func_Gauss(N, n);//调用高斯迭代函数
cout << "---->>>迭代结果显示<<<----" << endl;//建立分隔符
cout << setiosflags(ios::fixed) << setprecision(8);//输出结果保留8位小数
for (int i = 1; i <= N; i++)
{
cout << "第" << i << "次" << " ";
for (int j = 1; j <= n - 1; j++)
{
cout << x[i][j] << " , ";
}
cout << x[i][n];
cout << endl;
}
return 0;
}
void Func_Gauss(int N, int n)
//高斯迭代法解析
{
for (int i = 0; i < N; i++)//进行迭代循环
{
for (int j = 1; j <= n; j++)//进行x1,..xn求值
{
double sum_n = 0;//重置更新值求和为0
double sum_o = 0;//重置值求和0
for (int k = 0; k <= j - 1; k++)//进行更新值求和
{
x[i + 1][0] = 0;
a[j][0] = 0;
//系数矩阵添加第0列,元素均为0;解向量添加第0解,为0;
//为了迭代求解x1时,能有更新值求和,便于将x1迭代与其他x值迭代归纳在一起
sum_n += a[j][k] * x[i + 1][k];
}
for (int p = j; p <= n + 1; p++)//进行旧值求和
{
a[j][n + 1] = 0;
x[i][n + 1] = 0;
//系数矩阵添加第n+1列,元素均为0;解向量添加第n+1解,为0;
//为了迭代求解xn时,能有旧值求和,便于将xn迭代与其他x值迭代归纳在一起
sum_o += a[j][p] * x[i][p];
}
x[i + 1][j] = x[i][j] + w * (b[j] - (sum_n + sum_o)) / a[j][j];
}
}
}
程序输出结果:
p.s
回顾改进的时候发现了以前的程序有点小问题,主要是在迭代求解x4时,没有x3没有使用更新后的值。现已修改。