考虑线性方程组

\[\mathrm{A}x=\mathrm{b}
\]

其中,\(\mathrm{A}=(a_{ij})_{n\times n}\),\(\mathrm{b}=[b_1,b_2,\cdots,b_n]^{\mathrm{T}}\)。在线性代数的课程中,我们已经学习过Gauss消元法,具体操作是将矩阵A转化为“阶梯型”矩阵。为方便起见,本文仅仅讨论系数矩阵非奇异的方程组,此时,目标是将矩阵A转化为上三角矩阵,再执行回代过程,即可给出方程组的解。本文将给出在计算机上的具体操作及实例代码。

一、基本Gauss消去法

我们仅仅讨论对矩阵第一列的操作,剩余的操作可以以此类推,因而不再赘述。

在执行Gauss消去法时,我们将第一列对角元以下的元素全部变为零。记第一列消元操作后的增广矩阵为\([\mathrm{A}^{(1)},\mathrm{b}^{(1)}]\),容易知道

\[[\mathrm{A}^{(1)},\mathrm{b}^{(1)}]=
\begin{bmatrix}
a_{11} & a_{22} & \cdots &a_{1n} & b_1 \\
0 & a_{22}^{(1)} &\cdots &a_{2n}^{(1)} & b_2^{(1)}\\
\vdots &\vdots & & \vdots &\vdots\\
0 & a_{n2}^{(1)} & &a_{nn}^{(1)} & b_n^{(1)}
\end{bmatrix}\]

其中

\[a_{ij}^{(1)}=a_{ij}-\frac{a_{i1}}{a_{11}}a_{1j},j=2,\cdots ,n
\]
\[a_{i1}^{(1)}=0
\]
\[b_i^{(1)}=b_i-\frac{a_{i1}}{a_{11}}b_1
\]

观察到重复出现的结构\(\frac{a_{_{i1}}}{a_{_{11}}}\),我们记它为\(l_{i1}\),称为消元因子,并将它存储在原来\(a_{i1}\)的位置。在计算的过程中,先计算消元因子并存储在相应位置,再执行后续的算法。

对于后续部分的运算,在第k步,只要对矩阵\(A^{(k-1)}(k:n,k:n)\)执行相同操作即可。

二、列主元Gauss消去法

在执行Gauss消元法的过程中,如果\(a_{kk}^{(k-1)}\)相对于其他元素绝对值较小,则会产生较大的舍入误差,影响计算精度,为此,我们引入了列主元Gauss消去法,基于交换矩阵的行不影响线性方程组的解。

记执行完k-1步消元后的增广矩阵为\([\mathrm{A}^{(k-1)},\mathrm{b}^{(k-1)}]\)。考虑第k列对角元及其以下的部分。选择绝对值最大的元所在行,与当前行执行行交换,再进行Gauss消元法。

三、计算实例

用列主元Gauss消去法解以下线性方程组:

