📄 作业gauss_seidel.cpp
字号:
#include"iostream.h"
#include"iomanip.h"
#include"math.h"
void OutPut(double *a,int n)
{
int i;
cout<<"the solution is:"<<endl;
for(i=0;i<n;i++)
cout<<setw(15)<<setprecision(8)<<a[i];
cout<<endl<<endl;
}
bool IsContent(double *a,double *b,int n,int flag)
{
double TOL=0.00001;
int i;
double max1=0,max2=0;
for(i=0;i<n;i++)
{
if(flag==1)
{
if(max1<fabs(a[i]))
max1=fabs(a[i]);
}
else
{
max1+=a[i]*a[i];
max1=sqrt(max1);
}
if(max2<fabs(fabs(a[i])-fabs(b[i])))
max2=fabs(fabs(a[i])-fabs(b[i]));
}
if(max2/max1<TOL)
{
OutPut(a,n);
return true;
}
else
return false;
}
void AssignValue(double *a,double *b,int n)
{
int i;
for(i=0;i<n;i++)
a[i]=b[i];
}
void FindValue(double a[][6],double *b,int n,int flag,int l)
{
int i;
int j;
if(flag==1)
{
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
b[i]=a[i][n];
}
else
{
for(i=0;i<n;i++)
if(l!=i)
b[i]=a[l][i];
else
b[i]=0;
}
}
double MulMin(double *a,double *b,int flag,int n,double va,int l)
{
int i;
double aa=0;
for(i=0;i<n;i++)
if(flag==1)
aa+=a[i]*b[i];
if(flag==2)
aa=b[l]-va;
return aa;
}
void Jaus(int flag)
{
double a[5][6]={4,1,1,0,1,6,
-1,-3,1,1,0,6,
2,1,5,-1,-1,6,
-1,-1,-1,4,0,6,
0,2,-1,1,4,6};
double x[5],x1[5]={0,0,0,0,0};
double b[5],c[5];
double ss;
int n=5;
int k=1,i;
FindValue(a,b,5,1,0);
while(k<20)
{
for(i=0;i<n;i++)
{
FindValue(a,c,n,2,i);
ss=MulMin(x1,c,1,n,0,0);
ss=MulMin(x1,b,2,n,ss,i);
x[i]=ss/a[i][i];
}
if(IsContent(x,x1,n,flag))
{
// cout<<" loop times "<<k<<endl;
return ;
}
k++;
AssignValue(x1,x,n);
}
cout<<"no successful"<<endl;
}
double MulMinG(double *a,double *b,int flag,int n,double va,int l)
{
int i;
double aa=0;
for(i=l;i<n;i++)
if(flag==1)
aa+=a[i]*b[i];
if(flag==2)
aa=b[l]-va;
return aa;
}
void Gaus(int flag)
{
double a[5][6]={4,1,1,0,1,6,
-1,-3,1,1,0,6,
2,1,5,-1,-1,6,
-1,-1,-1,4,0,6,
0,2,-1,1,4,6};
double x[5],x1[5]={0,0,0,0,0};
double b[5],c[5];
double ss,ss1;
int n=5;
int k=1,i;
FindValue(a,b,5,1,0);
while(k<20)
{
for(i=0;i<n;i++)
{
FindValue(a,c,n,2,i);
ss=MulMinG(x1,c,1,n,0,i+1);
ss=MulMin(x1,b,2,n,ss,i);
ss1=MulMin(x,c,1,i,0,0);
x[i]=(ss-ss1)/a[i][i];
}
if(IsContent(x,x1,n,flag))
{
// cout<<setw(4)<<"loop times "<<k<<endl;
return ;
}
k++;
AssignValue(x1,x,n);
}
cout<<"no successful"<<endl;
}
void main()
{
cout<<"this is Jacobi,infinate::"<<endl;
Jaus(1);
cout<<"this is Jacobi,L2::"<<endl;
Jaus(2);
cout<<"this is gauss,infinate::"<<endl;
Gaus(1);
cout<<"this is gauss,L2::"<<endl;
Gaus(2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -