直接法解线性方程组.docx

上传人:b****4 文档编号:4221634 上传时间:2022-11-28 格式:DOCX 页数:23 大小:180.95KB
下载 相关 举报
直接法解线性方程组.docx_第1页
第1页 / 共23页
直接法解线性方程组.docx_第2页
第2页 / 共23页
直接法解线性方程组.docx_第3页
第3页 / 共23页
直接法解线性方程组.docx_第4页
第4页 / 共23页
直接法解线性方程组.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

直接法解线性方程组.docx

《直接法解线性方程组.docx》由会员分享,可在线阅读,更多相关《直接法解线性方程组.docx(23页珍藏版)》请在冰豆网上搜索。

直接法解线性方程组.docx

直接法解线性方程组

长沙理工大学

数学与计算科学学院

实验报告

实验项目名称直接法解线性方程组

所属课程名称数值方法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;

}

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

当前位置:首页 > 解决方案 > 学习计划

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

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