- Matlab 教程
- MATLAB - 首页
- MATLAB - 概述
- MATLAB - 特性
- MATLAB - 环境设置
- MATLAB - 编辑器
- MATLAB - 在线版
- MATLAB - 工作区
- MATLAB - 语法
- MATLAB - 变量
- MATLAB - 命令
- MATLAB - 数据类型
- MATLAB - 运算符
- MATLAB - 日期和时间
- MATLAB - 数字
- MATLAB - 随机数
- MATLAB - 字符串和字符
- MATLAB - 文本格式化
- MATLAB - 时间表
- MATLAB - M 文件
- MATLAB - 冒号表示法
- MATLAB - 数据导入
- MATLAB - 数据导出
- MATLAB - 数据归一化
- MATLAB - 预定义变量
- MATLAB - 决策
- MATLAB - 决策语句
- MATLAB - if 语句
- MATLAB - if-else 语句
- MATLAB - if-elseif-else 语句
- MATLAB - 嵌套 if 语句
- MATLAB - switch 语句
- MATLAB - 嵌套 switch
- MATLAB - 循环
- MATLAB - 循环
- MATLAB - for 循环
- MATLAB - while 循环
- MATLAB - 嵌套循环
- MATLAB - break 语句
- MATLAB - continue 语句
- MATLAB - end 语句
- MATLAB - 数组
- MATLAB - 数组
- MATLAB - 向量
- MATLAB - 转置运算符
- MATLAB - 数组索引
- MATLAB - 多维数组
- MATLAB - 兼容数组
- MATLAB - 分类数组
- MATLAB - 元胞数组
- MATLAB - 矩阵
- MATLAB - 稀疏矩阵
- MATLAB - 表格
- MATLAB - 结构体
- MATLAB - 数组乘法
- MATLAB - 数组除法
- MATLAB - 数组函数
- MATLAB - 函数
- MATLAB - 函数
- MATLAB - 函数参数
- MATLAB - 匿名函数
- MATLAB - 嵌套函数
- MATLAB - return 语句
- MATLAB - 无返回值函数
- MATLAB - 局部函数
- MATLAB - 全局变量
- MATLAB - 函数句柄
- MATLAB - 滤波器函数
- MATLAB - 阶乘
- MATLAB - 私有函数
- MATLAB - 子函数
- MATLAB - 递归函数
- MATLAB - 函数优先级
- MATLAB - map 函数
- MATLAB - mean 函数
- MATLAB - end 函数
- MATLAB - 错误处理
- MATLAB - 错误处理
- MATLAB - try...catch 语句
- MATLAB - 调试
- MATLAB - 绘图
- MATLAB - 绘图
- MATLAB - 绘制数组
- MATLAB - 绘制向量
- MATLAB - 条形图
- MATLAB - 直方图
- MATLAB - 图形
- MATLAB - 二维线图
- MATLAB - 三维图
- MATLAB - 格式化绘图
- MATLAB - 对数坐标轴图
- MATLAB - 绘制误差条
- MATLAB - 绘制三维等高线图
- MATLAB - 极坐标图
- MATLAB - 散点图
- MATLAB - 绘制表达式或函数
- MATLAB - 绘制矩形
- MATLAB - 绘制频谱图
- MATLAB - 绘制网格曲面图
- MATLAB - 绘制正弦波
- MATLAB - 插值
- MATLAB - 插值
- MATLAB - 线性插值
- MATLAB - 二维数组插值
- MATLAB - 三维数组插值
- MATLAB - 多项式
- MATLAB - 多项式
- MATLAB - 多项式加法
- MATLAB - 多项式乘法
- MATLAB - 多项式除法
- MATLAB - 多项式的导数
- MATLAB - 变换
- MATLAB - 变换
- MATLAB - 拉普拉斯变换
- MATLAB - 拉普拉斯滤波器
- MATLAB - 高斯-拉普拉斯滤波器
- MATLAB - 逆傅里叶变换
- MATLAB - 傅里叶变换
- MATLAB - 快速傅里叶变换
- MATLAB - 二维逆余弦变换
- MATLAB - 向坐标轴添加图例
- MATLAB - 面向对象
- MATLAB - 面向对象编程
- MATLAB - 类和对象
- MATLAB - 函数重载
- MATLAB - 运算符重载
- MATLAB - 用户自定义类
- MATLAB - 复制对象
- MATLAB - 代数
- MATLAB - 线性代数
- MATLAB - 高斯消元法
- MATLAB - 高斯-约旦消元法
- MATLAB - 简化行阶梯型
- MATLAB - 特征值和特征向量
- MATLAB - 积分
- MATLAB - 积分
- MATLAB - 二重积分
- MATLAB - 梯形法则
- MATLAB - 辛普森法则
- MATLAB - 其他
- MATLAB - 微积分
- MATLAB - 微分
- MATLAB - 矩阵的逆
- MATLAB - GNU Octave
- MATLAB - Simulink
- MATLAB - 有用资源
- MATLAB - 快速指南
- MATLAB - 有用资源
- MATLAB - 讨论
MATLAB - 高斯消元法
高斯消元法(也称为Gaussian Elimination)是一种求解线性方程组的方法。它涉及使用一系列运算将方程组的增广矩阵转换为行阶梯形,然后进行回代以找到解。
让我们首先了解什么是增广矩阵和行阶梯形矩阵。
增广矩阵是线性代数中用于求解线性方程组的矩阵。它将方程组的系数矩阵和常数矩阵组合成一个矩阵。增广矩阵通常通过将常数列(方程的右边)附加到系数列来编写。
例如,考虑线性方程组:
$$\mathrm{2x \: + \: 3y \: = \: 5}$$
$$\mathrm{4x \: + \: 6y \: = \: 10}$$
系数矩阵 (A) 和常数矩阵 (b) 为:
$$\mathrm{A \: = \: \begin{pmatrix} 2 & 3 \\ 4 & 6 \end{pmatrix} \: , \: b \: = \: \left(\begin{array}{c}5\\ 10\end{array}\right)}$$
增广矩阵 (A|b) 是通过将 b 附加到 A 形成的:
$$\mathrm{\begin{pmatrix} 2 & 3 & | & 5 \\ 4 & 6 & | & 10\end{pmatrix}}$$
**行阶梯形 (REF)** 是线性代数中使用的矩阵的一种特定形式,用于简化求解线性方程组的过程。如果矩阵满足以下条件,则该矩阵为行阶梯形:
- 所有非零行都在所有零行的上方。
- 每个非零行的首个非零元素(也称为主元)为 1,并且位于其上方行的首个非零元素的右边。
- 首个非零元素在其列中是唯一的非零元素。
这是一个 3×4 行阶梯形矩阵的示例:
$$\mathrm{\begin{pmatrix} 1 & 2 & 3 & 4 \\ 0 & 1 & 5 & 6 \\ 0 & 0 & 1 & 7\end{pmatrix}}$$
在这个例子中:
- 第一个首个非零元素是 1,它出现在第一列。
- 第二个首个非零元素也是 1,它出现在第一个首个非零元素的右边,在第二行和第二列。
- 第三个首个非零元素是 1,它出现在第二个首个非零元素的右边,在第三行和第三列。
- 所有首个非零元素下方的元素都是零。
- 行的顺序排列,使得任何零行(如果存在)都在底部(在这个特定示例中没有零行)。
高斯消元法的步骤
考虑线性方程组:
$$\mathrm{\begin{cases} 2x \: + \: 3y \: = \: 8\\ 4x \: + \: 9y \: = \: 20\end{cases}}$$
我们可以将其写成增广矩阵形式:
$$\mathrm{\begin{bmatrix} 2 & 3 & | & 8 \\ 4 & 9 & | & 20\end{bmatrix}}$$
基于上述等式,高斯消元法的步骤如下:
1. 形成增广矩阵:
$$\mathrm{\begin{bmatrix} 2 & 3 & | & 8 \\ 4 & 9 & | & 20\end{bmatrix}}$$
2. 将第一行的首个非零元素化为 1(如果它还不是 1):
将第一行除以 2:
$$\mathrm{\begin{bmatrix} 1 & \frac{3}{2} & | & 4 \\ 4 & 9 & | & 20\end{bmatrix}}$$
消去第二行中的 x 项:
从第二行中减去第一行的 4 倍:
$$\mathrm{R2 \: = \: R2 \: - \: 4 \: \times \: R1}$$
$$\mathrm{\begin{bmatrix} 1 & \frac{3}{2} & | & 4 \\ 0 & 3 & | & 4\end{bmatrix}}$$
将第二行的首个非零元素化为 1(如果它还不是 1):
将第二行除以 3:
$$\mathrm{\begin{bmatrix} 1 & \frac{3}{2} & | & 4 \\ 0 & 1 & | & \frac{4}{3}\end{bmatrix}}$$
消去第一行中的 y 项:
从第一行中减去第二行的 3/2 倍。
$$\mathrm{R1 \: = \: R1 \: - \: \frac{3}{2} \: \times \: R2}$$
$$\mathrm{\begin{bmatrix} 1 & 0 & | & \frac{10}{3} \\ 0 & 1 & | & \frac{4}{3}\end{bmatrix}}$$
写出解
从最终的增广矩阵中,我们可以直接看到解。
$$\mathrm{x \: = \: \frac{10}{3} \: , \: y \: = \: \frac{4}{3}}$$
因此,方程组的解为。
$$\mathrm{x \: = \: \frac{10}{3} \: , \: y \: = \: \frac{4}{3}}$$
现在我们知道了高斯消元法的步骤,让我们尝试在matlab中做同样的事情。
MATLAB 中的高斯消元法
我们将使用的方程是。
$$\mathrm{\begin{cases} 2x \: + \: 3y \: = \: 8\\ 4x \: + \: 9y \: = \: 20\end{cases}}$$
**步骤 1** - 定义系数矩阵 A 和右端向量 b
A = [2 3; 4 9]; b = [8; 20];
**步骤 2** - 用向量 b 增广矩阵 A。
Ab = [A b];
**步骤 3** - 执行行运算以将 A 转换为上三角矩阵。
MATLAB 有一个名为 rref(简化行阶梯形)的函数,它简化了此过程。但是,如果您想手动执行这些步骤,您可以执行以下操作:
% Forward elimination n = size(Ab, 1); for i = 1:n-1 for j = i+1:n factor = Ab(j,i) / Ab(i,i); Ab(j,:) = Ab(j,:) - factor * Ab(i,:); end end
**步骤 4** - 向后代入以求解变量。
% Initialize the solution vector x = zeros(n,1); % Backward substitution x(n) = Ab(n,end) / Ab(n,n); for i = n-1:-1:1 x(i) = (Ab(i,end) - Ab(i,i+1:n) * x(i+1:n)) / Ab(i,i); end
**步骤 5** - 显示结果
disp('The solution is:'); disp(x);
完整的matlab代码如下。
% Define the coefficient matrix A and the right-hand side vector b A = [2 3; 4 9]; b = [8; 20]; % Augment the matrix A with the vector b Ab = [A b]; % Forward elimination n = size(Ab, 1); for i = 1:n-1 for j = i+1:n factor = Ab(j,i) / Ab(i,i); Ab(j,:) = Ab(j,:) - factor * Ab(i,:); end end % Initialize the solution vector x = zeros(n,1); % Backward substitution x(n) = Ab(n,end) / Ab(n,n); for i = n-1:-1:1 x(i) = (Ab(i,end) - Ab(i,i+1:n) * x(i+1:n)) / Ab(i,i); end % Display the result disp('The solution is:'); disp(x);
当代码在matlab命令窗口中执行时,我们得到的输出是
The solution is: 2.0000 1.3333
使用 rref(简化行阶梯形)
您可以使用MATLAB内置的rref()函数来达到与下面所示相同的结果。
% Define the coefficient matrix A and the right-hand side vector b A = [2 3; 4 9]; b = [8; 20]; % Augment the matrix A with the vector b Ab = [A b]; % Use rref to get the Reduced Row Echelon Form R = rref(Ab); % Extract the solutions x = R(:,end); % Display the result disp('The solution is:'); disp(x);
执行后的输出为:
The solution is: 2.0000 1.3333