《数值分析》实验报告.docx
《《数值分析》实验报告.docx》由会员分享,可在线阅读,更多相关《《数值分析》实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
![《数值分析》实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/14/bb9efc1f-1f94-47c3-bb37-4e5e5b67ce27/bb9efc1f-1f94-47c3-bb37-4e5e5b67ce271.gif)
《数值分析》实验报告
《数值分析》实验报告
实验序号:
实验一二题目名称:
全主元消元法
学号:
20101104200姓名:
葛广帅
任课教师:
马季骕专业班级:
10计科(非师范)
1.实验目的:
利用全主元消元法求解线性方程组。
2.实验内容:
全主元消元法就是首先将系数矩阵转化为上三角型,然后利用回代法求解每个未知数。
转化过程中选取绝对值最大的作为全主元。
3.实验代码:
#include
#include
#include
#include
#defineMAXL100
usingnamespacestd;
doubleA[MAXL+10][MAXL+10];//定义矩阵用于存放增广矩阵
intseat[MAXL+10];//存放解得顺序
structpoint
{
intr,c;
};
voidInput(intn);//输入n阶方程组的信息,并展示增广矩阵
pointBoss(intn,intij);//在A[ij][ij]到A[n][n]的正方形中寻找全主元,并返回全主元的位置
voidSwap(intij,pointtemp,intn);//将全主元移到当前左上角
voidOutput(intn);//输出增广矩阵
voidAnswer(intn);//利用回代法求解,并将结果储存在A[i][n+1]中
voidOutputAnswer(intn);//按顺序输出结果
intmain()
{
freopen("test.txt","r",stdin);
freopen("MyAnswer.txt","w",stdout);
intn,i,j,k,num;
doublekk;
pointbosspoint;
cout<<"*****************************"<cout<<"*实验(一二)全主元消元法*"<cout<<"*****************************"<cout<cout<<"请输入方程组的阶(按0结束):
"<while(cin>>n&&n)
{
Input(n);//输入n阶方程组的信息,并展示增广矩阵
for(i=1;i<=n;i++)//初始化位置数组
{
seat[i]=i;
}
cout<<"下面利用全主元消元法将系数矩阵化为上三角型"<for(k=1;k<=n-1;k++)
{
cout<<"第"<";
bosspoint=Boss(n,k);//在A[k][k]到A[n][n]的正方形中寻找全主元,并返回全主元的位置
cout<<"选取的全主元是:
"<<"A["<Swap(k,bosspoint,n);//将全主元移到当前左上角
cout<<"增广矩阵更新后如下:
"<Output(n);//输出增广矩阵
num=0;
for(i=k+1;i<=n;i++)
{
num++;
kk=A[i][k]/A[k][k];
cout<<"第["<(倍数为"<A[i][k]=0;
for(j=k+1;j<=n+1;j++)
{
A[i][j]=A[i][j]-A[k][j]*kk;
}
Output(n);//输出增广矩阵
}
}
cout<<"由上面的增广矩阵可知,系数矩阵已经化为上三角型,下面的工作是利用回代法求解"<Answer(n);//利用回代法求解,并将结果储存在A[i][n+1]中
OutputAnswer(n);//按顺序输出结果
cout<<"请输入方程组的阶(按0结束):
";
}
}
voidInput(intn)
{
inti,j;
cout<cout<<"请输入方程组的系数矩阵:
"<for(i=1;i<=n;i++)//输入系数矩阵
{
for(j=1;j<=n;j++)
{
cin>>A[i][j];
}
}
cout<cout<<"请输入方程组的常数项:
"<for(i=1;i<=n;i++)
{
cin>>A[i][n+1];
}
cout<cout<<"方程组的增广矩阵如下:
"<cout<cout<for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
cout<}
cout<}
cout<cout<return;
}
pointBoss(intn,intij)
{
intmaxi,maxj,i,j;
doublemaxone;
maxone=0;
for(i=ij;i<=n;i++)
{
for(j=ij;j<=n;j++)
{
if(fabs(A[i][j])>maxone)
{
maxone=fabs(A[i][j]);
maxi=i;maxj=j;
}
}
}
if(maxone)
{
pointtemp;
temp.r=maxi;
temp.c=maxj;
returntemp;
}
else
{
cout<<"异常退出!
!
!
"<exit
(1);
}
}
voidSwap(intij,pointtemp,intn)
{
doubletmp;
inti,j,tempseat;
if(temp.r!
=ij)
{
for(j=1;j<=n+1;j++)
{
tmp=A[ij][j];
A[ij][j]=A[temp.r][j];
A[temp.r][j]=tmp;
}
}
if(temp.c!
=ij)
{
for(i=1;i<=n;i++)
{
tmp=A[i][ij];
A[i][ij]=A[i][temp.c];
A[i][temp.c]=tmp;
}
tempseat=seat[ij];
seat[ij]=seat[temp.c];
seat[temp.c]=tempseat;
}
return;
}
voidOutput(intn)
{
inti,j;
cout<cout<for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
cout<}
cout<}
cout<cout<return;
}
voidAnswer(intn)
{
inti,j;
if(A[n][n]==0)
{
cout<<"异常退出!
!
!
"<exit
(1);
}
A[n][n+1]=A[n][n+1]/A[n][n];
for(i=n-1;i>=1;i--)
{
for(j=n;j>i;j--)
{
A[i][n+1]=A[i][n+1]-A[i][j]*A[j][n+1];
}
A[i][n+1]=A[i][n+1]/A[i][i];
}
return;
}
voidOutputAnswer(intn)
{
inti,j;
cout<<"-------------------------------"<cout<<"-------------------------------"<for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(seat[j]==i)
{
cout<<"X"<
break;
}
}
}
cout<<"-------------------------------"<cout<<"-------------------------------"<cout<return;
}
4.结果分析:
全主元消元法,是在每次选取主元素时选取当前绝对值最大的。
根据一般性经验,在做除法运算时,分母的绝对值越大,舍入误差影响就越小。
全主元的做法可以得到较好的解。