目录
参考:《嵌入式系统软件设计中的常用算法》
线性方程组的一般形式
在多输入多输出系统中,假n*n的线性方程组的一般形式:
写成矩阵形式:
无回代过程的主元消去法步骤
'''
高斯消去法一般步骤:
按照左上角开始,按照对角线进行循环:
1、将列的绝对值最大的数作为主元,并且将该行调整到对角线上(提高精度);
2、主元所在的行除以主元,使得主元=1;
3、进行高斯消元,将主元所在的列的其他行的数变为0(消元),这个过程按照下式对非主元的其他行的系数进行更新;
'''
代码实现:
#include<stdio.h>
#include<math.h>
#define N 3 //方程组数
float A[N][N+1];//增广矩阵系数
float X[N]; //方程组的解
void findmain(int i) //寻找i列的主元,将其移到前当处理行位置
{
int j,k;
float c;
c = fabs(A[i][i]); k=i;//初始化主元
for(j=i+1; j<N; j++) //向下寻找绝对值最大的行
{
if(fabs(A[j][i]>c)
{
c = fabs(A[j][i]);
k = j;
}
}
if(k!=i)
{
for(j = 0; j <= N; j++) //将主元所在行交换到当前处理行位置
{
c = A[k][j];
A[k][j] = A[i][j];
A[i][j] = c;
}
}
}
void divmain(int i) //主元所在系数行除以主元,使得主元=1
{
int j;
float c;
c = A[i][i];
A[i][i] = 1.0;
for(j = i+1; j < =N; j++) A[i][j] /= c;
}
void del(int i)//进行第i列的消元处理
{
int j, k;
float c;
for(j=0; j < N; j++)
{
if(j != i && A[j][i] != 0)//只处理i行外不等于0的行(j:行坐标)
{
c = A[j][i];
A[j][i] = 0;
for(k = i+1; k < =N; k++) A[j][k] -= c*A[i][k];//调整同行的其他系数
}
}
}
void nonbacksubstitution_elimination() //主元消去法的主程序
{
for(int i = 0; i < N; ++i) //i:行
{
if(i < N - 1) findmain(i);
divmain(i);
del(i);
}
for(int i = 0; i < N; ++i) X[i] = A[i][N];//保存解
}