📄 gauss_seidel.cpp
字号:
#include<iostream.h>
#include<iomanip.h>
#include<stdio.h>
#include<math.h>
#define M 10
int n;
void Gauss_seidel(double x[],double x0[],double a[][M],double b[],double eps,int Nmax)
{
int i,j,s=0;
double max;
while(s<Nmax)
{
for(i=0;i<n;i++)
{
x[i]=b[i];
for(j=0;j<n;j++)
if(j!=i)
x[i]=x[i]-a[i][j]*x[j];
x[i]=x[i]/a[i][i];
}
max=fabs(x[0]-x0[0]);
for(i=1;i<n;i++)
if(fabs(x[i]-x0[i])>max)
max=fabs(x[i]-x0[i]);
if(max<eps)
break;
for(i=0;i<n;i++)
x0[i]=x[i];
s++;
}
if(s>=Nmax)
printf("迭代法发散!\n");
else
{
printf("原方程组的解为:\n");
for(i=0;i<n;i++)
printf("X%d=%f\n",i+1,x[i]);
}
}
void main()
{
double a1[10][10]={{8,-3,2},{4,11,-3},{6,3,6}};
double a2[10][10]={{2,-1,10,0},{0,3,-1,8},{10,-1,2,0},{-1,11,-1,3}};
double b1[10]={20,33,36},b2[10]={-11,-11,6,25};
double x1[10],x2[10],x01[10],x02[10];
double eps;
int i,j,s=0,Nmax;
cout<<"下面是第一题的矩阵表示:"<<endl;
n=3;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(6)<<a1[i][j];
cout<<setw(6)<<b1[i]<<endl;
}
cout<<"请输入初始向量:"<<endl;
for(i=0;i<n;i++)
{
printf("X%d=",i+1);
cin>>x1[i];
x01[i]=x1[i];
}
printf("\n请输入精度:");
cin>>eps;
printf("请输入最大迭代次数:");
cin>>Nmax;
Gauss_seidel(x1,x01,a1,b1,eps,Nmax);
cout<<endl;
cout<<"下面是第二题的矩阵表示形式:"<<endl;
n=4;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(6)<<a2[i][j];
cout<<setw(6)<<b2[i]<<endl;
}
cout<<"请输入初始向量:"<<endl;
for(i=0;i<n;i++)
{
printf("X%d=",i+1);
cin>>x2[i];
x02[i]=x2[i];
}
cout<<endl;
cout<<"请输入精度: ";
cin>>eps;
cout<<"请输入最大迭代次数: ";
cin>>Nmax;
Gauss_seidel(x2,x02,a2,b2,eps,Nmax);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -