- 问题描述
输入:系数矩阵A,最大迭代次数N,初始向量,误差限e
输出:解向量
- 基本公式
- 流程图
- 算法实现
#include <iostream>
#include <iomanip>
using namespace std;
//定义系数矩阵
double a[50][50] = {0};
//定义x1解的数组
double rootX1[100];
//定义x2解的数组
double rootX2[100];
//定义x3解的数组
double rootX3[100];
//定义x1的迭代公式
double x1Iteration(double x2,double x3);
//定义x2的迭代公式
double x2Iteration(double x1,double x3);
//定义x3的迭代公式
double x3Iteration(double x1,double x2);
//核心算法,Gauss - Seidel 迭代法
void GaussSeidel(double x1,double x2,double x3,double e,int N);
//格式输出
void formatPrint(int N);
int main()
{
//最大迭代次数N
int N;
//初始向量,误差限e
double x1,x2,x3,e;
cout << "请分别输入系数矩阵A,最大迭代次数N,初始向量,误差限e" << endl;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
{
cin>>a[i][j];
}
}
cin>>N>>x1>>x2>>x3>>e;
GaussSeidel(x1,x2,x3,e,N);
formatPrint(N);
return 0;
}
//定义x1的迭代公式
double x1Iteration(double x2,double x3)
{
return 0.72 + 0.1*x2 + 0.2 * x3;
}
//定义x2的迭代公式
double x2Iteration(double x1,double x3)
{
return 0.83 + 0.1*x1 + 0.2*x3;
}
//定义x3的迭代公式
double x3Iteration(double x1,double x2)
{
return 0.84 + 0.2*x1 + 0.2*x2;
}
//核心算法,Gauss - Seidel 迭代法
void GaussSeidel(double x1,double x2,double x3,double e,int N)
{
rootX1[0] = x1;
rootX2[0] = x2;
rootX3[0] = x3;
for(int i=0;i<N;i++)
{
rootX1[i+1] = x1Iteration(rootX2[i],rootX3[i]);
rootX2[i+1] = x2Iteration(rootX1[i+1],rootX3[i]);
rootX3[i+1] = x3Iteration(rootX1[i+1],rootX2[i+1]);
}
}
//格式输出
void formatPrint(int N){
cout<<"--------------------------------------------------------"<<endl;
cout<<"k "<<"x1 "<<"x2 "<<"x3 "<<endl;
for(int i=0;i<=N;i++)
{
cout<<setiosflags(ios::fixed);
cout<<setprecision(5)<<i<<" "<<rootX1[i]<<" "<<rootX2[i]<<" "<<rootX3[i]<<endl;
}
}
- 运行截图