学习过数分的都知道,列选主元Guass消元法求解方程组的求解步骤和过程:
首先选择需消元的列的最大值,进行交换,然后对当前列进行消元;消元完成后进行回代求解方程组的解。
实现代码如下:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#define N 4
#define M 5
int getMaxinumLaber(double a[N][M], int k); //获取主元所在行
void main()
{
int i, j, k;
int laber;
double temp;
double a[N][M] = {0,4,6,4,3, 7,3,7,4,15, 2,1,2,4,10, 7,4,1,3,4};
double x[N]={0};
for(i=0; i<N; i++)
{
for(j=0; j<M; j++)
printf("%lf ", a[i][j]);
printf("\n");
}
//高斯消元法
for(k=0; k<N; k++)
{
laber = getMaxinumLaber(a, k);
//主元交换
if(laber!= k)
{
for(i=0; i<M; i++)
{
temp = a[k][i];
a[k][i] = a[laber][i];
a[laber][i] = temp;
}
}
//消元
for(i=k+1; i<N; i++)
{
if(a[k][k]==0)
break;
temp = a[i][k]/a[k][k];
for(j=k; j<M; j++)
a[i][j] = a[k][j]*temp-a[i][j];
}
}
//回代求解x
double sum;
for(i=N-1; i>=0; i--)
{
sum = 0;
for(j=i+1; j<N; j++)
{
sum += a[i][j]*x[j];
}
x[i] = (a[i][M-1]-sum)/a[i][i];
}
printf("\n");
for(i=0; i<N; i++)
{
for(j=0; j<M; j++)
printf("%lf ", a[i][j]);
printf("\n");
}
printf("\n");
for(i=0; i<N; i++)
printf("%lf ", x[i]);
printf("\n");
}
//获取主元所在行
int getMaxinumLaber(double a[N][M], int k)
{
int i;
int laber=k;
double maxinum=0;
for(i=k; i<N; i++)
if(maxinum<fabs(a[i][k]))
{
maxinum = fabs(a[i][k]);
laber = i;
}
return laber;
}
运行结果: