解线性方程组的迭代法.docx
《解线性方程组的迭代法.docx》由会员分享,可在线阅读,更多相关《解线性方程组的迭代法.docx(14页珍藏版)》请在冰豆网上搜索。
解线性方程组的迭代法
数值分析实验报告书
课题3解线性方程组的迭代法
A.问题提出
对所列的线性方程组
X[1]
X[2]
X[3]
X[4]
X[5]
X[6]
X[7]
X[8]
X[9]
X[10]
5
12
3
2
3
46
13
38
19
-21
=
*
4,-1,0,0,0,0,0,0,0,0
-1,4,-1,0,0,0,0,0,0,0
0,-1,4,-1,0,0,0,0,0,0
0,0,-1,4,-1,0,0,0,0,0
0,0,0,-1,4,-1,0,0,0,0
0,0,0,0,-1,4,-1,0,0,0
0,0,0,0,0,-1,4,-1,0,0
0,0,0,0,0,0,-1,4,-1,0
0,0,0,0,0,0,0,-1,4,-1
0,0,0,0,0,0,0,0,-1,4
=
0
-6
6
23
11
-22-15
45
X[1]
X[2]
X[3]
X[4]
X[5]
X[6]
X[7]
X[8]
*
4,2,-4,0,2,4,0,0
2,2,-1,-2,1,3,2,0
-4,-1,14,1,-8,,-3,5,6
0,-2,1,6,-1,-4,-3,3
2,1,-8,-1,22,4,-10,-3
4,3,-3,-4,4,11,1,4
0,2,5,-3,-10,1,14,2
0,0,6,3,-3,-4,2,19
分别采用Jacobi迭代法,Gauss-Seidel迭代法和SOR迭代法求解。
B.要求
.分别对不同的精度要求,如e=10^-3,10^-4,10^-5,利用所需的迭代次数体会该迭代法的收敛快慢。
.使用SOR方法时,选取松弛因子w=0.8,0.91,1.2等,试找出你所选用松弛因子的最佳值。
.编制出各种迭代法的程序并给出计算结果。
C.实现方法(C++源代码)
#include
#include
#include
usingnamespacestd;
doublemax(doublearray[10]);
doublegs(doublex[10],doublee);
doublesor(doublex[10],doublee,doublew);
doublejacobi(doublee);
doublea[10][10]={4,-1,0,0,0,0,0,0,0,0,
-1,4,-1,0,0,0,0,0,0,0,
0,-1,4,-1,0,0,0,0,0,0,
0,0,-1,4,-1,0,0,0,0,0,
0,0,0,-1,4,-1,0,0,0,0,
0,0,0,0,-1,4,-1,0,0,0,
0,0,0,0,0,-1,4,-1,0,0,
0,0,0,0,0,0,-1,4,-1,0,
0,0,0,0,0,0,0,-1,4,-1,
0,0,0,0,0,0,0,0,-1,4};
intb[10]={7,5,-13,2,6,-12,14,-4,5,-5};
voidmain()
{
doublem,n;
inti;
doublex2[10];
cout<<"输入迭代精度"<cout<<"e=";cin>>m;
cout<<"输入sor松弛因子"<cout<<"w=";cin>>n;
cout<<"输入初解"<for(i=0;i<10;i++)
cin>>x2[i];
jacobi(m);
sor(x2,m,n);
gs(x2,m);
}
doublemax(doublearray[10])
{
doublea=array[0];
inti;
for(i=1;i<10;i++)
{
if(aa=array[i];
}
returna;
}
doublejacobi(doublee)
{
inti,j,k;
doubler,sum=0;
doublec[10]={0,0,0,0,0,0,0,0,0,0};
doublex[10]={0,0,0,0,0,0,0,0,0,0};
doublex0[10]={0,0,0,0,0,0,0,0,0,0};
for(k=1;;k++)
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
sum=a[i][j]*x0[j]+sum;
}
x[i]=x0[i]+((b[i]-sum)/a[i][i]);
c[i]=x[i]-x0[i];
if(c[i]<0)
c[i]=-c[i];
sum=0;
}
r=max(c);
if(r{for(i=0;i<10;i++)
cout<<"x["<
cout<<"雅克比迭代次数为"<return0;
}
else
for(i=0;i<10;i++)
x0[i]=x[i];
}
}
doublegs(doublex[10],doublee)
{
inti,k,j;
doubler,sum=0;
doublex0[10]={0};
doublec[10]={0};
for(k=1;;k++)
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
sum=a[i][j]*x0[j]+sum;
}
x[i]=x0[i]+((b[i]-sum)/a[i][i]);
c[i]=fabs(x[i]-x0[i]);
x0[i]=x[i];
sum=0;
}
r=max(c);
if(r{
for(i=0;i<10;i++)
cout<<"x["<
cout<<"高斯—塞德尔迭代法迭代次数="<return0;
}
}
}
doublesor(doublex[10],doublee,doublew)
{
inti,k,j;
doubler,sum=0;
doublex0[10]={0};
doublec[10]={0};
doublem;
for(k=1;;k++)
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
sum=a[i][j]*x0[j]+sum;
}
m=w*((b[i]-sum)/a[i][i]);
x[i]=m+x0[i];
c[i]=fabs(m);
x0[i]=x[i];
sum=0;
}
r=max(c);
if(r{for(i=0;i<10;i++)
cout<<"x["<
cout<<"逐次超松弛迭代法迭代步数="<return0;
}
}
}
D.运行结果(截图)
.
.
.
.
.
E.迭代法程序运行结果分析
就以上结果分析,在相同的迭代精度下,GS迭代法和SOR迭代法的迭代次数明显少于Jacobi迭代法的迭代次数。
这说明,GS和SOR迭代法比Jacobi迭代法具有更加快速的收敛性。
而对比这几次迭代结果,SOR松弛因子对SOR迭代法的收敛速度和收敛结果与精确解的近似程度有比较大的影响,根据这几次的地待发运行结果分析,当SOR的松弛因子W=1.1时,SOR迭代法的收敛速度是最快的。