肆叁小灶第二讲 数学软件与线性代数

肆叁小灶第二讲,介绍了 Mathematica 和 MATLAB 的基本用法,主要包括线性方程组的求解、线性空间与内积空间的相关理论、行列式、特征值与奇异值分解等内容。

计算的目的不在于数字本身,而在于洞察其背后的意义。 -Richard Hamming

笃实 43 班的同学们大家好,这里是学委小组的第二期推送。本期我们将结合 Mathematica、MATLAB,帮助大家从头开始复习一遍线性代数。

考虑到不同老师的教学顺序不同,我们将采用我们自己认为最合理的顺序进行复习。如果屏幕前你的老师是从行列式讲起的,我们希望这篇推送能帮你重新建立起对线性代数的整体理解。

前言:Mathematica 与 MATLAB 简介

Mathematica 是由 Wolfram 开发的一款科学计算软件,内置了大量函数可以直接调用,能够大大简化解决数学问题时的计算过程。此外,Wolfram 还提供了一个线上计算平台:https://www.wolframalpha.com/。

MATLAB 则更加强大,在深度学习、计算机视觉、图像识别等领域都有广泛的应用。但考虑到篇幅所限以及解释型语言较难入门,本文只介绍 MATLAB 的基本矩阵运算指令。

Mathematica 和 MATLAB 的下载与安装详见信息服务中心 its.tsinghua.edu.cn,篇幅有限,此处不再赘述。

上图是 Mathematica 的启动界面,点按新文档按钮进入如下图所示的编辑界面:

在空白页面中输入指令完毕后点按红色的计算按钮运行指令。

上图是 MATLAB 的操作界面,在命令行窗口中输入指令后按回车键执行指令。

一、逆矩阵:求解线性方程组唯一解

线性代数的建立源于对线性方程组的求解。对于有唯一解的线性方程组,我们可以通过对系数矩阵求逆来求出方程的唯一解。

1
2
(* Mathematica 计算逆矩阵 *)
Inverse[{{1,2,3},{0,1,2},{0,0,1}}]
1
2
% MATLAB 计算逆矩阵
inv([1,2,3;0,1,2;0,0,1])

如何保存求逆时高斯消元的具体过程呢?为此我们推出了 LU 分解,又因为 LU 分解不唯一以及 LU 分解与逆矩阵的存在性不等价,我们分别推出了 LDU 分解和 PLU 分解。

1
2
3
(* Mathematica 计算 LU/PLU 分解 *)
LUDecomposition[{{2,4,8},{1,1,1},{3,9,27}}]
(* 输出的第一个元素为一个 3*3 矩阵,其中包含对角线的上三角为 U 矩阵,不含对角线的下三角加上 I 为 L 矩阵;输出的第二个 3*1 的元素代表 P 矩阵 *)
1
2
% MATLAB 计算 LU/LUP 分解
[L,U,P]=lu([2,4,8;1,1,1;3,9,27])

而对于有无数解的线性方程组,我们需要线性空间相关理论求出线性方程组的全体解;对于无解的线性方程组,我们可以通过最小二乘法求出最接近解的伪解,而这需要内积空间的相关理论。接下来,我们将按照线性空间→内积空间的顺序依次解决这两个问题。

二、线性空间:求解线性方程组全体解

通过 10 条性质,我们定义了抽象线性空间,又通过极大线性无关组、张成、基、维数研究了线性空间的基本性质。接着我们从线性空间回到矩阵,将向量组的秩推广到了矩阵的秩,并定义了矩阵的四个子空间。最后我们推出了线性代数基本定理 1。

线性代数基本定理 1:对于一个 $m\times n$ 矩阵,

  1. 行空间与列空间的维数相等,等于矩阵的秩。
  2. 行空间与零空间都是 $\mathbb R^n$ 的子空间,且维数之和等于矩阵的行数。
  3. 列空间与左零空间都是 $\mathbb R^m$ 的子空间,且维数之和等于矩阵的行数。
  4. 借助线性空间理论,我们得出了线性方程组全体解的求解方法:全体解=特解+零空间。
1
2
3
4
5
(* Mathematica 计算线性方程组全体解 *)
(* 第一步:计算特解 *)
LinearSolve[{{1,2,3},{4,5,6},{7,8,9}},{{2},{5},{8}}]
(* 第二步:计算零空间 *)
NullSpace[{{1,2,3},{4,5,6},{7,8,9}}]
1
2
3
4
5
% MATLAB 计算线性方程组全体解
% 第一步:计算特解
x=[1,2,3;4,5,6;7,8,9]\[2;5;8]
% 第二步:计算零空间
null([1,2,3;4,5,6;7,8,9])

