嵌入式算法:“无回代过程主元消去法”解线性方程组(含C代码)

目录

线性方程组的一般形式

无回代过程的主元消去法

代码实现:


参考:《嵌入式系统软件设计中的常用算法》

线性方程组的一般形式

在多输入多输出系统中,假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];//保存解
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值