直接法解线性方程组.docx
- 文档编号:9714745
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:23
- 大小:238.42KB
直接法解线性方程组.docx
《直接法解线性方程组.docx》由会员分享,可在线阅读,更多相关《直接法解线性方程组.docx(23页珍藏版)》请在冰点文库上搜索。
直接法解线性方程组
长沙理工大学
数学与计算科学学院
实验报告
实验项目名称直接法解线性方程组
所属课程名称数值方法A
实验类型验证型
实验日期2014.11.28
班级信计12-
学号201253100
姓名
成绩
一、实验概述:
【实验目的】
1.掌握用C语言编程实现追赶法求解三对角线性方程组;
2.掌握运用高斯列主元消去法解线性方程组;
3.加深对解线性方程组的直接法——高斯列主消元法和LU分解法的构造过程的理解;
4.熟悉并掌握各种方法的适用对象及优缺点,学会针对不同问题选择不同方法;
5.培养使用电子计算机进行科学计算和解决问题的能力。
【实验原理】
1.追赶法原理
2.高斯列主元消去法
【实验环境】
1.硬件环境
2.软件环境
(1)
(2)VC++6.0
二、实验内容:
【实验过程】(实验步骤)
1.实验步骤
1)深入了解解题过程并依次写出解题算法;
2)依照算法用C语言编写解题程序;
3)上机时将写好的程序输入到VC++中并调试运行得出方程的解;
4)比较几种方法之间的联系与区别。
2.1追赶法
根据以上的实验原理,在VC++编辑框中输入源程序:
由原理可知:
b[1]=2,c[1]=-1,f[1]=1
a[2]=-1,b[2]=2,c[2]=-1,f[2]=0
a[3]=-1,b[3]=2,c[3]=-1,f[3]=0
a[4]=-1,b[4]=2,c[4]=-1,f[4]=0
a[5]=-1,b[5]=2,f[5]=0
将上述系数逐个输入运行框,并经过多次调试运行,最终运行出结果如下:
2.1Gauss消元法
1)数据输入
main(void)
{
floatA[4][4]={{0.4096,0.1234,0.3678,0.2943},
{0.2246,0.3872,0.4015,0.1129},
{0.3645,0.1920,0.3781,0.0643},
{0.1784,0.4002,0.2786,0.3927}};
floatb[4]={0.4043,0.1550,0.4240,-0.2557};
floatx[4]={0};
floatAik,S;
inti,j,k;
intsize=4;
printf("A[][]\n");
for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); 2)消去过程 //消去过程 for(k=0;k { if(! A[k][k]) return-1; for(i=k+1;i { Aik=A[i][k]/A[k][k]; for(j=k;j { A[i][j]=A[i][j]-Aik*A[k][j]; } b[i]=b[i]-Aik*b[k]; } } //消去的结果 printf("A[]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); 3)回代过程 //回代过程 x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2;k>=0;k--) { S=b[k]; for(j=k+1;j { S=S-A[k][j]*x[j]; } x[k]=S/A[k][k]; } 4)结果输出 //solution printf("Thesolutionx[]=\n"); for(i=0;i printf("%f",x[i]); return0; 得如下结果: 即 2.2列主元消去法 1)数据输入 intmain(void) { floatA[4][4]={{0.4096,0.1234,0.3678,0.2943}, {0.2246,0.3872,0.4015,0.1129}, {0.3645,0.1920,0.3781,0.0643}, {0.1784,0.4002,0.2786,0.3927}}; floatb[4]={0.4043,0.1550,0.4240,-0.2557}; floatx[4]={0}; floatAik,S,temp; inti,j,k; floatmax;//列主元的绝对值 intcol;//列主元所在的行 intsize=4; printf("A[][]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); 2)消去过程 //-------消去过程--------- for(k=0;k { max=fabs(A[k][k]); col=k; //查找最大元素所在的行 for(i=k;i { if(max { max=fabs(A[i][k]); col=i; } } printf("col: %d\n",col); for(j=k;j { temp=A[col][j]; A[col][j]=A[k][j]; A[k][j]=temp; } temp=b[col];b[col]=b[k];b[k]=temp; if(! A[k][k]) return-1; for(i=k+1;i { Aik=A[i][k]/A[k][k]; for(j=k;j { A[i][j]=A[i][j]-Aik*A[k][j]; } b[i]=b[i]-Aik*b[k]; } } //消去的结果 printf("A[]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); 3)回代过程 //回代过程 x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2;k>=0;k--) { S=b[k]; for(j=k+1;j { S=S-A[k][j]*x[j]; } x[k]=S/A[k][k]; } 4)结果输出 //solution printf("Thesolutionx[]=\n"); for(i=0;i printf("%f",x[i]); return0; } 将上述各部分程序组合到一起并调试运行得出结果如下: 即 。 【实验结论】(结果) 1.追赶法结果 2.高斯消去法和列主元消去法 1)高斯消去法结果截图: 2)列主元消去法结果截图: 【实验小结】(收获体会) 通过运用追赶法来求解三对角方程组的问题.追赶法是用来求解三对角方程组的专用方法,对于三对角方程组,追赶法比Gauss消去法的计算量要小的多。 本次实验让我了解到了C语言功能的强大,也让我意识到了算法对于程序编写的重要程度,只有学好逻辑,学好算法,才能使用编程使计算精度进一步提高。 三、指导教师评语及成绩: 评语 评语等级 优 良 中 及格 不及格 1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强 2.实验方案设计合理 3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻) 4实验结论正确. 成绩: 指导教师签名: 批阅日期: 附录: 源程序 程序1: #include #include #include #defineMAX_n100 #definePRECISIONO.000001 voidSulutionOutput(floatx[],intn) { inti; for(i=1;i<=n;++i) printf("\nx[%d]=%f",i,x[i]); } voidTriDiagonalMatrixInput(floata[],floatb[],floatc[],floatf[],intn) { inti; printf("请输入b[1],c[1],f[1]: "); scanf("%f%f%f",&b[1],&c[1],&f[1]); for(i=2;i { printf("请输入a[%d],b[%d],c[%d],f[%d]: ",i,i,i,i); scanf("%f%f%f%f",&a[i],&b[i],&c[i],&f[i]); } printf("请输入a[%d],b[%d],f[%d]: ",n,n,n); scanf("%f%f%f",&a[n],&b[n],&f[n]); } voidZ_G_method(floata[],floatb[],floatc[],floatf[],intn) { inti; c[1]/=b[1]; for(i=2;i c[i]/=(b[i]-a[i]*c[i-1]); f[1]/=b[1]; for(i=2;i<=n;++i) f[i]=(f[i]-a[i]*f[i-1]/b[i]-a[i]*c[i-1]); for(i=n-1;i>0;--i) f[i]-=c[i]*f[i+1]; } voidmain() { intn; floata[MAX_n],b[MAX_n],c[MAX_n]; floatf[MAX_n]; printf("\n请输入n="); scanf("%d",&n); TriDiagonalMatrixInput(a,b,c,f,n); Z_G_method(a,b,c,f,n); SulutionOutput(f,n); } 程序2: 1)高斯消去法程序: #include main(void) { floatA[4][4]={{0.4096,0.1234,0.3678,0.2943}, {0.2246,0.3872,0.4015,0.1129}, {0.3645,0.1920,0.3781,0.0643}, {0.1784,0.4002,0.2786,0.3927}}; floatb[4]={0.4043,0.1550,0.4240,-0.2557}; floatx[4]={0}; floatAik,S; inti,j,k; intsize=4; printf("A[][]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); //消去过程 for(k=0;k { if(! A[k][k]) return-1; for(i=k+1;i { Aik=A[i][k]/A[k][k]; for(j=k;j { A[i][j]=A[i][j]-Aik*A[k][j]; } b[i]=b[i]-Aik*b[k]; } } //消去的结果 printf("A[]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); //回代过程 x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2;k>=0;k--) { S=b[k]; for(j=k+1;j { S=S-A[k][j]*x[j]; } x[k]=S/A[k][k]; } //solution printf("Thesolutionx[]=\n"); for(i=0;i printf("%f",x[i]); return0; } 2)列主元消去法程序: #include #include intmain(void) { floatA[4][4]={{0.4096,0.1234,0.3678,0.2943}, {0.2246,0.3872,0.4015,0.1129}, {0.3645,0.1920,0.3781,0.0643}, {0.1784,0.4002,0.2786,0.3927}}; floatb[4]={0.4043,0.1550,0.4240,-0.2557}; floatx[4]={0}; floatAik,S,temp; inti,j,k; floatmax;//列主元的绝对值 intcol;//列主元所在的行 intsize=4; printf("A[][]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); //-------消去过程--------- for(k=0;k { max=fabs(A[k][k]); col=k; //查找最大元素所在的行 for(i=k;i { if(max { max=fabs(A[i][k]); col=i; } } printf("col: %d\n",col); for(j=k;j { temp=A[col][j]; A[col][j]=A[k][j]; A[k][j]=temp; } temp=b[col];b[col]=b[k];b[k]=temp; if(! A[k][k]) return-1; for(i=k+1;i { Aik=A[i][k]/A[k][k]; for(j=k;j { A[i][j]=A[i][j]-Aik*A[k][j]; } b[i]=b[i]-Aik*b[k]; } } //消去的结果 printf("A[]\n"); for(i=0;i { for(j=0;j printf("%f",A[i][j]); printf("\n"); } printf("b[]\n"); for(i=0;i printf("%f",b[i]); printf("\n\n"); //回代过程 x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2;k>=0;k--) { S=b[k]; for(j=k+1;j { S=S-A[k][j]*x[j]; } x[k]=S/A[k][k]; } //solution printf("Thesolutionx[]=\n"); for(i=0;i printf("%f",x[i]); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 直接 线性方程组