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