\[\left\{
\begin{array}{}
0.5x_1+1.1x_2+3.1x_3=6,\\
2x_1+4.5x_2+3.6x_3=0.02,\\
5x_1+0.96x_2+6.5x_3=0.96.
\end{array}
\right.\]
#include <iostream>
#include <math.h>
using namespace std; int main()
{
double A_Extended[3][4]={0.5,1.1,3.1,6,2,4.5,3.6,0.02,5,0.96,6.5,0.96};
double X_solution[3];
for (int i=0;i<=2;i++)
{
int n=i;
for (int p=i+1;p<=2;p++)
{
if (fabs(A_Extended[p][i])>fabs(A_Extended[n][i]))
{
n=p;
}
} for (int p=i;p<=2+1;p++)
{
double k=A_Extended[n][p];
A_Extended[n][p]=A_Extended[i][p];
A_Extended[i][p]=k;
} for (int p=i+1;p<=2;p++)
{
A_Extended[p][i]=-A_Extended[p][i]/A_Extended[i][i];
for (int pco=i+1;pco<=2+1;pco++)
{
A_Extended[p][pco]=A_Extended[p][pco]+A_Extended[p][i]*A_Extended[i][pco];
}
}
}
X_solution[2]=A_Extended[2][3]/A_Extended[2][2];
for (int i=1;i>=0;i--)
{
double sum=0;
for (int k=2;k>i;k--)
{
sum=sum+A_Extended[i][k]*X_solution[k];
}
X_solution[i]=(A_Extended[i][3]-sum)/A_Extended[i][i];
} cout<<X_solution[0]<<" "<<X_solution[1]<<" "<<X_solution[2]<<endl;
return 0;
}

线性方程组的直接解法——Gauss消去法的更多相关文章

  1. (原创)列主元Gauss消去法的通用程序

    import numpy as np np.set_printoptions(precision=5) A = np.array([[31., -13., 0., 0., 0., -10., 0., ...

  2. C# 列主元素(Gauss)消去法 计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. C# 顺序高斯(Gauss)消去法计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. matlab 求解线性方程组之LU分解

    线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...

  5. 三对角线性方程组(tridiagonal systems of equations)的求解

    三对角线性方程组(tridiagonal systems of equations)   三对角线性方程组,对于熟悉数值分析的同学来说,并不陌生,它经常出现在微分方程的数值求解和三次样条函数的插值问题 ...

  6. 《Numerical Methods》-chaper7-解线性方程组的直接方法和最小二乘问题

    基于我们在线性代数中学习过的知识,我们知道解线性方程组本质上就是Gauss消元,也就是基于增广矩阵A的矩阵初等变换.关于数学层面的内容这里不做过多的介绍,这里的侧重点是从数值计算的角度来看这些常见的问 ...

  7. 线性方程组的求解(C++)

    1. 最佳求解方案 Most efficient way to solve a system of linear equations 求解形如 Ax=b 的最佳方式 将 A 分解为三角矩阵,A=M1⋅ ...

  8. OpenCascade Matrix

    OpenCascade Matrix eryar@163.com 摘要Abstract:本文对矩阵作简要介绍,并结合代码说明OpenCascade矩阵计算类的使用方法. 关键字Key Words:Op ...

  9. OpenFOAM 编程 | One-Dimensional Transient Heat Conduction

    0. 写在前面 本文中将对一维瞬态热传导问题进行数值求解,并基于OpenFOAM类库编写求解器.该问题参考自教科书\(^{[1]}\)示例 8.1. 1. 问题描述 一维瞬态热传导问题控制方程如下 \ ...

  10. 高斯消去、追赶法 matlab

    1. 分别用Gauss消去法.列主元Gauss消去法.三角分解方法求解方程组 程序: (1)Guess消去法: function x=GaussXQByOrder(A,b) %Gauss消去法 N = ...

随机推荐

  1. Go_Goroutine详解

    Goroutine详解 goroutine的概念类似于线程,但 goroutine是由Go的运行时(runtime)调度和管理的.Go程序会智能地将 goroutine 中的任务合理地分配给每个CPU ...

  2. C#中ref和out关键字的应用以及区别

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...

  3. 华为路由器vrrp(虚拟路由器冗余协议)基本配置命令

    vrrp(虚拟路由器冗余协议)基本配置 int g0/0/0 vrrp vrid 1 virtual-ip 172.16.1.254 创建VRRP备份组,备份组号为1,配置虚拟IP为172.16.1. ...

  4. (Java初学篇)IDEA项目新建流程和软件配置优化以及怎么彻底删除项目

    相信很多小伙伴们在初学 Java 时都会出现这样的情况,就是在网上一顿搜索加捣鼓终于把 JDK 和IDEA 这两款软件安装配置好,但是发现面对这个陌生的软件此时却无从下手,那么接下来我就给大家简单地介 ...

  5. 15. MongoDB系列之选择片键

    1. 片键类型 1.1 升序片键 升序片键通常类似于date或ObjectId--随着时间稳步增长的字段. 这种模式通常会使MongoDB更难保持块的平衡,因为所有的块都是由一个分片创建的. 1.2 ...

  6. 那齐博x3又什么什么?

    那齐博x3又什么什么? 齐博x3是齐博X1/齐博x2之后的升级版本. 主要优化圈子系统

  7. golang中的socket编程

    0.1.索引 https://waterflow.link/articles/1664591292871 1.tcp的3次握手(建立连接) 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当 ...

  8. python渗透测试入门——基础的网络编程工具

    <Python黑帽子--黑客与渗透测试编程之道学习>这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来. 1.基础的网络编 ...

  9. .net core Blazor+自定义日志提供器实现实时日志查看器

    场景 我们经常远程连接服务器去查看日志,比较麻烦,如果直接访问项目的某个页面就能实时查看日志就比较奈斯了,花了1天研究了下.net core 日志的原理,结合blazor实现了基本效果. 实现原理 自 ...

  10. onps栈移植说明(1)——onps栈的配置及裁剪

    onps栈的移植涉及几个部分:1)系统配置及裁剪:2)基础数据类型定义:3)RTOS适配层实现:4)编写网卡驱动并注册网卡.本文作为onps栈移植的指导性文件将给出一般性的移植说明及建议,具体的移植样 ...