高斯消元详解
创作时间:
作者:
@小白创作中心
高斯消元详解
引用
1
来源
1.
https://www.cnblogs.com/yythm/p/18755180
高斯消元法是解决线性方程组、求矩阵的秩或求解矩阵的逆时的一种非常高效且常用的方法。它的核心思想是通过行变换将矩阵转换为上三角形式,然后使用回代求解方程组。本文将详细讲解高斯消元的原理,并使用Java实现高斯消元法来解决线性方程组。
引言
在解决线性方程组、求矩阵的秩或求解矩阵的逆时,高斯消元法(Gaussian Elimination)是一种非常高效且常用的方法。它的核心思想是通过行变换将矩阵转换为上三角形式,然后使用回代求解方程组。
在本篇博客中,我们将详细讲解高斯消元的原理,并使用Java实现高斯消元法来解决线性方程组。
一、高斯消元法的基本原理
高斯消元法主要分为两个步骤:
前向消元(Forward Elimination)
- 通过初等行变换,将增广矩阵转换为上三角矩阵。
- 目标是消去主元(pivot)下面的元素,使矩阵的主对角线以下全为0。
回代(Back Substitution)
1.1 高斯消元的步骤
给定线性方程组(增广矩阵)
$$
\left[\begin{array}{cccc}
2 & -1 & 1 & 3 \
1 & 3 & 2 & 12 \
1 & -1 & 2 & 5
\end{array}\right]
$$
等价于:
$$
\left{
\begin{array}{l}
2x-y+z=3 \
x+3y+2z=12 \
x-y+2z=5
\end{array}
\right.
$$
我们希望将其转换为上三角矩阵:
$$
\left[\begin{array}{cccc}
2 & -1 & 1 & 3 \
0 & 3.5 & 1.5 & 10.5 \
0 & 0 & 1.857 & 2.714
\end{array}\right]
$$
然后使用回代求解x, y, z
。
二、Java实现高斯消元
我们使用Java实现高斯消元法,以求解n
元线性方程组。
2.1 Java代码
import java.util.Scanner;
public class GaussianElimination {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 输入方程组的未知数个数
System.out.print("请输入方程组的未知数个数 n: ");
int n = sc.nextInt();
// 定义增广矩阵 A[n][n+1]
double[][] A = new double[n][n + 1];
System.out.println("请输入增广矩阵(系数矩阵 + 右侧常数项):");
for (int i = 0; i < n; i++) {
for (int j = 0; j <= n; j++) {
A[i][j] = sc.nextDouble();
}
}
// 进行高斯消元法
gaussianElimination(A, n);
sc.close();
}
// 高斯消元法
public static void gaussianElimination(double[][] A, int n) {
for (int i = 0; i < n; i++) {
// 选取当前列的最大主元(部分主元选取)
int maxRow = i;
for (int k = i + 1; k < n; k++) {
if (Math.abs(A[k][i]) > Math.abs(A[maxRow][i])) {
maxRow = k;
}
}
// 交换当前行与最大主元所在行
swapRows(A, i, maxRow);
// 检查主元是否为0(无唯一解)
if (Math.abs(A[i][i]) < 1e-10) {
System.out.println("无唯一解!");
return;
}
// 进行消元
for (int j = i + 1; j < n; j++) {
double factor = A[j][i] / A[i][i];
for (int k = i; k <= n; k++) {
A[j][k] -= factor * A[i][k];
}
}
}
// 进行回代求解
double[] solution = backSubstitution(A, n);
// 输出结果
System.out.println("方程组的解为:");
for (int i = 0; i < n; i++) {
System.out.printf("x%d = %.5f\n", i + 1, solution[i]);
}
}
// 交换矩阵的两行
private static void swapRows(double[][] A, int row1, int row2) {
double[] temp = A[row1];
A[row1] = A[row2];
A[row2] = temp;
}
// 回代求解
private static double[] backSubstitution(double[][] A, int n) {
double[] solution = new double[n];
for (int i = n - 1; i >= 0; i--) {
solution[i] = A[i][n] / A[i][i];
for (int j = i - 1; j >= 0; j--) {
A[j][n] -= A[j][i] * solution[i];
}
}
return solution;
}
}
三、代码详解
3.1 代码流程
输入增广矩阵
- 用户输入
n
(未知数个数)。 - 输入
n × (n+1)
维的增广矩阵(包括方程右侧的常数项)。
- 用户输入
进行前向消元
- 主元选取:选取当前列中绝对值最大的元素作为主元,并将该行交换到当前行,以减少误差。
- 消元:使用当前行的主元将其下方所有元素消为0,构造上三角矩阵。
回代求解
- 从最后一行开始,逐步求解
x_n, x_{n-1}, ...
。
- 从最后一行开始,逐步求解
四、输入输出示例
输入
请输入方程组的未知数个数 n: 3
请输入增广矩阵(系数矩阵 + 右侧常数项):
2 -1 1 3
1 3 2 12
1 -1 2 5
输出
方程组的解为:
x1 = 1.00000
x2 = 2.00000
x3 = 3.00000
五、优化与拓展
5.1 处理无解和无唯一解的情况
- 无解情况:出现
0 = 非0
的矛盾方程。 - 无唯一解:方程组自由变量多于约束条件。
5.2 计算矩阵的逆
- 如果增广矩阵形如
[A | I]
,则可以通过高斯消元将A
化为单位矩阵,从而求得A^-1
。
5.3 使用BigDecimal
提高精度
- Java
double
存在精度问题,可用BigDecimal
进行高精度计算。
六、总结
高斯消元法的核心思想:
- 通过行变换,将增广矩阵变成上三角矩阵。
- 再通过回代,求解未知数。
Java实现高斯消元的关键点:
- 主元选取:避免数值误差,保证稳定性。
- 行交换:如果某列主元为0,则交换行确保计算正常。
- 消元过程:让下三角部分归零。
- 回代求解:逐步求得最终解。
热门推荐
饮茶后四小时能吃药吗?医生的专业解答来了
模塑科技年报造假风波再发酵 董事长被取保候审
道教认为人的命天注定吗
道同:明朝刚正不阿的番禺知县
中国居民膳食指南(全文ppt)中国居民膳食指南科学研究报告(全文完整版pdf)
喝柠檬水对喉咙痛有好处吗
基于RFID的室内定位技术分析:精准定位与智能管理的融合
教唆犯罪案例解析:如何认定教唆罪名的成立
沈鹏:世间无物非草书
舌头中间凹陷的原因及处理建议
如何选择艾草种植时间:从气候、土壤到生长周期的全面解析
收法院执行款怎么处理
杭州摩托车可以开吗?杭州市区可以骑摩托车吗
技术分析:比特币为何跌破7万美元?
加拿大全民医保也需要购买商业医疗保险?针灸按摩、眼科牙科和药保全靠它!
长期接受水光针疗法会加速皮肤老化吗?
籍贯可以更改吗?详解户籍变更的法律程序
水文化丨说水解字:汕
如何理解 CNN 中的 RGB 图像和通道?
江浙沪,也有“白菜房”
十大富含叶酸的水果排行榜
野钓选择台钓还是路亚?全方位对比分析
电锤功率一般多大 装修DIY选对工具很重要
秘书在沟通中应注意的问题
住宅楼下可以开餐饮吗?需要办理环保证吗?
vm虚拟机如何自适应屏幕大小
医法圆通 4卷,(清)郑钦安编
抗衰老新方向,牡丹籽油
电动车高速跑,敢闯ETC?真相揭秘
计件工有最低工资吗