0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用C语言实现高斯列主元消去法解线性方程组

typedef 来源:typedef 作者:typedef 2022-12-02 09:25 次阅读

这篇文章主要是用C语言实现高斯列主元消去法求解多元一次方程。

高斯列主元消去法

由于涉及到的数学公式太麻烦了,所以从网上找了一张图片,介绍高斯消去法的,如下图:

4aa70ae0-71d6-11ed-8abf-dac502259ad0.png

Gauss列主元素法

示例

假如现在有一个三元一次方程组,如下图:

4ac1f918-71d6-11ed-8abf-dac502259ad0.png

三元一次方程组

求解多元一次方程组可以分成三个步骤:

首先根据方程组构建增广矩阵

其次对增广矩阵经过行列式的初等变化变成上三角矩阵

最后从后往前回代求解。

构造增广矩阵

系数矩阵就是将方程组的系数组成矩阵。

而增广矩阵就是在系数矩阵的右边添上一列,这一列是线性方程组的等号右边的值。

下图即为行列式的增广矩阵:

4ae06f92-71d6-11ed-8abf-dac502259ad0.png

增广矩阵

组上三角矩阵

这里说的组上三角矩阵是指经过若干步初等变换,将矩阵左上角和右下角连线组成的对角线左下方的元素全部清零。

这个步骤主要涉及到主元以及初等变换两个概念。

主元指在消去过程中起主导作用的元素,主元通常选择绝对值最大的元素,用它做除法能够减小舍入误差的扩散,使得数值解比较可靠。

以下为行列式的初等变换:

换行变换:交换两行(列)

倍法变换:将行列式的某一行(列)的所有元素同乘以数k

消法变换:把行列式的某一行(列)的所有元素乘以一个数k并加到另一行(列)的对应元素上

而下面的图则是经过若干步初等变化组成的上三角矩阵:

4af701da-71d6-11ed-8abf-dac502259ad0.png

迭代求解

在组成上三角矩阵之后,就可以从下往上依次回代求出方程的解了

C代码

#include
#include

#defineMAX_MATRIX10

/**
*@briefSwapRow进行行交换
*@paramm待计算的矩阵
*row待交行的行
*max_row待交换的另一行
*n矩阵行数
*/
staticvoidSwapRow(doublem[][MAX_MATRIX],introw,intmax_row,intn){
doubleswap;
for(intk=row;k<= n; k++) {
    swap = m[row][k];
    m[row][k] = m[max_row][k];
    m[max_row][k] = swap;
  }
}

/**
 * @brief 组上三角矩阵
 * @param m 待计算的矩阵
 *        n 矩阵行数
 */
static void SelectColE(double m[][MAX_MATRIX], int n) {
  int max_row_e = 0;  //主元所在行
  double ratio = 0;   //消元因数
  for (int j = 0; j < n; j++) {
    max_row_e = j;
    for (int i = j; i < n; i++) {
      if (fabs(m[i][j]) >fabs(m[max_row_e][j])){
max_row_e=i;
}
}
if(max_row_e!=j){
SwapRow(m,j,max_row_e,n);//与最大主元所在行交换
}
//消元
for(inti=j+1;i< n; i++) {
      ratio = m[i][j] / m[j][j];
      for (int k = j; k < n + 1; k++) {
        m[i][k] -= m[j][k] * ratio;
      }
    }
  }
}

/**
 * @brief: Gauss 高斯列主元消元法求解线性方程(A*X = B)
 * @param: m 由于A|B组成的增广矩阵,X为待求的解
 *         n 求解的元数,n要小于MAX_MATRIX
 * @result:所求结果存放在m[][n]中
 */
void Gauss(double m[][MAX_MATRIX], int n) {
  SelectColE(m, n);   // 列选主元并消元成上三角
  // 回代求解,结果存在m[][n]中
  for(int i = n - 1; i >=0;i--){
for(intj=i+1;j< n; j++) {
      m[i][n] -= m[i][j] * m[j][n];
    }
    m[i][n] /= m[i][i];
  }
}

double a[3][MAX_MATRIX] = {
  {3,-1, 1, 4},  //A|B
  {1, 1, 1, 6},
  {2, 3,-1, 12}
};

