直接法解线性方程组.docx
《直接法解线性方程组.docx》由会员分享,可在线阅读,更多相关《直接法解线性方程组.docx(23页珍藏版)》请在冰豆网上搜索。
![直接法解线性方程组.docx](https://file1.bdocx.com/fileroot1/2023-5/20/f2f735d6-6795-4899-aee4-080e725a765b/f2f735d6-6795-4899-aee4-080e725a765b1.gif)
直接法解线性方程组
长沙理工大学
数学与计算科学学院
实验报告
实验项目名称直接法解线性方程组
所属课程名称数值方法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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;iprintf("%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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;iprintf("%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;ic[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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;iprintf("%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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;jprintf("%f",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;iprintf("%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;iprintf("%f",x[i]);
return0;
}