📄 main.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 + -