全选主元高斯消去算法
2005-03-07 09:06
489 查看
/*
全选主元高斯消去算法,求解线性方程组 A * x = b
By Kingwei 2005.2.27
*/
#include <stdio.h>
#include <math.h>
#define EPS 1e-11
#define MAX_DIM 20
int GaussLEquation(double x[], int dim, double A[][MAX_DIM], double b[])
{
int maxColPos[MAX_DIM], maxRowPos;
double maxElem, absElem, temp;
int k, i, j, status = 1;
for (k=0; k<dim; k++)
{
maxElem = 0.0;
for (i=k; i<dim; i++)
for (j=k; j<dim; j++)
{
absElem = fabs(A[i][j]);
if (maxElem < absElem)
{
maxElem = absElem;
maxRowPos = i;
maxColPos[k] = j;
}
}
if (maxElem <= EPS)
{
for (i=k; i<dim; i++)
if (fabs(b[i]) > EPS)
return 0;
for (i=k; i<dim; i++)
maxColPos[i] = i;
status = 2;
break;
}
if (maxRowPos != k)
{
for (j=k; j<dim; j++)
{
temp = A[k][j];
A[k][j] = A[maxRowPos][j];
A[maxRowPos][j] = temp;
}
temp = b[k];
b[k] = b[maxRowPos];
b[maxRowPos] = temp;
}
if (maxColPos[k] != k)
{
for (i=0; i<dim; i++)
{
temp = A[i][k];
A[i][k] = A[i][maxColPos[k]];
A[i][maxColPos[k]] = temp;
}
}
temp = A[k][k];
for (j=k; j<dim; j++)
A[k][j] /= temp;
b[k] /= temp;
for (i=k+1; i<dim; i++)
{
temp = A[i][k];
for (j=k; j<dim; j++)
A[i][j] -= A[k][j]*temp;
b[i] -= b[k]*temp;
}
}
x[dim-1] = b[dim-1];
for (i=dim-1; i>=0; i--)
{
temp = 0.0;
for (j=dim-1; j>i; j--)
temp += x[j]*A[i][j];
x[i] = b[i]-temp;
}
for (i=dim-1; i>=0; i--)
if (maxColPos[i] != i)
{
temp = x[i];
x[i] = x[maxColPos[i]];
x[maxColPos[i]] = temp;
}
return status;
}
int ReadLEquation(int *dim, double A[][MAX_DIM], double b[])
{
int i, j;
if (scanf("%d", dim) == EOF)
return 0;
for (i=0; i<*dim; i++)
{
for (j=0; j<*dim; j++)
scanf("%lf", &A[i][j]);
scanf("%lf", &b[i]);
}
return 1;
}
void DisplayRoot(double x[], int dim)
{
int i;
for (i=0; i<dim; i++)
printf("%lf ", x[i]);
printf("/n/n");
}
int main()
{
int dim;
double A[MAX_DIM][MAX_DIM], b[MAX_DIM], x[MAX_DIM];
while (ReadLEquation(&dim, A, b))
{
switch (GaussLEquation(x, dim, A, b))
{
case 0: printf("No Solution!/n/n");
break;
case 1: printf("Succeseful Solved!/n");
DisplayRoot(x, dim);
break;
case 2: printf("Unnumberable Solutions!/n");
DisplayRoot(x, dim);
break;
default:break;
}
}
return 0;
}
全选主元高斯消去算法,求解线性方程组 A * x = b
By Kingwei 2005.2.27
*/
#include <stdio.h>
#include <math.h>
#define EPS 1e-11
#define MAX_DIM 20
int GaussLEquation(double x[], int dim, double A[][MAX_DIM], double b[])
{
int maxColPos[MAX_DIM], maxRowPos;
double maxElem, absElem, temp;
int k, i, j, status = 1;
for (k=0; k<dim; k++)
{
maxElem = 0.0;
for (i=k; i<dim; i++)
for (j=k; j<dim; j++)
{
absElem = fabs(A[i][j]);
if (maxElem < absElem)
{
maxElem = absElem;
maxRowPos = i;
maxColPos[k] = j;
}
}
if (maxElem <= EPS)
{
for (i=k; i<dim; i++)
if (fabs(b[i]) > EPS)
return 0;
for (i=k; i<dim; i++)
maxColPos[i] = i;
status = 2;
break;
}
if (maxRowPos != k)
{
for (j=k; j<dim; j++)
{
temp = A[k][j];
A[k][j] = A[maxRowPos][j];
A[maxRowPos][j] = temp;
}
temp = b[k];
b[k] = b[maxRowPos];
b[maxRowPos] = temp;
}
if (maxColPos[k] != k)
{
for (i=0; i<dim; i++)
{
temp = A[i][k];
A[i][k] = A[i][maxColPos[k]];
A[i][maxColPos[k]] = temp;
}
}
temp = A[k][k];
for (j=k; j<dim; j++)
A[k][j] /= temp;
b[k] /= temp;
for (i=k+1; i<dim; i++)
{
temp = A[i][k];
for (j=k; j<dim; j++)
A[i][j] -= A[k][j]*temp;
b[i] -= b[k]*temp;
}
}
x[dim-1] = b[dim-1];
for (i=dim-1; i>=0; i--)
{
temp = 0.0;
for (j=dim-1; j>i; j--)
temp += x[j]*A[i][j];
x[i] = b[i]-temp;
}
for (i=dim-1; i>=0; i--)
if (maxColPos[i] != i)
{
temp = x[i];
x[i] = x[maxColPos[i]];
x[maxColPos[i]] = temp;
}
return status;
}
int ReadLEquation(int *dim, double A[][MAX_DIM], double b[])
{
int i, j;
if (scanf("%d", dim) == EOF)
return 0;
for (i=0; i<*dim; i++)
{
for (j=0; j<*dim; j++)
scanf("%lf", &A[i][j]);
scanf("%lf", &b[i]);
}
return 1;
}
void DisplayRoot(double x[], int dim)
{
int i;
for (i=0; i<dim; i++)
printf("%lf ", x[i]);
printf("/n/n");
}
int main()
{
int dim;
double A[MAX_DIM][MAX_DIM], b[MAX_DIM], x[MAX_DIM];
while (ReadLEquation(&dim, A, b))
{
switch (GaussLEquation(x, dim, A, b))
{
case 0: printf("No Solution!/n/n");
break;
case 1: printf("Succeseful Solved!/n");
DisplayRoot(x, dim);
break;
case 2: printf("Unnumberable Solutions!/n");
DisplayRoot(x, dim);
break;
default:break;
}
}
return 0;
}
相关文章推荐
- 全选主元或者列选主元的高斯-若当消去法求逆矩阵的数学依据
- 数值作业:Guass全选主元消去法之C语言代码
- 矩阵求逆算法-全选主元高斯-约旦法
- 高斯全主元消去法解线性方程组
- 计算方法:高斯-若当主元消去法解线性方程组
- 全选主元高斯-约旦法
- “上帝的算法”在高斯混合分布中的应用
- 高斯判别分析算法及其python实现
- 【转】【高斯】高斯模糊算法[1]
- 数字图像处理领域算法之高斯平滑
- 高斯模糊的算法
- 高斯模糊的简单算法
- 高斯图像模糊算法及其 C 实现
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯等等
- 寻找一个主元(出现次数大于总元素的一半)的算法
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 扫瞄线填充算法 AND 高斯抗锯齿算法
- 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
- 高斯模糊的算法