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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144592

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    射频的起点:从麦克斯韦方程组说起

    射频技术的故事,要从麦克斯韦和他的方程组讲起。对很多行业的人来说,麦克斯韦这个名字或许有些陌生—— 他的名气似乎远不及电学领域的安培、法拉第,也比不上发明大王爱迪生、交流电先驱特斯拉。但对每一个射频
    的头像 发表于 08-21 15:14 3986次阅读
    射频的起点:从麦克斯韦<b class='flag-5'>方程组</b>说起

    UWB - TDOA方案定位技术

    给出最常用的三维场景四基站模型并列出两种经典解法:双曲面交会的原始非线性方程,以及工程上更常用的伪线性化闭式。 原始非线性模型(双曲面方程
    发表于 07-14 17:32

    无刷直流电机状态方程系数矩阵的动态更新

    在无刷直流电机控制系统的仿真中如何快速动态地求解无刷直流电机的状态方程组是一个关键问题在 Matlab/Simulink 环境中,利用C语言形式的系统函数来构建仿真模块,可灵活快速地
    发表于 07-09 14:17

    GLAD应用:高斯光束的吸收和自聚焦效应

    的,这将使不同空间位置的光所经历的光程长度不同,即介质对入射光束的作用等价于光学透镜,从而导致光束的自行聚焦效果。 特别地,当入射光束强度沿垂直光轴的界面内呈高斯形时,且强度足够产生非线性效应的情况下
    发表于 06-17 08:52

    C语言实战2例

    的部分,可提成1.5%,高于100万时,超过100万的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整
    发表于 05-31 23:55

    单片机C语言实例(350+例)

    350+单片机C语言实例! 纯分享帖,需要者可点击附件免费获取完整资料~~~【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 05-22 21:47

    OCAD应用:四连续变焦系统

    数据输入完毕,按动工具条上确定按钮,计算立即完成,并显示在下面文本框内,如图5。利用工具条上“图文”菜单随时可以单独显示PW自动优化结果,得出系统实际像差平衡数据,最终完成四连续变焦系统的
    发表于 05-20 08:49

    GLAD应用:高斯光束的吸收和自聚焦效应

    的,这将使不同空间位置的光所经历的光程长度不同,即介质对入射光束的作用等价于光学透镜,从而导致光束的自行聚焦效果。 特别地,当入射光束强度沿垂直光轴的界面内呈高斯形时,且强度足够产生非线性效应的情况下
    发表于 05-16 08:47

    VirtualLab Fusion应用:Ince-Gaussian模式

    摘要 除了厄米和拉盖尔高斯光束模式外,波动方程在傍轴情况还有第三种严格的正交系——即所谓的Ince-Gaussian光束。这些在椭圆坐标系中定义,并且允许通过椭圆参数
    发表于 04-30 08:46

    限时免积分下载:增量式与位置式PID算法的C语言实现分享

    前面咱们有分享对PID算法离散化和增量式PID算法原理进行来探索,之后又使用Matlab进行了仿真实验,对PID三个参数又有了更深入的认识,接下来我们来使用C语言进行PID算法实现,并且结合控制电机的项目来深入学习。 今天限时免
    发表于 03-05 18:32

    PID控制算法的C语言实现:PID算法原理

    在工业应用中 PID 及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握 PID 算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵
    发表于 02-26 15:24

    VirtualLab Fusion应用:Ince-Gaussian模式

    摘要 除了厄米和拉盖尔高斯光束模式外,波动方程在傍轴情况还有第三种严格的正交系——即所谓的Ince-Gaussian光束。这些在椭圆坐标系中定义,并且允许通过椭圆参数
    发表于 02-17 09:59

    VirtualLab Fusion应用:Ince-Gaussian模式

    摘要 除了厄米和拉盖尔高斯光束模式外,波动方程在傍轴情况还有第三种严格的正交系——即所谓的Ince-Gaussian光束。这些在椭圆坐标系中定义,并且允许通过椭圆参数
    发表于 01-03 09:33

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

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

    图像高斯滤波的原理及FPGA实现思路

    1.概念 高斯分布 图像滤波之高斯滤波介绍 图像处理算法|高斯滤波 高斯滤波(Gaussian filter)包含很多种,包括低通、高通、带通等,在图像上说的
    的头像 发表于 12-07 09:12 2589次阅读
    图像<b class='flag-5'>高斯</b>滤波的原理及FPGA<b class='flag-5'>实现</b>思路