⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 Gauss_Seidel法解方程组,对同一系数矩阵的方程组
💻 CPP
字号:
//     《数值方法》: 用Gauss_Seidel法解方程组
//            athor: 李征
//             date: 2005/11/26
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>

using namespace std;

vector< vector< double > > A;		// 存储系数矩阵及其变换矩阵的向量
vector< double > X;					// 存储方程组的解
int n = 0;							// 系数矩阵的行数
int nmax = 1000;					// 最大迭代次数
double e = 0.00000000001;			// 精度
double Temp = 0;					// 读取数据时的临时变量
void ComputeN(ifstream &sin);		// 计算出n的值
void ReadValue(ifstream &sin);		// 读取数据
void OutputMatrix();				// 输出矩阵
void Gauss_Seidel();				// Gauss-Seidel 算法

int main ()
{
	ifstream fin("data.txt");	
	if (!fin)
	{
		cout << "Could not open data.txt" << endl;
		char a;cin >> a;
		return 1;
	}
	ComputeN(fin);
	ReadValue(fin);
	cout << "原始数据:" << endl;
	OutputMatrix();
	Gauss_Seidel();
	cout << "方程的解如下:" << endl;
	for (int i = 1;i <= n;i ++)
		{
			cout << "X" << i << " = " << setprecision(15) << X[i - 1] << endl;
		}
	
	char a;
	cin >> a;
	return 0;
}
// 计算出n的值
void ComputeN(ifstream &sin)
{
	int s = 0;
	string strTemp = "";
	while (sin >> strTemp)
	{
		s ++;
	}
	n = (-1 + sqrt(1 + 4 * s)) / 2;
	cout << "n = " << n << endl;
	sin.close();
	sin.clear();
}
// 读取数据
void ReadValue(ifstream &sin)
{
	sin.open("data.txt");
	A.resize(n);
	for (int i = 0;i < n;i ++)
	{	
		A[i].resize(n + 1);	
		for (int j = 0;j <= n;j ++)
		{			
			sin >> Temp;			
			A[i][j] = Temp;						
		}			
	}	
	sin.close();	
}
// 输出矩阵
void OutputMatrix()
{
	for (int p = 0;p < n;p ++)
	{
		for (int q = 0;q <= n;q ++)
		{
			cout << setw(15) << A[p][q];
		}
		cout << endl;
	}
	cout << "\n" ;
}
// Gauss-Seidel 算法
void Gauss_Seidel()
{
	X.resize(n);
	double dTemp1 = 0;
	double dTemp2 = 0;
	int m1 = 0;
	int m2 = 0;
	do
	{
		m2 ++;
		for (int i = 0;i < n;i ++)
		{
			for (int j = 0;j < n;j ++)
			{
				if (j != i)
				{
					dTemp1 += A[i][j] * X[j];
				}
			}
			if (m1 != 0)
			{
				dTemp2 = X[i];
			}
			m1 ++;			
			X[i] = (A[i][n] - dTemp1) / A[i][i];
			dTemp1 = 0;
			dTemp2 = fabs(X[i] - dTemp2);			
		}
		if (m2 > nmax)
		{
			cout << "超过最大迭代次数,停止计算!" << endl;
			exit(1);
			char a;
			cin >> a;
		}
	} while(dTemp2 > e);
	cout << "迭代次数:" << m2 << endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -