数值计算方法实验二.docx
《数值计算方法实验二.docx》由会员分享,可在线阅读,更多相关《数值计算方法实验二.docx(11页珍藏版)》请在冰豆网上搜索。
![数值计算方法实验二.docx](https://file1.bdocx.com/fileroot1/2023-1/21/e1bbabe8-5878-457a-816a-58fcf03a9c2e/e1bbabe8-5878-457a-816a-58fcf03a9c2e1.gif)
数值计算方法实验二
本科实验报告
课程名称:
计算机数值方法B
实验项目:
线性方程组的直接解法
实验地点:
北区逸夫楼302
专业班级:
学号:
学生姓名:
指导教师:
2013年4月11日
一、实验目的和要求
(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。
(2)加深对线性方程组求解方法的认识,掌握算法。
(3)会进行误差分析,并能对不同方法进行比较。
二、实验内容和原理
合理利用Gauss消元法、LU分解法或追赶法求解下列方程组:
①
②
③
④
(n=5,10,100,…)
三、主要仪器设备
编译环境:
C-Free5.0硬件基础:
HP6460b
四、操作方法与实验步骤
高斯分解法:
将原方程组化为三角形方阵的方程组:
lik=aik/akk
aij=aij-lik*akjk=1,2,…,n-1
i=k+1,k+2,…,nj=k+1,k+2,…,n+1
由回代过程求得原方程组的解:
xn=ann+1/ann
xk=(akn+1-∑akjxj)/akk(k=n-1,n-2,…,2,1)
LU分解法:
将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.
追赶法:
用来求对角方程组;将系数矩阵A转化为A=L*U,L为普通下n-1对角矩阵,U为单位上n-1对角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.
五、实验数据记录和处理
Gauss消元法:
#include"stdio.h"
doublea[15][15],a0[15][15];
doubleb[15],b0[15],l[15];
intn;
voiddisplayA()
{
inti,j;
printf("\n");
for(j=1;j<=n;j++)
{
for(i=1;i<=n;i++)
printf("a[%d][%d]=%f",j,i,a[j][i]);
printf("b[%d]=%f\n",j,b[j]);
}
for(j=1;j<=n;j++)
printf("l[%d]=%f",j,l[j]);
printf("\n");
}
voidmain()
{
FILE*f;
inti,j,k;
f=fopen("Gaussdata.txt","r");
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
fscanf(f,"%lf",&a[i][j]);
a0[i][j]=a[i][j];
}
fscanf(f,"%lf",&b[i]);
b0[i]=b[i];
}
displayA();
k=1;
do
{
for(i=1;i<=n;i++)
{
if(i==k)continue;
l[i]=a0[i][k]/a0[k][k];
}
for(j=k+1;j<=n;j++)a[k][j]=a0[k][j]/a0[k][k];
b[k]=b0[k]/a0[k][k];
for(i=1;i<=n;i++)
{
if(i==k)continue;
for(j=k+1;j<=n;j++)
a[i][j]=a0[i][j]-l[i]*a0[k][j];
b[i]=b0[i]-l[i]*b0[k];
}
displayA();
for(i=1;i<=n;i++)
{
for(j=k+1;j<=n;j++)
a0[i][j]=a[i][j];
b0[i]=b[i];
}
if(k==n)break;
k++;
}while(0);
for(i=1;i<=n;i++)
printf("b[%2d]=%lf\n",i,b[i]);
}
LU分解法:
#include
#include
#include
#defineN4
intmain(){
floatA[N][N],U[N][N],L[N][N],X[N],Y[N],B[N];
floats=0;
inti,j,k;
printf("你好!
欢迎你使用本系统!
");
printf("\n\n请输入将要分解的矩阵:
");
for(i=0;ifor(j=0;jscanf("%f",&A[i][j]);
printf("\n以下输出待分解的矩阵,请确认无误。
");
for(i=0;i{//输出带分解矩阵
for(j=0;jprintf("%f\t",A[i][j]);
putchar('\n');
}
for(i=0;ifor(j=0;j{
L[i][j]=0;
U[i][j]=0;
if(i==j)
L[i][j]=1;
}
for(j=0;jU[0][j]=A[0][j];
for(i=1;iL[i][0]=A[i][0]/U[0][0];//求L矩阵的第一列
for(k=1;k{
for(j=k;j{
for(intu=0;u<=k-1;u++)
{
s=s+L[k][u]*U[u][j];
}
U[k][j]=A[k][j]-s;
s=0;//每行的和不一致,一行使用完后要置0
}
for(i=k+1;i{
for(intl=0;l<=k-1;l++)
{
s=s+L[i][l]*U[l][k];
}
L[i][k]=(A[i][k]-s)/U[k][k];
s=0;//每列的和不一致,一行使用完后要置0
}
}
printf("\nL\n");
for(i=0;i{//输出LU
for(j=0;jprintf("%f\t",L[i][j]);
putchar('\n');
}
printf("\nU\n");
for(i=0;i{
for(j=0;jprintf("%f\t",U[i][j]);
putchar('\n');
}
for(i=0;iscanf("%f",&B[i]);
Y[0]=B[0];//求Y
for(k=1;k{
for(j=0;j{s=s+L[k][j]*Y[j];}
Y[k]=B[k]-s;
s=0;
}
printf("\nY:
\n");//输出Y
for(i=0;iprintf("%f\t",Y[i]);
putchar('\n');
X[N-1]=Y[N-1]/U[N-1][N-1];//求X
for(k=N-2;k>=0;k--)
{
for(j=k+1;j{s=s+U[k][j]*X[j];}
X[k]=(Y[k]-s)/U[k][k];
s=0;
}
printf("\nX:
\n");//输出X
for(i=0;iprintf("%f\t",X[i]);
putchar('\n');
system("pause");
return0;
}
追赶法:
#include
#include
#include
intmain(void)
{
floata[15],b[15],c[15],d[15];
floatt;
inti,n;
system("cls");
printf("数值计算方法:
追赶法求解方程组");
printf("\n\n------------------------------------WELCOME-------------------------------------");
printf("\n");
printf("请输入n=");
scanf("%d",&n);
printf("\n======================\n");
printf("请输入b[1],c[1],d[1]:
\n");
scanf("%f%f%f",&b[1],&c[1],&d[1]);
printf("\n======================\n");
printf("从输入从2到n-1:
\n");
for(i=2;i<=n-1;i++)
{
scanf("%f%f%f%f",&a[i],&b[i],&c[i],&d[i]);
}
printf("\n======================\n");
printf("请输入a[n],b[n],d[n]:
\n");
scanf("%f%f%f",&a[n],&b[n],&d[n]);
c[1]=c[1]/b[1];
d[1]=d[1]/b[1];
for(i=2;i<=n-1;i++)
{
t=b[i]-c[i-1]*a[i];
c[i]=c[i]/t;
d[i]=(d[i]-d[i-1]*a[i])/t;
}
d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]);
For(i=n-1;i>=1;i--)d[i]=d[i]-c[i]*d[i+1];
printf("\n======================\n");
for(i=1;i<=n;i++)
{
putchar('\n');
printf("%f",d[i]);
}
system("pause");
return0;
}
六、实验结果与分析
Gauss消元法:
LU分解法:
追赶法:
七、讨论、心得
(1)Gauss消元法的程序在编译过程中忽略了while
(1)的错误,导致在运行的过程中出现了死循环,以后要注意。
程序运行时出现无内容情况:
是编译器问题,此程序无错误。
(2)LU分解法在编译成功后运行时弹出对话框无法关闭。
(3)不同的方法在求解方程组时时间有较大的差异,应结合具体问题选择不同的方法。