实验题目:数值分析之高斯-赛德尔迭代
学生姓名: 专 业: 学 号: 完成日期:
实验题目: 数值分析之高斯-赛德尔迭代 学生姓名: 学号: 完成日期: 2011.10.21 1 实验目的
7x1x22x310 利用高斯-赛德尔迭代法求解线性方程组 x18x22x38
2x2x9x62312 实验步骤
2.1 算法原理
高斯-赛德尔迭代是计算
xj(k1)x(k1的第i个分量xi(k1),利用了已经计算出得最新分量
(j1,2,...,i1).高斯-赛德尔迭代法可以看作雅克比迭代法的一种改进.高斯-赛
德尔迭代法没迭代一次只需计算一次矩阵与向量的乘法
2.2 算法步骤
选取分裂矩阵M为A的下三角部分,即选取MDL(下三角矩阵),AMN,
于是得到解Axb的高斯-赛德尔(Gauss-Seidel)迭代法
(0)x,初始向量(2.4) (k1)(k)Bxf,k0,1,...,x1111其中BI(DL)A(DL)UG,f(DL)b.称G(DL)U为解
Axb的高斯-赛德尔迭代法的迭代矩阵.
下面给出高斯-赛德尔迭代法的分量计算公式.记
x(k)(x1,...,xi(k)(k),...,xn)
(k)T由(2.4)式有
(DL)x或
Dx(k1)(k1)Ux(k)b,
Lx(k1)Ux(k)b,
即
i1nij aiix(k1)ibiaj1x(k1)jaji1ijxj,i1,2,,...,n.
(k)于是解Axb的高斯-赛德尔迭代法计算公式为
(0)Tx(0)(x1(0),,xn)i1(k1)(k1)(biaiixjxij1i1,2,,nk0,1,.naji1ij(k)xj)/aii
2.3 程序流程图
开始 输入数据 yixixii1,2,...,nk1 (0) yi(biajiijyj)/aii i1,2,...,n.maxyixi?1in输出y1,y2,...,yn kk1xiyii1,2,...,n输出错误 kN? 结束
3 实验结果分析
4 实验结论
高斯-赛德尔迭代法是计算
xj(k1)x(k1的第i个分量xi(k1),利用了已经计算出得最新分量
(j1,2,...,i1),高斯-赛德尔迭代法可以看作雅克比迭代法的一种改进.
5 实验心得体会
此次实验,我体会到了计算机与数学的紧密联系--利用计算机解决复杂的数学问题。
参考文献
白峰杉.数值分析引论.北京:高等教育出版社,2004.
李庆扬,王能超,易大义.数值分析.武汉:华中理工大学出版社,1986.
附录(源代码)
#include \"stdio.h\" #include \"math.h\" # define m 3 float a[m][m];
float c[m]; void gaosi(); void main() {
int i,j;
float x[m],x1[m],eps[m]; float s=0; float t=0; int p=1; int q=1; int k=0; float eps1; gaosi();
for(i=0;i<=m-1;i++)
{
for(j=0;j<=m-1;j++) {
s=float(s+fabs(a[i][j])); t=float(t+fabs(a[j][i])); }
q=q&&(s<2*fabs(a[i][i])); p=p&&(t<2*fabs(a[i][i])); s=0; t=0; }
if((p+q)==0)
printf(\"ERROR!\"); else
{
for(i=0;i<=m-1;i++)
{
x[i]=0;
x1[i]=0;
}
do
{
eps1=x[0]-x1[0]; for(i=0;i<=m-1;i++)
{
for(j=0;j<=m-1;j++) s=s+a[i][j]*x[j]; x[i]=(c[i]+a[i][i]*x[i]-s)/a[i][i]; s=0;
eps[i]=float(fabs(x[i]-x1[i])); x1[i]=x[i];
eps1=(eps1>eps[i])?eps1:eps[i];
printf(\"x%d=%f\
printf(\"\\n\");
}
k=k+1;
}
while(eps1>1e-3);
printf(\"迭代 %d 次\ }
void gaosi() {
int i,j; float b[m*m];
printf(\"请输入一个矩阵a:\\n\"); for(i=0;i<=m-1;i++)
}
{
for(j=0;j<=m-1;j++)
{
scanf(\"%f\ a[i][j]=b[j+i*m];
}
}
printf(\"请输入矩阵b\\n\"); for(i=0;i<=m-1;i++) }
scanf(\"%f\
因篇幅问题不能全部显示,请点此查看更多更全内容