本文是用C语言写的列主元高斯消元法,在写之前也是百度了一下 看了好多感觉不是很喜欢,就根据自己的想法写了这个。
不知有没有什么漏洞和瑕疵,望大家指正。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
/*--获取并显示增广矩阵--*/
int n;
printf(" Please enter the dimension of coefficent matrix n:\n");
scanf("%d",&n);
printf("the dimension is :%d\n",n);
printf("Please enter the augmented matrix A=[a|b]:\n");
double A[n][n+1],x[n];
int i,j;
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
scanf("%lf",&A[i][j]);
printf("The augmented matrix is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
{
printf("%6.3lf ",A[i][j]);
}
printf("\n"); //这部分是对的
}
/*--进行列主元高斯消元法计算--*/
int k,row;
double temp,m,max;
for(k=1;k<=n;k++)
{
if (A[k-1][k-1]==0)
{
printf("No unique solution!!\n");
exit (1);
}
max=fabs(A[k-1][k-1]);
row=k-1;
for(i=k;i<n;i++) //找出主元所对应的行号 ,并换行
{
if (fabs(A[i][k-1])>=max)
{
max=fabs(A[i][k-1]);
row=i;
}
}
for(j=k-1;j<=n;j++)
{
temp=A[k-1][j];
A[k-1][j]=A[row][j];
A[row][j]=temp;
}
for(i=k;i<n;i++)
{
m=A[i][k-1]/A[k-1][k-1];
for(j=k-1;j<=n;j++)
A[i][j]=A[i][j]-A[k-1][j]*m;
}
}
/*显示计算后的矩阵*/
printf("消元后的对角矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
printf("%6.3lf ",A[i][j]);
printf("\n");
}
/*--计算解向量并显示--*/
double sum; //计算解x[n]
x[n-1]=A[n-1][n]/A[n-1][n-1];
sum=x[n-1]*A[n-2][n-1];
for(i=n-2;i>=0;i--)
{
x[i]=(A[i][n]-sum)/A[i][i];
sum=sum+x[i]*A[i-1][i];
}
printf("The solution is :\n"); //这部分是对的 //显示解 x[n]
for(i=1;i<=n;i++)
printf("x[%d]=%6.3lf\n",i,x[i-1]);
return 0;
}
执行结果如下