嵌入式算法:“无回代过程主元消去法”解线性方程组(含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
    评论
以下是 MATLAB 实现列主元高斯消去法线性方程组代码: ```matlab function [x] = gaussian_elimination(A, b) % 输入参数: % A:系数矩阵 % b:常数向量 % 获取矩阵的行数和列数 [n, m] = size(A); % 判断系数矩阵是否为方阵 if n ~= m error('The coefficient matrix must be square!'); end % 初始化主元所在列的数组 p = 1:n; % 消元过程 for k = 1:n-1 % 选取主元 [~, pivot] = max(abs(A(k:n, k))); % 找到主元在当前列中的行号 pivot = pivot + k - 1; % 将行号转换为在整个矩阵中的行号 if A(pivot, k) == 0 % 判断主元是否为零 error('The coefficient matrix is singular!'); end % 交换主元所在行和第 k 行 if pivot ~= k A([pivot, k], :) = A([k, pivot], :); b([pivot, k]) = b([k, pivot]); p([pivot, k]) = p([k, pivot]); end % 消元 for i = k+1:n factor = A(i, k) / A(k, k); A(i, k+1:n) = A(i, k+1:n) - factor * A(k, k+1:n); A(i, k) = factor; b(i) = b(i) - factor * b(k); end end % 回带过程 x = zeros(n, 1); for k = n:-1:1 x(k) = (b(k) - A(k, k+1:n) * x(p(k+1:n))) / A(k, k); end ``` 你可以将上述代码复制到 MATLAB 编辑器中,然后输入系数矩阵和常数向量,例如: ```matlab A = [3 -0.1 -0.2; 0.1 7 -0.3; 0.3 -0.2 10]; b = [7.85; -19.3; 71.4]; x = gaussian_elimination(A, b); ``` 其中,系数矩阵 $A$ 和常数向量 $b$ 分别为: $$ A = \begin{bmatrix} 3 & -0.1 & -0.2 \\ 0.1 & 7 & -0.3 \\ 0.3 & -0.2 & 10 \end{bmatrix}, \quad b = \begin{bmatrix} 7.85 \\ -19.3 \\ 71.4 \end{bmatrix} $$ 最终得到的为 $x = [3; -2.5; 7]$。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KPer_Yang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值