高斯消元法求解线性方程(c实现)

来源:互联网 时间:1970-01-01

/*

高斯消元法求解线性方程组主要是消元和回代两个步骤;

*/


#include<stdio.h>

#define N 10


void Gauss_elimination(float *a, int m, int n) //高斯消去法,求解线性方程

{
int i, j, k;
float r, t;
if (m == n)
{
printf("此矩阵不是线性方程组的增广矩阵,所以无法求得此解。/n");
return;
}
else
{
for (i = 0; i < m; i++)
{
r = *(a + n*i + i);//保存主对角线上的元素
for (k = i; k <= m; k++)//i行归一化,各元素除以对角线元素
*(a + n*i + k) /= r;//若r绝对值很小可能溢出
for (j = i + 1; j < m; j++)//将下三角部分的i列消为0
{
t = *(a + n*j + i);
for (k = i; k < n; k++)
*(a + n*j + k) -= t * *(a + n*i + k);//i行乘以-t加到j行,使a[j][i]为0
}
}
}
for (i = m - 2; i >= 0; i--)//回代求各a[i][N]
for (j = m - 1; j>i; j--)//下标大于i的解a[j][N]已求出
*(a + n*i + m) -= *(a + n*i + j) * *(a + n*j + m);//用各a[j][N]回代,求出a[i][N]
for (i = 0; i < m; i++)
printf(" x%d= %2.1f/n", i+1, *(a + n*i + m));

}


void input_matrix(float *a, int m, int n) //输入矩阵
{
int i, j;
printf("请输入%d行%d列的矩阵:/n", m, n);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%f", (a + n*i + j));

}


int main(void)
{
int  m,n;
float a[N][N];
printf("请输入线性方程增广矩阵的行和列:/n");
scanf("%d%d",&m,&n);
input_matrix(a, m, n);
if(m >= n)
{
printf("你输入的不是增广矩阵,无法求解/n");
}
else
{
printf("求得线性方程的解为:/n");
Gauss_elimination(a,m,n);
}
}


相关阅读:
Top