创新实验.docx

上传人:b****5 文档编号:6639221 上传时间:2023-01-08 格式:DOCX 页数:13 大小:118.88KB
下载 相关 举报
创新实验.docx_第1页
第1页 / 共13页
创新实验.docx_第2页
第2页 / 共13页
创新实验.docx_第3页
第3页 / 共13页
创新实验.docx_第4页
第4页 / 共13页
创新实验.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

创新实验.docx

《创新实验.docx》由会员分享,可在线阅读,更多相关《创新实验.docx(13页珍藏版)》请在冰豆网上搜索。

创新实验.docx

创新实验

解线性方程组的迭代法

一、实验目的

主要运用向量范数、矩阵范数和矩阵谱半径的基本理论和解线性方程组的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;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

{

printf("the%dthrow:

\n",i+1);

for(j=0;j

scanf("%f,",&a[i][j]);

printf("\n");

}

printf("pleaseinputB:

\n");

for(i=0;i

scanf("%f,",&b[i]);

printf("pleaseinputx0:

\n");

for(i=0;i

scanf("%f,",&x0[i]);

printf("Ais:

\n");

for(i=0;i

{

for(j=0;j

printf("%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;i

x0[i]=x[i];

}

if(t==1000)printf("error!

\n");

else

{

printf("t=%d\n",t);

printf("Xis:

\n");

for(i=0;i

printf("%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;k

y=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;j

scanf("%f,",&a[i][j]);

printf("\n");

}

printf("pleaseinputB:

\n");

for(i=0;i

scanf("%f,",&b[i]);

printf("pleaseinputx0:

\n");

for(i=0;i

scanf("%f,",&x0[i]);

printf("Ais:

\n");

for(i=0;i

{

for(j=0;j

printf("%10.4f",a[i][j]);

printf("\n");

}

for(i=0;i

x1[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;i

x0[i]=x[i];

}

if(t==1000)printf("error!

\n");

else

{

printf("t=%d\n",t);

printf("Xis:

\n");

for(i=0;i

printf("%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;i

w=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;i

for(j=0;j

scanf("%f",&a[i][j]);

printf("thecoefficientarrayoforiginalequationis:

\n");

for(i=0;i

{

for(j=0;j

printf("%10.6f",a[i][j]);

printf("\n");

}

printf("pleaseinput%dnumbersagain:

\n",N);

for(i=0;i

scanf("%f",&b[i]);

printf("theconstantarrayoforiginalequationis:

\n");

for(i=0;i

printf("%10.6f",b[i]);

printf("\n");

for(i=0;i

{b[i]=b[i]/a[i][i];

for(j=0;j

if(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;j

if(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;i

X2[i]=X1[i];

}while(q>=5e-6);

printf("theansweroforiginalequationis:

\n");

for(i=0;i

printf("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软件。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1