Python 中的高斯消元法

2024 年 8 月 29 日 | 5 分钟阅读

数值模拟的几乎所有领域都使用线性和多项式方程。但是,在线性方程组分析领域,它们在工程中最为自然地使用。结构、弹性物质、热通量、电磁学、电路以及许多其他事物都属于线性系统的范畴。

在对线性系统进行建模时,会生成 Ax = b 类型的数学方程,其中 x 是输入矩阵,b 是系统的响应向量。系统固有的属性由 A 反映,A 称为系数矩阵,与输入向量无关。如果输入发生变化,我们要评估的线性方程系统将仍然包含相同的系数矩阵 A,但会有一个不同的响应向量 b。

求解线性方程组的方法

除了迭代过程外,还有所谓的直接方法,这里我们不讨论。它们都试图将原始方程转换为一个在性质上与原始系统等效且更易于求解的系统。

我们可以使用三个基本运算来实现这种转换

  • 交换矩阵 A 的两行时,A 的行列式的值会改变符号;
  • 当矩阵 A 的一行乘以某个标量时,A 的行列式的值会乘以相同的标量;
  • 如果我们通过将 A 的某一行加上另一行乘以一个标量来修改该行,则 A 的行列式保持不变;

这些过程当然不会影响系统的解,解保持不变,但它们可能会影响系数矩阵 A 及其行列式。

下表总结了三种主要的直接解法

方法初始形式最终形式
高斯消元法Ax = bUx = c
LU分解Ax = bLUx = b
高斯-约旦消元法Ax = bIx = c

高斯消元法

行变换是高斯消元法的另一种说法。它是一种线性代数方法,用于求解线性方程组。本质上,系数矩阵经过一系列过程。涉及的步骤如下

  1. 我们可以交换两行
  2. 通过乘以一个标量来缩放一行
  3. 将一行添加到矩阵的另一行

这些过程一直执行,直到系数矩阵的左下角填满零。

Python 中的高斯消元算法

关于手动过程,有两种可能的方法:一种是将行通过减法而不是加法进行转换,另一种是将转换后的行不替换为矩阵 A 的初始行,只替换为上三角矩阵特有的分量。实际上,解的计算不受不属于 U(修改后的矩阵)的元素的影响。

代码

输出

3
3 4 -1
5 -2 1
2 -2 1
8 4 1
['8', '4', '1']
3	| 4	| -1	| 8	| 
5	| -2	| 1	| 4	| 
2	| -2	| 1	| 1	| 

Result:	1	2	3

如果我们给出一组无解的方程,输出将如下

输出

3
1 1 1
0 1 -3
2 1 5
2 1 0
['2', '1', '0']
1	| 1	| 1	| 2	| 
0	| 1	| -3	| 1	| 
2	| 1	| 5	| 0	| 

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
 in 
     75 
     76     # Calculating the solution of the matrix
---> 77     x = gauss_elem(A_mat)
     78 
     79     # Printing the result

________________________________________
3 frames
________________________________________
/usr/lib/Python3.7/fractions.py in __new__(cls, numerator, denominator, _normalize)
    176 
    177         if denominator == 0:
--> 178             raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
    179         if _normalize:
    180             if type(numerator) is int is type(denominator):

ZeroDivisionError: Fraction(3, 0)