📄 fullmainelemdele.cpp
字号:
/*-完全主元素消去法-*/
#include<stdio.h>
#include<math.h>
#define N 10 /*-未知数最大数目-*/
double max(double a[][N+1],int k,int n,int *ik,int *jk)
{
/*-用*ik和*jk返回最大值所在的行号和列号-*/
int i,j;
double maxValue;
for(i=k;i<=n;i++)
for(j=k;j<=n;j++)
if(i==k&&j==k)
{
maxValue=a[i][j];
*ik=i;*jk=j;
}
else if(fabs(a[i][j])>fabs(maxValue))
{
maxValue=a[i][j];
*ik=i;*jk=j;
}
return maxValue;
}/*-max-*/
int xmap(int origin[],int n,int row)
{
/*-返回与xrow的映射-*/
int i;
for(i=1;i<=n;i++)
if(origin[i]==row) return i;
}/*-xmap-*/
void main()
{
int i,j,k,ik,n,jk,tcol;
int origin[N+1];/*-原始未知数的顺序-*/
double a[N+1][N+1],b[N+1],x[N+1],m,sum,temp;
printf("Input n which is lower 10:");
scanf("%d",&n);
/*-对系数矩阵赋值-*/
printf("Input Matrix of A:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&a[i][j]);
/*-矩阵b进行赋值-*/
printf("Input Matrix of b:\n");
for(i=1;i<=n;i++)
scanf("%lf",&b[i]);
/*-对原始顺序进行记录-*/
for(i=1;i<=n;i++)
origin[i]=i;
for(k=1;k<=n-1;k++)
{
max(a,k,n,&ik,&jk);
if(ik!=k) /*-交换行ik<-->k-*/
{
for(j=1;j<=n;j++)
{
temp=a[ik][j];
a[ik][j]=a[k][j];
a[k][j]=temp;
}
/*-交换b[ik]<-->b[k]-*/
temp=b[ik];b[ik]=b[k];b[k]=temp;
}
if(jk!=k) /*-交换列jk<--->k-*/
{
for(i=1;i<=n;i++)
{
temp=a[i][jk];
a[i][jk]=a[i][k];
a[i][k]=temp;
}
tcol=origin[jk]; /*-记录未知数的新位置-*/
origin[jk]=origin[k];
origin[k]=tcol;
}
for(i=k+1;i<=n;i++) /*-消元计算-*/
{
m=a[i][k]/a[k][k];
for(j=k+1;j<=n;j++)
a[i][j]-=m*a[k][j];
b[i]-=m*b[k];
}
}
/*-进行回代-*/
x[n]=b[n]/a[n][n];
for(i=n-1;i>=1;i--)
{
sum=0;
for(j=i+1;j<=n;j++)
sum+=a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
}
/*-打印输出x1,x2,x3......xn-*/
for(i=1;i<=n;i++)
{
j=xmap(origin,n,i);/*-求映射xi<-->xj-*/
printf("x%d=%.8lf\n",i,x[j]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -