您好,欢迎访问三七文档
1实验报告学院(系)名称:姓名学号专业班级实验项目线性方程组的解法课程名称数值计算方法课程代码实验时间实验地点批改意见:成绩教师签字:实验目的:编写列选主元高斯消去法、雅可比和高斯-塞德尔迭代法的算法程序,上机调试通过。实验环境:硬件环境:IBM-PC或兼容机软件环境:Windows操作系统编程语言:C语言实验内容:一.用列主元高斯消去法求解下列线性方程组二.用高斯-塞德尔迭代方法求解线性方程组要求误差为实验步骤:一.列主元高斯消去法高斯消去法分为消元过程与回代过程,消元过程将所给方程组加工成上三角形方程组,再经回代过程求解列选主元法1.列选主元是当消元到第k步时,从k列的akk以下(包括akk)的各元素中选出绝对值最大的,然后通过行交换将其交换到akk的位置上。交换系数矩阵中的两行(包括常数项),只相当于两个方程的位置交换了,因此列选主元不影响求解的结果2.列选主元比全选主元的运算量小,但一般可以满足精度要求,所以列选主元更常被采用3.在列主元消去法中,未知数仍然是顺序地消去的,但是把各方程中要消去的那个未知数的系数按绝对值最大值作为主元素,然后用顺序消去法的公式求解列主元高斯消去法的流程图:主程序部分列选主元部分52262342321321321xxxxxxxxx7910431017210424321321321xxxxxxxxx510212二.高斯-塞德尔迭代法高斯-塞德尔迭代法的思想1.迭代收敛时,新值xi(k+1)比老值xi(k)更准确2.算出新值xi(k+1)后,用新值xi(k+1)代替用于后面计算的老值xi(k),使每次迭代计算,都是利用“最新求解信息”3.这样,必然会使迭代求解的速度加快高斯-塞德尔(Seidel)迭代公式),,2,1(,)(11)(11)1()1(nixaxabaxnijkjijijkjijiiiki高斯-塞德尔迭代的流程图实验结果:一.列主元消去法输入各个数据,最终使用列选主元法,得到结果为:x1=x2=x3=1二.高斯-赛德尔迭代法输入各个数据,输出每一步迭代数据,最终结果为:x1=0.285716,x2=2.142855,x3=-3.285712附录(源程序及运行结果)一.列主元高斯消去法#includestdio.h#includemath.hvoidprint(doublea[3][3],intn,doubleb[3]){printf(输出矩阵:\n);for(inti=0;in;i++){for(intj=0;jn;j++)printf(%lf,a[i][j]);printf(%lf,b[i]);printf(\n);}}voidliezhuyuan(doublea[3][3],doubleb[3],intk,intn){doubled,t;intl=k,i=k+1;d=a[k][k];while(i!=n){if(fabs(a[i][k])fabs(d)){d=a[i][k];l=i;}i++;}printf(选出主元:%lf\n,d);if(d==0)printf(矩阵奇异!\n);elseif(l!=k){for(intj=k;jn;j++){t=a[l][j];a[l][j]=a[k][j];a[k][j]=t;}t=b[l];b[l]=b[k];b[k]=t;}}voidmain(){doublea[3][3]={2,1,1,1,3,2,1,2,2},b[3]={4,6,5};intk=0,i,j,n=3;3print(a,n,b);while(k!=n-1){liezhuyuan(a,b,k,n);for(i=k+1;in;i++)a[i][k]=a[i][k]/a[k][k];for(i=k+1;in;i++){for(j=k+1;jn;j++)a[i][j]=a[i][j]-a[i][k]*a[k][j];b[i]=b[i]-a[i][k]*b[k];}k++;}b[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i=0;i--){for(j=i+1;jn;j++)b[i]=b[i]-a[i][j]*b[j];b[i]=b[i]/a[i][i];}printf(输出结果:);for(i=0;in;i++)printf(x%d=%lf,i+1,b[i]);printf(\n);}运行结果:二.高斯-塞德尔迭代法#includestdio.h#includemath.hvoidmain(){doublea[3][3]={4,-2,-4,-2,17,10,4,10,9},b[3]={10,3,-7},x[3]={0,0,0},t,s,e,e0=0.000005;intn=3,i;do{e=0;i=0;do{t=x[i];s=0;for(intj=0;jn;j++)if(j!=i)s=s+a[i][j]*x[j];x[i]=(b[i]-s)/a[i][i];if(fabs(x[i]-te))e=fabs(x[i]-t);i++;}while(i!=n);for(i=0;in;i++)printf(%lf,x[i]);printf(\n);}while(ee0);}运行结果:
本文标题:数值计算方法实验5
链接地址:https://www.777doc.com/doc-5584743 .html