[计算机数值分析]高斯-塞德尔迭代公式解线性方程组
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[计算机数值分析]高斯-塞德尔迭代公式解线性方程组相关的知识,希望对你有一定的参考价值。
在雅可比迭代公式的基础上,对于收敛的迭代过程,所求出的“新值”常比“老值”更准确些,因此可以用它替代老值作进一步的计算,这样的思想就是著名的高斯-塞德尔迭代公式。
如下图叙述:
- 运行示例:
- 源码:
#include<iostream>
#include<iomanip>
#define MAX 10
using namespace std;
int main(void)
double a[MAX][MAX]; //二维数组存储原始方程组的增广矩阵
int row, col;
cout << "请输入增广矩阵行数:"; //行数,即方程个数
cin >> row;
cout << "请输入增广矩阵列数:"; //列数,包含常数项
cin >> col;
cout << endl;
//增广矩阵输入提示,按行输入
for (int i = 1; i <= row; i++)
cout << "请输入增广矩阵第" << i << "行的元素:";
for (int j = 1; j <= col; j++)
cin >> a[i][j];
cout << endl;
//对元素进行处理
for (int i = 1; i <= row; i++)
for (int j = 1; j <= col; j++)
if (i != j && j != col)
a[i][j] /= -a[i][i]; //非行列坐标相等的元素除以负行列坐标相等的元素
if (j == col)
a[i][j] /= a[i][i]; //常数项除以行列相等的元素
//对a[1][1]、a[2][2]......赋值为0
for (int i = 1; i <= row; i++)
a[i][i] = 0;
double b[MAX]; //记录每次迭代后的值
//迭代初值
cout << "请输入迭代初值:";
for (int i = 1; i < col; i++) //用数组b记录每次迭代后的x的值,用于下次迭代
cin >> b[i];
int N; //允许的最大迭代次数
cout << "请输入最大迭代次数:";
cin >> N;
double accuracy; //精度
double error = 0; //相邻两次迭代结果的误差
cout << "请输入精度:";
cin >> accuracy;
for (int i = 1; i <= N; i++) //最多允许迭代N次
cout << "第" << i << "次迭代:";
int count = 1; //用count控制迭代值按每行col-1个输出,即自变量个数输出
for (int j = 1; j <= row; j++) //每一次迭代(i),求取每一行的行列坐标相等的值即a[j][j]
double item; //中间变量
for (int k = 1; k <= col; k++) //j循环一次,j循环col次,求得a[j][j]
if (j == k) //如果j=k,继续
continue;
if (k != col) //如果j不等于k且不等于常数项的下标
item = a[j][k] * b[k]; //则每一项等于系数与对应迭代初值的乘积
else
item = a[j][col]; //j=col即常数项下标时,直接加上常数项,不对常数项处理
a[j][j] += item; //累加item,求的a[1][1],a[2][2]......
cout << "\\t\\t" << a[j][j] << "\\t\\t"; //输出a[1][1],a[2][2]......
error = abs(a[count][count] - b[count]); //相邻两次迭代结果的偏差
b[count] = a[count][count]; //更新b[]里的值为本次迭代结束的值
a[count][count] = 0; //赋a[1][1],a[2][2]......值为0,避免拥有初值影响下一次迭代结果
if (count % (col - 1) == 0) //控制元素输出个数
cout << endl;
count++;
if (error <= accuracy) //解符合精度要求,直接结束迭代过程
break;
if (error > accuracy && i <= N) //解不符合精度要求但未超过最大迭代次数,继续迭代
continue;
else //超过最大迭代次数,输出提示
cout << "达到允许的最大迭代次数,未找到符合精度要求的根!" << endl;
以上是关于[计算机数值分析]高斯-塞德尔迭代公式解线性方程组的主要内容,如果未能解决你的问题,请参考以下文章