线性方程组的直接解法——Gauss消去法
考虑线性方程组
\]
其中,\(\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)}]\),容易知道
\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}\]
其中
\]
\]
\]
观察到重复出现的结构\(\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消去法解以下线性方程组:
\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消去法的更多相关文章
- (原创)列主元Gauss消去法的通用程序
import numpy as np np.set_printoptions(precision=5) A = np.array([[31., -13., 0., 0., 0., -10., 0., ...
- C# 列主元素(Gauss)消去法 计算一元多次方程组
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C# 顺序高斯(Gauss)消去法计算一元多次方程组
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- matlab 求解线性方程组之LU分解
线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...
- 三对角线性方程组(tridiagonal systems of equations)的求解
三对角线性方程组(tridiagonal systems of equations) 三对角线性方程组,对于熟悉数值分析的同学来说,并不陌生,它经常出现在微分方程的数值求解和三次样条函数的插值问题 ...
- 《Numerical Methods》-chaper7-解线性方程组的直接方法和最小二乘问题
基于我们在线性代数中学习过的知识,我们知道解线性方程组本质上就是Gauss消元,也就是基于增广矩阵A的矩阵初等变换.关于数学层面的内容这里不做过多的介绍,这里的侧重点是从数值计算的角度来看这些常见的问 ...
- 线性方程组的求解(C++)
1. 最佳求解方案 Most efficient way to solve a system of linear equations 求解形如 Ax=b 的最佳方式 将 A 分解为三角矩阵,A=M1⋅ ...
- OpenCascade Matrix
OpenCascade Matrix eryar@163.com 摘要Abstract:本文对矩阵作简要介绍,并结合代码说明OpenCascade矩阵计算类的使用方法. 关键字Key Words:Op ...
- OpenFOAM 编程 | One-Dimensional Transient Heat Conduction
0. 写在前面 本文中将对一维瞬态热传导问题进行数值求解,并基于OpenFOAM类库编写求解器.该问题参考自教科书\(^{[1]}\)示例 8.1. 1. 问题描述 一维瞬态热传导问题控制方程如下 \ ...
- 高斯消去、追赶法 matlab
1. 分别用Gauss消去法.列主元Gauss消去法.三角分解方法求解方程组 程序: (1)Guess消去法: function x=GaussXQByOrder(A,b) %Gauss消去法 N = ...
随机推荐
- 使用SqlDataReader对象从数据库中检索只读的数据。
SqlDataReader对象每次从查询结果中读取一行到内存中,对于sql数据库,如果只需要顺序读取,可以优先选择SqlDataReader,其对数据库的读取速度非常快. 调用SqlDataReade ...
- Oh My Life~
作者:HChan 链接:https://zhuanlan.zhihu.com/p/47084162 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Part 1 那年 ...
- 「JOISC 2022 Day1」京都观光 题解
Solution 考虑从\((x_1,y_1)\)走到\((x_2,y_2)\)满足只改变一次方向,则容易求出先向南走当且仅当 \[\frac{a_{x_1} - a_{x_2}}{x_1 - x_2 ...
- 齐博X1-栏目的调用3
本节继续说明栏目的调用之同级别栏目 同级栏目的调用 fun('sort@brother',$fid,'cms') 这个函数用的比较多,特别是栏目页,在一个页面会把一个父级栏目下的子级栏目全部列出来, ...
- 齐博x1万能数据统计接口
为何叫万能数据统计接口呢?因为可以调用全站任何数据表的数据总条数,并且可以设置查询条件http://qb.net/index.php/index/wxapp.count.html?table=memb ...
- python不确定性计算之模糊动态聚类实验
模糊动态聚类实验 本实验所采用的模糊聚类分析方法是基于模糊关系上的模糊聚类法,也称为系统聚类分析法,可分为三步: 第一步:数据标准化,建立模糊矩阵 第二步:建立模糊相似矩阵 第三步:聚类 本程序读取E ...
- html小总结(哪些可以直接设置高度和宽度)
(1)当然块级元素是可以直接设置高度和宽度的 块级元素:块级大多为结构性标记 div.h1~h6.ul.ol.dl.form.table.p.hr.pre.address.center.blockqu ...
- Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...
- Ajax基础(上)
当我们在浏览器地址栏中输入一个网址,或者通过网页表单向服务器提交内容的时候,我们就开始与服务器进行交互. 传统的Web应用交互: (1)用户触发一个Http请求到服务器,服务器对其进行处理后再返回一个 ...
- Java-(array)数组的基本概念 及 Java内存划分
(array)数组的基本概念 数组的概念:是一种容器,可同时存放多个数据值 数组的特点: 1.数组是一种引用数据类型 2.数组当中的多个数据,类型必须统一 3.数组的长度在程序运行期间不可改变 数组的 ...