因为写数值分析作业,做了用c语言写列主元高斯消去法的题目。现在和大家分享一下。
#include<stdio.h>
#include<math.h>
#define MAX 10
double A[MAX][MAX];//系数矩阵
double b[MAX];//右端项
double X[MAX];//求得的方程组结果
int n;
int x;
void setMatrix()
{
int i,j;
for(i=0; i<n; i++)
{
printf("请输入系数矩阵A第%d行元素,并以空格作为间隔:\n",i+1);
for(j=0; j<n; j++)
{
scanf("%lf",&A[i][j]);
}
}
printf("请输入右端项b的元素,并以空格作为间隔:\n");
for(i=0; i<n; i++)
{
scanf("%lf",&b[i]);
}
printf("输入的系数矩阵A[][]为:\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("\t%f\t",A[i][j]);
}
printf("\n\n");
}
printf("\n输入的右端项b[]为:\n");
for(i=0; i<n; i++)
{
printf("\t%f\n\n",b[i]);
}
}
int main()
{
int i,j,k;
double max;
double temp;
double temp1;
double Aik;
double S;
printf("请输入方程组的阶数:");
scanf("%d",&n);
setMatrix();//初始化,输入系数矩阵
for(k=0; k<n-1; k++)//对整个系数矩阵进行列主元消元
{
max = A[k][k];
for(i=k+1; i<n; i++) //选主元
{
if(fabs(max)<fabs(A[i][k]))
{
max=A[i][k];
x=i;//记录选择交换的行数
}
}
for(j=k; j<n; j++) //选出列主元后,交换对应的两行
{
temp = A[k][j];
A[k][j]=A[x][j];
A[x][j]=temp;
}
temp1=b[k];
b[k]=b[x];
b[x]=temp1;
//消去过程
for(i=k+1; i<n; i++)
{
Aik=A[i][k]/A[k][k];
for(j=k; j<n; j++)
{
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
}
}
printf("列主元消元后的系数矩阵A[][]:\n\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("\t%f\t",A[i][j]);
}
printf("\n\n");
}
printf("列主元消元后的右端项b[]:\n\n");
for(i=0; i<n; i++)
{
printf("\t%f\t\n\n",b[i]);
}
//回代过程
X[n-1]=b[n-1]/A[n-1][n-1];
for(k=n-2; k>=0; k--)
{
S=b[k];
for(j=k+1; j<n; j++)
{
S=S-A[k][j]*X[j];
}
X[k]=S/A[k][k];
}
printf("输出求得的方程组结果X[]:\n");
for(i=0;i<n;i++)
{
printf("\t%f\n\n",X[i]);
}
}