jacobi迭代法和Gauss-Seidel迭代法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值计算方法实验报告(五)
班级:地信10801序号:姓名:
一、实验题目:jacobi迭代法和Gauss-Seidel迭代法
二、实验学时: 2学时
三、实验目的和要求:
1.掌握迭代法的基础原理。
2.掌握jacobi迭代法和Gauss-Seidel迭代法的步骤。
3.能用程序语言对jacobi迭代法和Gauss-Seidel迭代法进行编程实现。
cout<<"x["<<i<<"]="<<x[i]<<endl;
}
void guass_seidel()
{
int Nx=0,times=0;
while(Nx<N)
{
times++;
Nx=0;
if(times>=M)
{
cout<<"发散"<<endl;
break;
}
for(int i=1;i<=N;i++)
if(i!=j)sum+=xk[j]*a[i][j];
x[i]=(a[i][N+1]-sum)/a[i][i];
if(fabs(x[i]-xk[i])<e)Nx++;
}
for(i=1;i<=N;i++)xk[i]=x[i];
}
cout<<"times="<<times<<endl;
for(int i=1;i<=N;i++)
四、实验过程代码及结果
1、代码:
#include<iostream.h>
#include<math.h>
float x[100],xk[100];
float e;
int N,M=1000;
float a[100][101];
void initdata()
{
cout<<"输入方程阶数:";
cin>>N;
}
void jocobi()
{
int Nx=0,times=0;
while(Nx<N)
{
times++; Nx=0;
if(times>=M){cout<<"发散"<<endl; break;}
for(int i=1;i<=N;i++)
{
float sum=0;
for(int j=1;j<=N;j++)
{
float sum1=0;
float sum2=0;
for( int j=i+1;j<=N;j++)
{sum1+=xk[j]*a[i][j];}
for( j=1;j<=i-1;j++)
{sum2+=a[i][j]*xk[j];}
x[i]=(a[i][N+1]-sum1-sum2)/a[i][i];
{
char ch;
initdata();
cout<<"请选择解方程的方法:\n";
cout<<"A:jocobi B:guass_seidel \n";
cin>>ch;
if(ch=='A')
jocobi();
else if(ch=='B')
guass_seidel();
}
2.结果:
cout<<"输入误差限e:";
cin>>e;
cout<<"输入方程系数:"<<endl;
for(int i=1;i<=N;i++)
for(int j=1;j<=N+1;j++)
cin>>a[i][j];
cout<<"输入初始解向量x0:"<<endl;
for(i=1;i<=N;i++)cin>>xk[i];
if(fabs(x[i]-xk[i])<e)
Nx++;
}Fra Baidu bibliotek
for(i=1;i<=N;i++)xk[i]=x[i];
}
cout<<"times="<<times<<endl;
for(int i=1;i<=N;i++)
cout<<"x["<<i<<"]="<<x[i]<<endl;
}
void main()
班级:地信10801序号:姓名:
一、实验题目:jacobi迭代法和Gauss-Seidel迭代法
二、实验学时: 2学时
三、实验目的和要求:
1.掌握迭代法的基础原理。
2.掌握jacobi迭代法和Gauss-Seidel迭代法的步骤。
3.能用程序语言对jacobi迭代法和Gauss-Seidel迭代法进行编程实现。
cout<<"x["<<i<<"]="<<x[i]<<endl;
}
void guass_seidel()
{
int Nx=0,times=0;
while(Nx<N)
{
times++;
Nx=0;
if(times>=M)
{
cout<<"发散"<<endl;
break;
}
for(int i=1;i<=N;i++)
if(i!=j)sum+=xk[j]*a[i][j];
x[i]=(a[i][N+1]-sum)/a[i][i];
if(fabs(x[i]-xk[i])<e)Nx++;
}
for(i=1;i<=N;i++)xk[i]=x[i];
}
cout<<"times="<<times<<endl;
for(int i=1;i<=N;i++)
四、实验过程代码及结果
1、代码:
#include<iostream.h>
#include<math.h>
float x[100],xk[100];
float e;
int N,M=1000;
float a[100][101];
void initdata()
{
cout<<"输入方程阶数:";
cin>>N;
}
void jocobi()
{
int Nx=0,times=0;
while(Nx<N)
{
times++; Nx=0;
if(times>=M){cout<<"发散"<<endl; break;}
for(int i=1;i<=N;i++)
{
float sum=0;
for(int j=1;j<=N;j++)
{
float sum1=0;
float sum2=0;
for( int j=i+1;j<=N;j++)
{sum1+=xk[j]*a[i][j];}
for( j=1;j<=i-1;j++)
{sum2+=a[i][j]*xk[j];}
x[i]=(a[i][N+1]-sum1-sum2)/a[i][i];
{
char ch;
initdata();
cout<<"请选择解方程的方法:\n";
cout<<"A:jocobi B:guass_seidel \n";
cin>>ch;
if(ch=='A')
jocobi();
else if(ch=='B')
guass_seidel();
}
2.结果:
cout<<"输入误差限e:";
cin>>e;
cout<<"输入方程系数:"<<endl;
for(int i=1;i<=N;i++)
for(int j=1;j<=N+1;j++)
cin>>a[i][j];
cout<<"输入初始解向量x0:"<<endl;
for(i=1;i<=N;i++)cin>>xk[i];
if(fabs(x[i]-xk[i])<e)
Nx++;
}Fra Baidu bibliotek
for(i=1;i<=N;i++)xk[i]=x[i];
}
cout<<"times="<<times<<endl;
for(int i=1;i<=N;i++)
cout<<"x["<<i<<"]="<<x[i]<<endl;
}
void main()