三、内积空间:求解无解线性方程组的伪解

我们首先定义了线性空间上的内积,推出了勾股定理、Cauchy-Schwarz 不等式,并通过内积定义了正交。接着我们借助正交理论研究矩阵的四个子空间,推出了线性代数基本定理 2。

线性代数基本定理 2:对于一个 $m\times n$ 矩阵 $A$,

  1. $A$ 的零空间与行空间互为 $\mathbb R^n$ 上的正交补。
  2. $A$ 的左零空间与列空间互为 $\mathbb R^m$ 上的正交补。
  3. $A$ 的行空间到列空间上存在双射 $T_1(x)=Ax$。
  4. $A$ 的列空间到行空间上存在双射 $T_2(x)=A^Tx$。

借助内积空间理论,我们研究了向量到矩阵列空间的投影。对于列向量线性无关的矩阵 $A$,我们推出了投影矩阵 $\mathbb P_{C(A)}=A(A^TA)^{-1}A^T$,并推出了最小二乘法。

1
2
(* Mathematica 计算最小二乘法 *)
LeastSquares[{{1,1},{1,2},{1,3}},{{7},{7},{8}}]
1
2
3
4
% MATLAB 计算最小二乘法
A=[1,1;1,2;1,3]
b=[7;7;8]
x=inv(A^{\prime}*A)*A^{\prime}*b

但我们发现投影矩阵的求解过程计算量过大,于是我们借助 Gram-Schmidt 正交化得到了正交矩阵,对于正交矩阵 $Q$,投影矩阵 $\mathbb P_{C(Q)}=QQ^T$,大大简化了计算。

1
2
(* Mathematica 计算 QR 分解 *)
{q,r}=QRDecomposition[{{1,2},{3,4}}]
1
2
% MATLAB 计算 QR 分解
[Q,R]=qr([1,2;3,4])

而对于列向量线性相关的矩阵 $A$,$A^TA$ 不可逆,求解投影矩阵需要先求出伪逆,而伪逆需要奇异值分解相关理论,接下来我们将通过行列式→特征值→奇异值分解的顺序解决这个问题。

四、行列式,特征值与奇异值:求解伪逆

行列式的讲解方法一直存在很大争议。我们认为,通过行列式的线性性质推出 Leibnitz 展开,再推出 Laplace 展开是比较合理的顺序。借助行列式,我们推出了矩阵可逆的充要条件是矩阵的行列式不为零。

1
2
(* Mathematica 计算矩阵行列式 *)
Det[{{1,2,3},{4,5,6},{7,8,9}}]
1
2
3
% MATLAB 计算矩阵行列式
det([1,2,3;4,5,6;7,8,9])
% 行列式为 0 时由于浮点数误差往往输出并不为 0

借助行列式理论,我们得到了特征值与特征向量的求解方法:求解方程 $det(\lambda I_n-A)=0$,再求解 $N(\lambda I_n-A)$。若特征向量足够张成整个 $\mathbb R^n$,则矩阵可以相似对角化。

1
2
3
(* Mathematica 计算矩阵特征值与特征向量 *)
Eigensystem[{{1,2,3},{4,5,6},{7,8,9}}]
(* 输出的第一个元素为特征值集合,第二个元素为特征值分别对应的特征向量 *)
1
2
3
% MATLAB 计算矩阵特征值与特征向量
[V,D]=eig([1,2,3;4,5,6;7,8,9])
% V 为特征向量矩阵,D 为特征值矩阵

但并非所有矩阵都能够相似对角化,但我们发现所有方阵都与上三角矩阵相似,于是我们推出了 Schur 分解以及 Jordan 分解。这部分内容会在下学期的高等线性代数选讲课程中详细介绍,不在本学期考察范围内,有大致了解即可。

1
2
3
(* Mathematica 计算 Schur 分解和 Jordan 分解 *)
{q,t}=SchurDecomposition[{{2.7,4.8,8.1},{-0.6,0,0},{0.1,0,0.3}}]
{v,j}=JordanDecomposition[{{27,48,81},{-6,0,0},{1,0,3}}]
1
2
3
4
% MATLAB 计算 Schur 分解和 Jordan 分解
[Q,T]=schur([2.7,4.8,8.1;-0.6,0,0;0.1,0,0.3])
[V,J]=jordan([27,48,81;-6,0,0;1,0,3])
% jordan 函数需要 Symbolic Math Toolbox 库

