[计算机数值分析]高斯-塞德尔迭代公式解线性方程组

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;
				
	

以上是关于[计算机数值分析]高斯-塞德尔迭代公式解线性方程组的主要内容,如果未能解决你的问题,请参考以下文章

《数值分析》-- 雅可比迭代法高斯—塞德尔迭代法

《数值分析》-- 雅可比迭代法高斯—塞德尔迭代法

《数值分析》-- 雅可比迭代法高斯—塞德尔迭代法

高斯-塞德尔方法解方程组

《数值分析》-- 非线性方程的数值解法

《数值分析》-- 非线性方程的数值解法