int main(int argc ,char **argv) {
  Gauss(a, 3);
  printf("%f,%f,%f
",a[0][3], a[1][3], a[2][3]);
  return 0;
}

上述程序运行完成之后,终端输出:2.000000,3.000000,1.000000

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136971

原文标题:C语言实现高斯消元解线性方程组

文章出处:【微信号:typedef,微信公众号:typedef】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    为什么不允许带负荷发电机

    为什么不能通过先发电机的方式停机呢?如果汽门关闭了,而发电机没有解,会造成发电机逆的,这么思考的确也是有一定道理的,那么在现实中为什么不允许这么做呢? 从运行经验来看,汽机自动
    的头像 发表于 12-17 10:58 131次阅读

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 401次阅读

    支路电流是以什么为求解对象

    的定义 支路电流是一种基于基尔霍夫电流定律(KCL)的电路分析方法。它通过将电路分解为若干个支路,并以这些支路的电流为变量,建立一线性方程组来求解电路中的电流分布。 1.2 支路电流
    的头像 发表于 08-08 17:00 1074次阅读

    支路电流和网孔电流的区别是什么

    的核心思想是将电路中的所有节点(除了参考节点)的电压作为未知量,然后利用基尔霍夫电流定律(KCL)列出一线性方程,通过求解这些方程来得到各个节点的电压值。最后,根据欧姆定律计算出各个
    的头像 发表于 08-08 16:26 1412次阅读

    支路电流适用于非线性电路吗

    支路电流是一种基于基尔霍夫电流定律(KCL)的电路分析方法。基尔霍夫电流定律指出,在一个电路节点上,流入节点的电流之和等于流出节点的电流之和。通过将电路分解为若干个支路,并在每个节点上应用基尔霍夫电流定律,可以列出一线性方程组
    的头像 发表于 08-08 16:22 741次阅读

    如何用C语言实现高效查找(二分

    今天给分享一下使用C语言实现二分算法,主要包含以下几部分内容:二分查找算法介绍二分查找算法使用场景二分查找算法代码实现二分查找算法实现过程用C
    的头像 发表于 06-04 08:04 1156次阅读
    如何用<b class='flag-5'>C</b><b class='flag-5'>语言实现</b>高效查找(二分<b class='flag-5'>法</b>)

    线性电路的定义 线性电路有什么特点和功能

    线性电路是一类电路,其中的元件满足线性关系,即它们的电压-电流(V-I)特性可以用线性方程来描述。
    的头像 发表于 05-21 17:25 1908次阅读

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 1002次阅读

    电网是什么意思?电网故障装置的作用与功能有哪些?

    一、电网的概念电网简单来说,就是当电力系统因为某些原因(比如设备故障或受到干扰)而失去稳定,无法维持正常的同步运行时,为了防止事故扩大,系统会自动或手动地将电网分成两个或多个独
    的头像 发表于 03-29 12:00 6528次阅读
    电网<b class='flag-5'>解</b><b class='flag-5'>列</b>是什么意思?电网故障<b class='flag-5'>解</b><b class='flag-5'>列</b>装置的作用与功能有哪些?

    C语言实现Web参数传递

    电子发烧友网站提供《C语言实现Web参数传递.docx》资料免费下载
    发表于 03-24 09:14 2次下载

    网孔电流和回路电流怎么选择比较好

    是基于基尔霍夫电流定律的一种分析电路的方法。基尔霍夫电流定律指出,电流在电路中的分配满足代数和为零的原则,即所有进入某一电路节点的电流之和等于所有离开该节点的电流之和。网孔电流通过构造网孔方程组,并
    的头像 发表于 03-01 11:02 1834次阅读

    电磁场基本方程组高度概括

    电子发烧友网站提供《电磁场基本方程组高度概括.pdf》资料免费下载
    发表于 02-05 13:56 2次下载

    节点电压怎么列方程 节点电压流入为正还是负

    电压基于基尔霍夫定律,通过将电路中的每个节点的电压表示为相对于某一参考节点的电压,将电路转换为一电压连接的线性方程。节点电压可以适用于任何电路,无论是简单的电阻电路还是更复杂的电
    的头像 发表于 01-30 11:20 6177次阅读

    卡尔曼滤波算法c语言实现方法

    卡尔曼滤波(Kalman Filter)是一种用于估计状态的算法,最初由R.E. Kalman在1960年提出。它是一种线性高斯滤波器,常用于处理包含误差噪声的动态系统。卡尔曼滤波算法通过组合测量
    的头像 发表于 01-17 10:51 3026次阅读

    ADUC7061如何使用C语言实现EEPROM功能?

    我使用ADUC7061做的信号采集,现在客户需要实现EEPROM功能来保存3-5个数据,请问如何使用C语言实现?不使用外部EEPROM 专用IC。
    发表于 01-12 06:56