创新实验.docx
- 文档编号:6639221
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:13
- 大小:118.88KB
创新实验.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;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软件。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 创新 实验