然而有一类矩阵一定能够相似对角化:实对称矩阵,且其特征向量之间还满足正交性,于是我们研究了实对称矩阵以及其特殊分支正定矩阵的正交相似对角化。

至此,我们终于得到了足够的理论依据,得以推出奇异值分解理论。奇异值分解的求解方法是:先求解 $A^TA$ 的特征值与特征向量,得出右奇异向量以及奇异值,再借助右奇异向量和 $N(A^T)$ 解出左奇异向量。

1
2
(* Mathematica 计算奇异值分解 *)
{u,s,v}=SingularValueDecomposition[{1,2},{1,2}]
1
2
% MATLAB 计算奇异值分解
[U,S,V]=svd([1,2;1,2])

借助奇异值分解,我们推出了伪逆的求解方法:设 $A$ 的奇异值分解为 $A=U\Sigma V^T$,则 $A$ 的伪逆 $A^+=V\Sigma^+ U^T$,其中 $\Sigma^+$ 为 $\Sigma$ 取转置后再取对角元素的倒数。借助伪逆,我们得以求解列向量线性相关矩阵的投影矩阵:$\mathbb P_{C(A)}=AA^+$。此外,可以证明,对于前文线性代数基本定理2中的双射 $T_1(x)$ 和 $T_2(x)$,其逆映射分别为 $T_1^{-1}(x)=A^+x,T_2^{-1}(x)=A^{T^+}x$。

1
2
(* Mathematica 计算伪逆 *)
PseudoInverse[{{1,2,3},{4,5,6},{7,8,9}}]
1
2
% MATLAB 计算伪逆
pinv([1,2,3;4,5,6;7,8,9])

至此,我们已经完全解决了线性方程组 $Ax=b$ 的求解或伪解问题。那如果将向量 $x$ 和 $b$ 也分别替换为矩阵 $X$ 和 $B$,我们又该如何求矩阵方程 $AX=B$ 的解或伪解呢?

显然当 $A$ 固定时伪解可以逐列求得,即 $X=A^+B$ ,因此更值得讨论的是当 $A$ 变化时如何寻找一个最佳的 $A$ 使得伪解 $X$ 的误差最小。用矩阵论的语言来说,就是当 $rank(A)=k$ 固定时,寻找一个最佳矩阵 $A_k$ 使得 $B-\mathbb P_{C(A_k)}B$ 的 Frobenius 范数最小,而这就是主成分分析问题。

实际上若 $A_k$ 满足条件,则所有列空间与 $A_k$ 的列空间相同的矩阵都满足条件:与其说我们求解的是一个最佳矩阵,不如说我们求解的是一个最佳子空间。因此我们不妨取一个列向量为该子空间标准正交基的矩阵 $Q_k$,借助奇异值分解理论,可以证明:若 $B$ 有奇异值分解 $\displaystyle B=U\Sigma V^T=\sum^r_{i=1}\sigma_i u_i v_i^T$,则当 $Q_k=[u_1,u_2,\dots ,u_k]$ 时,有 $\displaystyle||B-\mathbb P_{C(Q_k)}B||_{F_{min}}=\sum^r_{i=k+1}\sigma_i^2$。

后记

篇幅所限,课程中涉及的大量推论、应用和证明技巧以及和微积分的联系在本文中都没有覆盖到,还请大家认真复习。最后,下面两个表格分别是特殊矩阵的特征根与特征向量和矩阵可逆与奇异的等价条件。希望能帮助大家串联起整个线性代数体系。

这期的内容到这里就结束了,感谢大家读到这里。这里推荐一本书《Introduction to Linear Algebra》-Gilbert Strang,事实上本文的复习顺序就是受到了这本书的启发,且上面的两个表格也正来自这本书。

原定本期更新的 Markdown 和 LaTeX 环境的配置过程和入门语法将顺延到寒假期间更新,在这里先预祝各位同学期末考试顺利。


肆叁小灶第二讲 数学软件与线性代数
https://sqzr2319.github.io/43Class-2/
作者
sqzr2319
发布于
2024年12月17日
许可协议