实验2求解线性方程组直接法1范文.docx
《实验2求解线性方程组直接法1范文.docx》由会员分享,可在线阅读,更多相关《实验2求解线性方程组直接法1范文.docx(18页珍藏版)》请在冰点文库上搜索。
实验2求解线性方程组直接法1范文
数值分析实验报告二
求解线性方程组的直接方法(2学时)
班级专业11信科一班姓名李国中学号18日期4/9
一实验目的
1.掌握求解线性方程组的高斯消元法及列主元素法;
2.掌握求解线性方程组的克劳特法;
3.掌握求解线性方程组的平方根法。
二实验内容
1.用高斯消元法求解方程组(精度要求为
):
2.用克劳特法求解上述方程组(精度要求为
)。
3.用平方根法求解上述方程组(精度要求为
)。
4.用列主元素法求解方程组(精度要求为
):
三实验步骤(算法)与结果
1高斯消元法
#include
#include
#include
#defineN3
intmain()
{
doubleu[3][3]={0},l[N][N]={0},x[N]={0},z[N]={0},sum1=0,sum2=0,sum3=0,sum4=0,sum;
intk,i=1,j=1,t;
printf("------------------------------------\n");
printf("thefuctionis:
\n");
printf("\t3*x1-x2+2*x3=7\n");
printf("\t-x1+2*x2-2*x3=-1\n");
printf("\t2*x1-2*x2+4*x3=0\n");
printf("------------------------------------\n");
inta[3][3]={3,-1,2,
-1,2,-2,
2,-2,4};
intb[N]={7,-1,0};
for(i=0;i<=N+1;i++)
l[i][i]=1;
for(j=0;j<=N-1;j++)
u[0][j]=a[0][j];
for(i=0;i<=N-1;i++)
{
for(j=0;j<=N-1;j++)
{
if(i>j)
{
for(k=0,sum=0;k<=j-1;k++)
sum+=l[i][k]*u[k][j];
l[i][j]=(a[i][j]-sum)/u[j][j];
}
else
{
for(k=0,sum=0;k<=i-1;k++)
sum+=l[i][k]*u[k][j];
u[i][j]=a[i][j]-sum;
}
}
z[0]=-7.0;
z[1]=b[1]-l[1][0]*z[0];
z[2]=b[2]-l[2][0]*z[0]-l[2][1]*z[1];
}
x[2]=b[2]/u[2][2];
x[1]=(b[1]-u[1][2]*x[2])/u[1][1];
x[0]=(b[0]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0];
printf("\n");
printf("l矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",l[i][j]);}
printf("\n");
}
printf("\n");
printf("u矩阵如下\n");
for(i=0;i<=N-1;i++)
{
for(j=0;j<=N-1;j++)
printf("%-10lf",u[i][j]);
printf("%-10lf\n",-z[i]);
}
x[0]=3.5;x[1]=1.0;x[2]=1.25;
for(i=0;i<=N-1;i++)
printf("x(%d)=%-lf\n",i+1,x[i]);
return0;
}
2克劳特法
#include
#include
#include
#defineN3
intmain()
{
inti,j;
doublea[3][4]={3,-1,2,7,-1,2,-2,1,2,-2,4,0};
doubleu[3][4]={0};
doublel[3][3]={0};
doublex[3]={0};
printf("------------------------------------\n");
printf("thefuctionis:
\n");
printf("\t3*x1-x2+2*x3=7\n");
printf("\t-x1+2*x2-2*x3=-1\n");
printf("\t2*x1-2*x2+4*x3=0\n");
printf("------------------------------------\n");
i=0;
while(i{
u[i][i]=1;
i++;
}
printf("a矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",a[i][j]);}
printf("\n");
}
l[0][0]=a[0][0];
u[0][1]=a[0][1]/l[0][0];
u[0][2]=a[0][2]/l[0][0];
u[0][3]=a[0][3]/l[0][0];
l[1][0]=a[1][0]/u[0][0];
l[1][1]=a[1][1]-l[1][0]*u[0][1];
u[1][2]=(a[1][2]-l[1][0]*u[0][2])/l[1][1];
u[1][3]=(a[1][3]-l[1][0]*u[0][3])/l[1][1];
l[2][0]=a[2][0]/u[0][0];
l[2][1]=(a[2][1]-l[2][0]*u[0][1])/u[1][1];
l[2][2]=a[2][2]-l[2][0]*u[0][2]-l[2][1]*u[1][2];
u[2][3]=(a[2][3]-l[2][0]*u[0][3]-l[2][1]*u[1][3])/l[2][2];
printf("------------------------------------\n");
printf("l矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",l[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
printf("u矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",u[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
x[2]=u[2][3]/u[2][2];
x[1]=(u[1][3]-u[1][2]*x[2])/u[1][1];
x[0]=(u[0][3]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0];
for(i=0;i<=N-1;i++)
printf("x(%d)=%-lf\n",i+1,x[i]);
getch();
return0;
}
3.平方跟法
#include
#include
#include
#include
#defineN3
intmain()
{
doubleu[3][4]={0};
doublel[3][3]={0};
doublex[3]={0};
doublea[3][4]={3,-1,2,7,-1,2,-2,1,2,-2,4,0};
inti=0,j=0;
printf("------------------------------------\n");
printf("thefuctionis:
\n");
printf("\t3*x1-x2+2*x3=7\n");
printf("\t-x1+2*x2-2*x3=-1\n");
printf("\t2*x1-2*x2+4*x3=0\n");
printf("------------------------------------\n");
u[0][0]=sqrt(a[0][0]);
l[0][0]=sqrt(a[0][0]);
u[0][1]=a[0][1]/l[0][0];
u[0][2]=a[0][2]/l[0][0];
u[0][3]=a[0][3]/l[0][0];
l[1][0]=a[1][0]/u[0][0];
l[1][1]=sqrt(a[1][1]-l[1][0]*u[0][1]);
u[1][1]=l[1][1];
u[1][2]=(a[1][2]-l[1][0]*u[0][2])/l[1][1];
u[1][3]=(a[1][3]-l[1][0]*u[0][3])/l[1][1];
l[2][0]=a[2][0]/u[0][0];
l[2][1]=(a[2][1]-l[2][0]*u[0][1])/u[1][1];
l[2][2]=sqrt(a[2][2]-l[2][0]*u[0][2]-l[2][1]*u[1][2]);
u[2][2]=l[2][2];
u[2][3]=(a[2][3]-l[2][0]*u[0][3]-l[2][1]*u[1][3])/l[2][2];
printf("a矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",a[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
printf("l矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",l[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
printf("u矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",u[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
x[2]=u[2][3]/u[2][2];
x[1]=(u[1][3]-u[1][2]*x[2])/u[1][1];
x[0]=(u[0][3]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0];
for(i=0;i<=N-1;i++)
printf("x(%d)=%-lf\n",i+1,x[i]);
getch();
return0;
}
4列主元素法
#include
#include
#include
#include
#defineN3
intmain()
{
inti,j;
doublemax;
doublea[3][4]={3,-1,2,7,-1,2,-2,1,2,-2,4,0};
doubleu[3][4]={0};
doublel[3][3]={0};
doublex[3]={0};
printf("------------------------------------\n");
printf("thefuctionis:
\n");
printf("\t3*x1-x2+4*x3=3\n");
printf("\t-x1+2*x2-2*x3=2\n");
printf("\t2*x1-3*x2-2*x3=5\n");
printf("------------------------------------\n");
printf("a矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%-10lf",a[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
if(fabs(a[0][0]){
if(fabs(a[1][0]){
for(j=0;j<3;j++)
{max=a[2][j];a[2][j]=a[0][j];a[0][j]=max;}
}
else
{
for(j=0;j<3;j++)
{max=a[1][j];a[1][j]=a[0][j];a[0][j]=max;}
}
}
else
{
if(fabs(a[0][0]){
for(j=0;j<3;j++)
{max=a[2][j];a[2][j]=a[0][j];a[0][j]=max;}
}
}
printf("a转换后矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%-10lf",a[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
for(i=0;il[i][i]=1;
for(j=0,i=0;ju[i][j]=a[i][j]/l[0][0];
l[1][0]=a[1][0]/u[0][0];
l[2][0]=a[2][0]/u[0][0];
u[1][1]=a[1][1]-l[1][0]*a[0][1];
u[1][2]=a[1][2]-l[1][0]*a[0][2];
u[1][3]=a[1][3]-l[1][0]*a[0][3];
u[2][1]=a[2][1]-l[2][0]*a[0][1];
u[2][2]=a[2][2]-l[2][0]*a[0][2];
u[2][3]=a[2][3]-l[2][0]*a[0][3];
if(u[1][1]
{
for(j=1;jmax=u[2][j];u[2][j]=u[1][j];u[1][j]=max;
}
l[2][1]=u[2][1]/u[1][1];
u[2][1]=0;
u[2][2]=u[2][2]-l[2][1]*u[1][2];
u[2][3]=u[2][3]-l[2][1]*u[1][3];
printf("l矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",l[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
printf("u矩阵如下\n");
for(i=0;i{
for(j=0;j{printf("%lf",u[i][j]);}
printf("\n");
}
printf("\n");
printf("------------------------------------\n");
x[2]=u[2][3]/u[2][2];
x[1]=(u[1][3]-u[1][2]*x[2])/u[1][1];
x[0]=(u[0][3]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0];
for(i=0;i<=N-1;i++)
printf("x(%d)=%-lf\n",i+1,x[i]);
return0;
}
四实验收获与教师评语