创新实验.docx
《创新实验.docx》由会员分享,可在线阅读,更多相关《创新实验.docx(13页珍藏版)》请在冰豆网上搜索。
创新实验
解线性方程组的迭代法
一、实验目的
主要运用向量范数、矩阵范数和矩阵谱半径的基本理论和解线性方程组的Jocobi迭代方法、Gauss-Seidel迭代方法以及松弛法(SOR法)。
掌握上述迭代法的构造和收敛性的判定。
二、实验内容
4-3-1实验一:
用雅可比法和高斯-赛得尔法解线性方程组
用雅可比法和高斯-赛得尔迭代法解下列线性方程组,且比较收敛速度,要求当
时迭代终止。
1)
4-4-4实验二:
用松弛法解线性方程组
上机用松弛法解
分别取
。
要求当
时迭代终止,并对每一
值确定迭代次数。
(初值
)。
三、使用环境
PC机,WINDOWS操作系统,C-Free软件,MathType软件。
四、调试过程
2-2-4实验一用雅可比法和高斯-赛得尔法解线性方程组
1)分析:
①雅可比(Jacobi)方法
雅可比方法可表示如下:
于是得到雅可比迭代的分量形式:
若用矩阵形式来表示,则其过程为:
②高斯-赛德尔(Gauss-Seidel)方法
高斯-赛德尔方法本质上可雅可比方法是一致的,在雅可比迭代中,求
时是用
的所有分量来参加计算的,而在计算
的第
个分量
时,
(
)等前面
个分量已经计算好。
设想方法收敛,第
次的分量比第
次的分量更接近于真实解,为了加速收敛,在计算
的第
个分量时,所用的
的前
个分量换成新算好的值,即用
,
,…,
,
,…,
来计算
,这就是Seidel迭代的思想。
高斯-赛德尔迭代的分量形式为:
其增量修正的形式为:
若用矩阵表示,则其矩阵形式为:
2)程序
用C程序编写如下:
①雅可比(Jacobi)方法
#include
#include
#include
#defineN3
floatfanshu(floata[N],floatb[N])
{
intk;
floaty=0;
for(k=0;ky=y+(a[k]-b[k])*(a[k]-b[k]);
return(sqrt(y));
}
main()
{
floata[N][N],b[N],x[N],x0[N];
inti,j,t;
floatc;
printf("pleaseinputA:
\n");
for(i=0;i{
printf("the%dthrow:
\n",i+1);
for(j=0;jscanf("%f,",&a[i][j]);
printf("\n");
}
printf("pleaseinputB:
\n");
for(i=0;iscanf("%f,",&b[i]);
printf("pleaseinputx0:
\n");
for(i=0;iscanf("%f,",&x0[i]);
printf("Ais:
\n");
for(i=0;i{
for(j=0;jprintf("%10.4f",a[i][j]);
printf("\n");
}
for(t=0;t<1000;t++)
{
for(i=0;i{
c=0;
for(j=0;j{
if(j==i)continue;
c=c+a[i][j]*x0[j];
}
x[i]=(b[i]-c)/a[i][i];
}
if(fanshu(x0,x)<=0.01)break;
for(i=0;ix0[i]=x[i];
}
if(t==1000)printf("error!
\n");
else
{
printf("t=%d\n",t);
printf("Xis:
\n");
for(i=0;iprintf("%4f\n",x[i]);
}
}
调试结果为:
输入:
10-10
-110-2
0-410
(即:
系数阵A的值)
976
(即:
常数向量B的值)
000
(即:
迭代初始向量X的值)
结果:
Ais:
10.0000-1.00000.0000
-1.000010.0000-2.0000
0.0000-4.000010.0000
t=4
Xis:
0.999190
0.997570
0.996760
②高斯-赛德尔(Gauss-Seidel)方法
#include
#include
#include
#defineN3
floatfanshu(floata[N],floatb[N])
{
intk;
floaty=0;
for(k=0;ky=y+(a[k]-b[k])*(a[k]-b[k]);
return(sqrt(y));
}
main()
{
floata[N][N],b[N],x[N],x0[N],x1[N];
inti,j,t;
floatc;
printf("pleaseinputA:
\n");
for(i=0;i{
printf("the%dthrow:
\n",i+1);
for(j=0;jscanf("%f,",&a[i][j]);
printf("\n");
}
printf("pleaseinputB:
\n");
for(i=0;iscanf("%f,",&b[i]);
printf("pleaseinputx0:
\n");
for(i=0;iscanf("%f,",&x0[i]);
printf("Ais:
\n");
for(i=0;i{
for(j=0;jprintf("%10.4f",a[i][j]);
printf("\n");
}
for(i=0;ix1[i]=x0[i];
for(t=0;t<1000;t++)
{
for(i=0;i{
c=0;
for(j=0;j{
if(j==i)continue;
c=c+a[i][j]*x1[j];
}
x[i]=(b[i]-c)/a[i][i];
x1[i]=x[i];
}
if(fanshu(x0,x)<=0.01)break;
for(i=0;ix0[i]=x[i];
}
if(t==1000)printf("error!
\n");
else
{
printf("t=%d\n",t);
printf("Xis:
\n");
for(i=0;iprintf("%4f\n",x[i]);
}
}
调试结果为:
输入:
pleaseinputA:
the1throw:
10-10
the2throw:
-110-2
the3throw:
0-410
pleaseinputB:
976
pleaseinputx0:
000
Ais:
10.0000-1.00000.0000
-1.000010.0000-2.0000
0.0000-4.000010.0000
t=3
Xis:
0.999830
0.999847
0.999939
Pressanykeytocontinue...
4-4-4实验二:
用松弛法解线性方程组
1)分析
对于高斯迭代法与高斯-赛得尔迭代法,有时候收敛速度很慢,于是有下面的改进:
简单迭代:
剩余向量:
得到
。
因此,作一次迭代相当于在第
次近似解的基础上,用剩余向量进行了修正。
可以设想,或许在修正项前面乘上一个因子,会使得迭代收敛得快一些:
其中迭代阵为
,寻找一个适当的
,使得
尽可能小一些,也就是增加收敛速度,这就是松弛法的基本思想。
于是松弛法的分量形式即为:
若写成矩阵形式,则为:
2)程序
用C程序编写如下:
调试结果为:
#include"stdio.h"
#include"string.h"
#include"math.h"
#defineN3
#defineW1.03
floatfanshu(floatX1[N],floatX2[N])
{
floatt,w=0;
inti,j;
for(i=0;iw=w+(X1[i]-X2[i])*(X1[i]-X2[i]);
t=sqrt(w);
return(t);
}
main()
{
floata[N][N],b[N],X1[N]={0},X2[N]={0},q,p;
inti,j,k=0;
printf("pleaseinput%dnumbers:
\n",N*N);
for(i=0;ifor(j=0;jscanf("%f",&a[i][j]);
printf("thecoefficientarrayoforiginalequationis:
\n");
for(i=0;i{
for(j=0;jprintf("%10.6f",a[i][j]);
printf("\n");
}
printf("pleaseinput%dnumbersagain:
\n",N);
for(i=0;iscanf("%f",&b[i]);
printf("theconstantarrayoforiginalequationis:
\n");
for(i=0;iprintf("%10.6f",b[i]);
printf("\n");
for(i=0;i{b[i]=b[i]/a[i][i];
for(j=0;jif(j!
=i)
a[i][j]=a[i][j]/a[i][i];
a[i][i]=0;}
do
{
for(i=0;i{
p=0;
for(j=0;jif(j!
=i)
p=p-a[i][j]*X1[j];
X1[i]=X1[i]+W*(b[i]+p-X1[i]);
}
q=fanshu(X2,X1);
k=k+1;
for(i=0;iX2[i]=X1[i];
}while(q>=5e-6);
printf("theansweroforiginalequationis:
\n");
for(i=0;iprintf("x%d=%10.6f\n",i+1,X1[i]);
printf("thetimesofoperationcycleis%d\n",k-1);
}
输入及结果:
pleaseinput9numbers:
4-10-14-10-14
thecoefficientarrayoforiginalequationis:
4.000000-1.0000000.000000
-1.0000004.000000-1.000000
0.000000-1.0000004.000000
pleaseinput3numbersagain:
14-3
theconstantarrayoforiginalequationis:
1.0000004.000000-3.000000
theansweroforiginalequationis:
x1=0.500000
x2=1.000000
x3=-0.500000
thetimesofoperationcycleis5
Pressanykeytocontinue...
五、总结
高斯迭代法、高斯-赛德尔迭代法的程序简单,透明度高。
通过比较知道,高斯-赛德尔迭代法的迭代次数要比高斯迭代法的次数少。
但是要注意,高斯法收敛与高斯-赛德尔法收敛并无必然联系,只是在两种方法都收敛的情况下,高斯-赛德尔迭代法要比高斯迭代法的收敛速度快。
对于松弛法的收敛及其收敛速度,则依赖于
的取值,一般称使
取最小值的
为最佳松弛因子,但是,对于大多数一般的矩阵并没有确定最佳松弛因子的方法,因此松弛法的收敛速度一般并不容易确定。
在程序中为了使其透明度高,采取了大量的矩阵作为存储空间,事实上可不必如此。
但是在输入实型的系数矩阵时,若用TurboC及TurboCForWindows软件编写,则出现scanf函数错误,不能输入数据,于是采用了另一个C程序的编写软件,即C-free软件。