跳转到内容

数值方法导论/线性方程组

来自维基教科书,开放的书籍,开放的世界

目标

  • 定义向量和矩阵
  • 加、减、乘矩阵
  • 求方阵的转置
  • 定义矩阵的逆
  • 将联立线性方程组设置为矩阵形式

资源

向量和矩阵

[编辑 | 编辑源代码]

一个矩阵 是一个矩形的数组,例如数字、符号或表达式。矩阵通常用来表示线性变换线性方程组

一个三角矩阵 是一种特殊的方阵。如果 A 中主对角线以下的所有元素都为零,则 A 称为上三角矩阵

对所有

类似地,如果 A 中主对角线以上的所有元素都为零,则 A 称为下三角矩阵。

对所有

如果主对角线以外的所有元素都为零,则 A 称为对角矩阵。

对所有

这个矩阵

是上三角,这个矩阵

是下三角。

大小为 n 的单位矩阵 是一个 n×n 矩阵,其中主对角线上的所有元素都等于 1,其他所有元素都等于 0。

矩阵乘法

[编辑 | 编辑源代码]

矩阵乘法 接受两个矩阵并生成另一个矩阵。该操作的规则如下所示

用圆圈标记的交点处的值为

矩阵的转置

[edit | edit source]

矩阵的转置定义如下:矩阵A转置是另一个矩阵AT,可以通过以下任何一种等效操作创建

  • 沿其主对角线(从左上角到右下角)反射A以获得AT
  • A的行写为AT的列
  • A的列写为AT的行

下图说明了这个概念

The transpose AT of a matrix A can be obtained by reflecting the elements along its main diagonal. Repeating the process on the transposed matrix returns the elements to their original position.

矩阵的逆

[edit | edit source]

如果存在一个n×n方阵B,使得

其中In表示n×n单位矩阵,使用的乘法是普通的矩阵乘法B被称为A,记为A−1

将线性方程组表示为矩阵形式

[edit | edit source]

我们可以将这个线性方程组表示成矩阵形式,如下所示

然后我们可以使用矩阵乘法来分离变量。

线性方程组的一般矩阵形式如下所示

矩阵A是系数矩阵。X是解向量(矩阵),C是右侧向量。如果我们在两边乘以A的逆矩阵,我们可以看到解与A的逆矩阵密切相关。

高斯消元法

[编辑 | 编辑源代码]

来源

高斯消元法 是一个用来求解线性方程组的算法,类似于求一个可逆方阵的逆矩阵。该算法包含一系列对系数矩阵进行的行变换操作。共有三种基本行变换:

  • 交换两行
  • 将一行乘以一个非零常数
  • 将一行乘以一个常数加到另一行上。

例如,第一个线性方程 (L1,主元方程) 可以用来消去 从接下来的两个方程中:

然后 L2 (主元方程) 可以用来消去 从 L3 中。这个过程被称为**前向消元**。现在 L3 中只有一个未知量 ,可以用来将 代入 L2 中求解 。这个过程被称为**后向代入**。

高斯消元法的算法可以这样实现:

''' 
x = gauss_elimin(a, b)
Solves [a][x] = [b] by Gauss elimination.
'''
from numpy import dot, array

def gauss_elimin(a, b):
  (rows, cols) = a.shape
  # elimination phase
  for row in range(0, rows-1): # pivot equation/row
    for i in range(row+1, rows):
      if a[i, row] != 0.0:
        factor = a[i, row]/a[row, row]
        a[i, row+1:rows] = a[i, row+1:rows] - factor*a[row, row+1:rows]
        b[i] = b[i] - factor*b[row]
  # back substitution 
  for k in range(rows-1,-1,-1):
    b[k] = (b[k] - dot(a[k, k+1:rows],b[k+1:rows]))/a[k, k]
  return b

a = array([[3, 2.0], [-6, 6]])
b = array([7, 6])
print gauss_elimin(a, b)

带部分主元选择的高斯消元法

[编辑 | 编辑源代码]

高斯消元法容易受到舍入误差的影响,特别是当方程数量很大时,误差会累积。另一个问题是除零错误。例如,以下矩阵会导致该方法失效,因为第二个主元元素为零,而该方法要求主元元素非零。

带部分主元选择的高斯消元法类似于高斯消元法,只是在 次前向消元步骤中,找出 的最大值,并将包含最大值的所在行与主元行进行交换。交换后,之前的系数矩阵如下所示。

高斯-赛德尔法

[编辑 | 编辑源代码]

高斯消元法是一种直接(直接)方法,它将原始方程转化为等价的更容易求解的方程。一些方程组没有解,例如,方程数量少于未知量,或者一个方程与另一个方程矛盾。

高斯-赛德尔法 是一种迭代(或间接)方法,它从对解的猜测开始,并反复改进猜测,直到它收敛(收敛条件得到满足)。这种方法的优点是,当系数矩阵很大且稀疏时,它在计算上更有效率,并且可以通过调整误差容限来控制舍入误差。

该算法包含以下步骤:

  1. 将每个方程改写为对应未知量的形式,例如,将第一个方程写成 在左侧,将第二个方程写成 在左侧
  1. 找到 的初始猜测。
  2. 使用重写的方程计算新的估计值 - 始终使用最新的估计值。
  3. 重复上一步,直到所有 中最大的绝对相对近似误差小于指定的容差。

大多数迭代方法的缺点是,当方程组的系数矩阵不是 对角占优 时,它可能不会收敛。系数矩阵对角占优的方程组总是收敛的。矩阵 A 对角占优,如果

以及

一个 使用 numpy 的 Python 实现 只需迭代即可生成解向量。

LU 分解

[edit | edit source]

LU 分解 将系数矩阵 A 分解为下三角矩阵和上三角矩阵的乘积:A = LU。从 A 中导出 L 和 U 的过程称为 LU 分解或 LU 分解,类似于 高斯消元法

完成 LU 分解后,我们可以使用前向和后向替换来求解由 A 表示的线性方程组。

,这意味着 可以通过前向消元法求解。从 中,我们可以使用后向消元法求解 X。

LU 分解的一种方法类似于高斯消元法。对于一个

从最后一个矩阵中,我们可以看到为了消除 ,我们需要将 A 的第一行乘以 ,类似地,为了消除 ,需要将第一行乘以 。为了计算 L,我们可以简单地记录正向消元步骤中使用的乘数,矩阵 U 与正向消元得到的最终上三角矩阵相同。

Python 示例代码

求矩阵的逆

[edit | edit source]

求矩阵的逆是一个与求解线性方程组相关的过程。如果找到了系数矩阵的逆,那么由系数矩阵表示的方程组也就被解出来了。

求矩阵的逆的一种方法是通过解一组线性方程组分别求出逆矩阵的每一列。如果 并且

那么

.

我们可以通过使用 LU 分解方法求解方程组来计算 的第一列。其余的列可以以类似的方式计算。正如你所看到的,LU 分解方法的优势在于 LU 分解只执行一次,结果被多次使用,这降低了整个解决方案的计算复杂度。

华夏公益教科书