创新实验文档格式.docx

上传人:b****5 文档编号:19653089 上传时间: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

四、调试过程

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软件。

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

当前位置:首页 > 成人教育 > 成考

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

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