视频加载失败

18.06 第 8 讲:解 Ax = b,行最简形 R

4221 字
21 分钟
18.06 第 8 讲:解 Ax = b,行最简形 R
  1. 118.06 第 1 讲:方程组的行图与列图
  2. 218.06 第 2 讲:用矩阵做消元
  3. 318.06 第 3 讲:矩阵乘法的四种看法与逆矩阵
  4. 418.06 第 4 讲:分解成 A = LU
  5. 518.06 第 5 讲:转置、置换与向量空间
  6. 618.06 第 6 讲:列空间与零空间
  7. 718.06 第 7 讲:解 Ax = 0,主变量与特解
  8. 818.06 第 8 讲:解 Ax = b,行最简形 R本文
  9. 918.06 第 9 讲:线性无关、基与维数
  10. 1018.06 第 10 讲:四个基本子空间
  11. 1118.06 第 11 讲:矩阵空间、秩 1 矩阵与小世界图
  12. 1218.06 第 12 讲:图、网络与关联矩阵
  13. 1318.06 第 13 讲:第一次测验复习
  14. 1418.06 第 14 讲:正交向量与正交子空间
  15. 1518.06 第 15 讲:投影到子空间
  16. 1618.06 第 16 讲:投影矩阵与最小二乘
  17. 1718.06 第 17 讲:正交矩阵与 Gram-Schmidt
  18. 1818.06 第 18 讲:行列式的性质
  19. 1918.06 第 19 讲:行列式公式与代数余子式
  20. 2018.06 第 20 讲:Cramer 法则、逆矩阵与体积
  21. 2118.06 第 21 讲:特征值与特征向量
  22. 2218.06 第 22 讲:对角化与矩阵的幂
  23. 2318.06 第 23 讲:微分方程与 exp(At)
  24. 2418.06 第 24 讲:Markov 矩阵与 Fourier 级数
  25. 2518.06 第 24b 讲:第二次测验复习
  26. 2618.06 第 25 讲:对称矩阵与正定性
  27. 2718.06 第 26 讲:复矩阵与快速 Fourier 变换
  28. 2818.06 第 27 讲:正定矩阵与极小值
  29. 2918.06 第 28 讲:相似矩阵与 Jordan 标准形
  30. 3018.06 第 29 讲:奇异值分解
  31. 3118.06 第 30 讲:线性变换及其矩阵
  32. 3218.06 第 31 讲:基变换与图像压缩
  33. 3318.06 第 32 讲:第三次测验复习
  34. 3418.06 第 33 讲:左逆、右逆与伪逆
  35. 3518.06 第 34 讲:期末复习

Strang 这一讲把 Ax=bA\mathbf{x} = \mathbf{b} 彻底解完:先看有没有解,有的话再找一个特解,然后把零空间里的所有向量加上去。我用他上一讲的 3 × 4 矩阵验证,这样得到的所有 x\mathbf{x} 都满足方程;而 AA 乘以特解的 2 倍就不行,得到 (2,10,12)(2, 10, 12),不是 b=(1,5,6)\mathbf{b} = (1, 5, 6)。接着我用 1000 个随机右端项数了一遍四种秩的情形:秩小于行数时,随机的 b\mathbf{b} 有解的比例是 0.000,秩等于行数时是 1.000。他在最后一句话里说,秩告诉你解的个数的一切。我的实验只量了其中“有没有解”这一半:数出来确实如此。

本讲速览

视频:Lecture 8: Solving Ax = b: row reduced form R(OCW 页面与字幕) 教材:《Introduction to Linear Algebra》第 6 版 §3.3 The Complete Solution to Ax = b 前置:第 7 讲:解 Ax = 0,主变量与特解 一句话:Ax=bA\mathbf{x} = \mathbf{b} 的完全解是一个特解 xp\mathbf{x}_p 加上零空间里的任意向量 xn\mathbf{x}_n,有没有解、有几个解,只看秩 rr 与行数 mm、列数 nn 的关系。

配合视频
  • 开头他用上一讲的矩阵讲“消元怎么发现无解”,我在第一节用代码重做了一遍,这一段可以倍速。
  • “解集不是子空间,它是一个被平移过的东西”那一段他在黑板上画四维空间,自己都说画得不行。听他说的话比看图重要。
  • 后半段的 r=mr = m、r=nr = n、r=m=nr = m = n 四个格子是本讲的主角,他边问边答,节奏很快,建议暂停下来自己先填一遍。
  • 他在中途写错过一次 RR 的形状又自己改了过来,这个小插曲值得看:它说明“II 在左上角”这件事只在主列恰好排在前面时才成立。

先问:有没有解#

他先不急着解,而是拿上一讲的矩阵

A=[1222246836810]A = \begin{bmatrix} 1 & 2 & 2 & 2 \\ 2 & 4 & 6 & 8 \\ 3 & 6 & 8 & 10 \end{bmatrix}

问了一个问题:Ax=bA\mathbf{x} = \mathbf{b} 对哪些 b\mathbf{b} 有解?第三行等于前两行之和,所以三个方程左边加起来有一个现成的关系:第一行加第二行减第三行是零。如果左边的一个组合给出全零,右边的同一个组合也必须给出零,所以要有 b1+b2=b3b_1 + b_2 = b_3。他举的数是 (1,5,17)(1, 5, 17),不行;(1,5,6)(1, 5, 6) 可以。

消元怎么发现这件事? 把 b\mathbf{b} 当作多出来的一列,贴在 AA 右边,这就是增广矩阵。对增广矩阵做行运算,也就是对方程两边同时做同样的事。消元到最后一行,左边全零,右边剩下 b3−b2−b1b_3 - b_2 - b_1,方程变成 0=b3−b2−b10 = b_3 - b_2 - b_1。这就是可解条件。

我没有用符号计算,而是在 AA 右边并排放了一个 3×33 \times 3 的单位矩阵,让右边三列记录消元对 b\mathbf{b} 的三个分量做了什么:做完消元,右边那块就是 EE,满足 EA=REA = R。EE 的最后一行,就是“把行组合成零行”的那组系数。

下面的脚本里有一个手写的 rref,带容差,和上一篇的思路一样(每个代码块都要能单独运行,所以会重复贴一遍。贴三遍有点蠢,但我宁愿蠢一点,也不想让你去翻别的文件):

import numpy as np
def rref(M: np.ndarray, tol: float = 1e-10) -> tuple[np.ndarray, list[int]]:
"""化成行最简形,返回 R 和主列下标。"""
R = M.astype(float).copy()
rows, cols = R.shape
pivots: list[int] = []
r = 0
for c in range(cols):
if r == rows:
break
p = r + int(np.argmax(np.abs(R[r:, c])))
if abs(R[p, c]) < tol:
continue
R[[r, p]] = R[[p, r]]
R[r] /= R[r, c]
for i in range(rows):
if i != r:
R[i] -= R[i, c] * R[r]
pivots.append(c)
r += 1
return np.round(R, 10) + 0.0, pivots
def main() -> None:
np.set_printoptions(precision=4, suppress=True)
A = np.array([[1, 2, 2, 2], [2, 4, 6, 8], [3, 6, 8, 10]], dtype=float)
# 在 A 右边并排放一个单位矩阵:消元对 b 做的事,都记在这三列里
R, pivots = rref(np.hstack([A, np.eye(3)]))
R_A, E = R[:, :4], R[:, 4:]
print("R =")
print(R_A)
print("A 的主列:", [c for c in pivots if c < 4])
print("E @ A 等于 R:", np.allclose(E @ A, R_A))
# R 的零行对应的那一行 E,就是“行的组合给出零行”的系数
y = E[2]
print("y =", y, ",y @ A =", np.round(y @ A, 10) + 0.0)
for b in ([1.0, 5.0, 6.0], [1.0, 5.0, 17.0]):
b = np.array(b)
print(f"b = {b},y @ b = {y @ b:.1f},可解:{np.isclose(y @ b, 0)}")
if __name__ == "__main__":
main()
R =
[[ 1. 2. 0. -2.]
[ 0. 0. 1. 2.]
[ 0. 0. 0. 0.]]
A 的主列: [0, 2]
E @ A 等于 R: True
y = [ 1. 1. -1.] ,y @ A = [0. 0. 0. 0.]
b = [1. 5. 6.],y @ b = 0.0,可解:True
b = [ 1. 5. 17.],y @ b = -11.0,可解:False

RR 的第三行是零行,主列是第 1 列和第 3 列,所以秩是 2。EE 的最后一行 y=(1,1,−1)\mathbf{y} = (1, 1, -1) 满足 y⊤A=0\mathbf{y}^\top A = \mathbf{0},也就是他说的“某个行的组合给出零行”。同一个组合作用在 b\mathbf{b} 上,y⊤b=b1+b2−b3\mathbf{y}^\top \mathbf{b} = b_1 + b_2 - b_3:对 (1,5,6)(1, 5, 6) 是 0,有解;对 (1,5,17)(1, 5, 17) 是 −11-11,无解。和他在黑板上说的一致。

他把可解条件用了两种语言说出来。一种是列空间的语言:b\mathbf{b} 恰好在 AA 的列空间里时有解。另一种是行的语言:若行的某个组合给出零行,则 b\mathbf{b} 的同一个组合必须是零。他说这两句话等价并不显然,但它们都等价于“方程组有解”,所以必须等价。(这个论证偷了点懒:不证明,只指出两边都等于同一个东西。我猜后面讲四个基本子空间的时候会回到这里。)

特解加零空间#

假设 b=(1,5,6)\mathbf{b} = (1, 5, 6),有解。怎么找?他的算法只有两步,第一步找一个特解 xp\mathbf{x}_p:

  1. 把所有自由变量设为 0。
  2. 解主变量。

对这个例子,自由列是第 2 列和第 4 列,所以 x2=x4=0x_2 = x_4 = 0,方程只剩下主列:x1+2x3=1x_1 + 2x_3 = 1 与 2x3=32x_3 = 3。回代得 x3=32x_3 = \frac32,x1=1−2⋅32=−2x_1 = 1 - 2 \cdot \frac32 = -2,所以 xp=(−2,0,32,0)\mathbf{x}_p = (-2, 0, \frac32, 0)。他特意说:做测验时请把它代回原方程验一下,这是好习惯。

第二步,加上零空间。上一讲的两个特解是 (−2,1,0,0)(-2, 1, 0, 0) 和 (2,0,−2,1)(2, 0, -2, 1)。他在黑板上一开始没记清,凭方程当场推了一遍,最后确认:第二个特解里的 22、−2-2、11 对得上。所以完全解是

x=xp+xn=[−20320]+c1[−2100]+c2[20−21]\mathbf{x} = \mathbf{x}_p + \mathbf{x}_n = \begin{bmatrix} -2 \\ 0 \\ \frac32 \\ 0 \end{bmatrix} + c_1 \begin{bmatrix} -2 \\ 1 \\ 0 \\ 0 \end{bmatrix} + c_2 \begin{bmatrix} 2 \\ 0 \\ -2 \\ 1 \end{bmatrix}

理由一句话就够:Axp=bA\mathbf{x}_p = \mathbf{b},Axn=0A\mathbf{x}_n = \mathbf{0},两个加起来 A(xp+xn)=b+0=bA(\mathbf{x}_p + \mathbf{x}_n) = \mathbf{b} + \mathbf{0} = \mathbf{b}。(零空间对 AA 来说像调音台上被静音的旋钮:怎么拧,输出都不变。)

xp\mathbf{x}_p 前面有没有系数 cc? 没有。xp\mathbf{x}_p 是一个具体的解,我不能把它乘 3,因为 A(3xp)=3b≠bA(3\mathbf{x}_p) = 3\mathbf{b} \ne \mathbf{b}。零空间里的向量可以随便乘、随便加,因为它们总是给出 0\mathbf{0}。

用代码把这几句话都过一遍。我在 [A b][A\ \mathbf{b}] 上做消元,最后一列 d\mathbf{d} 就是消元后的右端项,xp\mathbf{x}_p 的主变量直接从 d\mathbf{d} 里读;特解矩阵 NN 的每一列由自由列 FF 取负填进去。然后随机抽几组 cc 看 xp+Nc\mathbf{x}_p + N\mathbf{c} 是不是解,最后和 np.linalg.lstsq 对照:

import numpy as np
def rref(M: np.ndarray, tol: float = 1e-10) -> tuple[np.ndarray, list[int]]:
"""化成行最简形,返回 R 和主列下标。"""
R = M.astype(float).copy()
rows, cols = R.shape
pivots: list[int] = []
r = 0
for c in range(cols):
if r == rows:
break
p = r + int(np.argmax(np.abs(R[r:, c])))
if abs(R[p, c]) < tol:
continue
R[[r, p]] = R[[p, r]]
R[r] /= R[r, c]
for i in range(rows):
if i != r:
R[i] -= R[i, c] * R[r]
pivots.append(c)
r += 1
return np.round(R, 10) + 0.0, pivots
def main() -> None:
np.set_printoptions(precision=4, suppress=True)
rng = np.random.default_rng(1806)
A = np.array([[1, 2, 2, 2], [2, 4, 6, 8], [3, 6, 8, 10]], dtype=float)
b = np.array([1.0, 5.0, 6.0])
m, n = A.shape
# 对 [A b] 做消元,最后一列就是消元后的右端项 d
Rb, pivots = rref(np.hstack([A, b[:, None]]))
pivots = [c for c in pivots if c < n]
free = [c for c in range(n) if c not in pivots]
d = Rb[:, n]
print("[R d] =")
print(Rb)
print("主列:", pivots, ",自由列:", free)
# 特解:自由变量取 0,主变量直接读 d
x_p = np.zeros(n)
x_p[pivots] = d[: len(pivots)]
print("x_p =", x_p, ",A @ x_p = b:", np.allclose(A @ x_p, b))
# 零空间:每个自由变量取 1,其余自由变量取 0,主变量取 -F 的对应列
N = np.zeros((n, len(free)))
for k, c in enumerate(free):
N[c, k] = 1.0
N[pivots, k] = -Rb[: len(pivots), c]
N = N + 0.0
print("N =")
print(N)
print("A @ N = 0:", np.allclose(A @ N, 0))
# 完全解:x_p 加上任意的零空间向量
for _ in range(3):
c = rng.standard_normal(len(free))
x = x_p + N @ c
print("c =", c, ",A @ x = b:", np.allclose(A @ x, b))
# 解集不是子空间:2 * x_p 不再是解
print("A @ (2 * x_p) =", A @ (2 * x_p), ",不等于 b")
# 对照:lstsq 给出所有解里范数最小的那一个
x_min = np.linalg.lstsq(A, b, rcond=None)[0]
print("lstsq 解 =", x_min, ",A @ x = b:", np.allclose(A @ x_min, b))
print(f"|x_p| = {np.linalg.norm(x_p):.4f}")
print(f"|x_min| = {np.linalg.norm(x_min):.4f}")
if __name__ == "__main__":
main()
[R d] =
[[ 1. 2. 0. -2. -2. ]
[ 0. 0. 1. 2. 1.5]
[ 0. 0. 0. 0. 0. ]]
主列: [0, 2] ,自由列: [1, 3]
x_p = [-2. 0. 1.5 0. ] ,A @ x_p = b: True
N =
[[-2. 2.]
[ 1. 0.]
[ 0. -2.]
[ 0. 1.]]
A @ N = 0: True
c = [ 0.6679 -0.2323] ,A @ x = b: True
c = [-0.284 -0.5004] ,A @ x = b: True
c = [-0.0221 -1.0333] ,A @ x = b: True
A @ (2 * x_p) = [ 2. 10. 12.] ,不等于 b
lstsq 解 = [-0.1379 -0.2759 0.1897 0.6552] ,A @ x = b: True
|x_p| = 2.5000
|x_min| = 0.7486

[R d][R\ \mathbf{d}] 的第三行是 0=00 = 0,所以方程没问题;d=(−2,1.5,0)\mathbf{d} = (-2, 1.5, 0) 的前两个数就是主变量 x1x_1、x3x_3 的值,xp=(−2,0,1.5,0)\mathbf{x}_p = (-2, 0, 1.5, 0) 和黑板上一样。NN 的两列是 (−2,1,0,0)(-2, 1, 0, 0) 和 (2,0,−2,1)(2, 0, -2, 1),和他当场推的那两个一致,AN=0AN = 0 通过。三组随机的 cc 全部给出解,而 2xp2\mathbf{x}_p 给出的是 (2,10,12)(2, 10, 12),不是 b\mathbf{b}。

lstsq 也给了一个解,但它是另一个:(−0.1379,−0.2759,0.1897,0.6552)(-0.1379, -0.2759, 0.1897, 0.6552)。它是所有解里长度最小的那个,∥xmin⁡∥=0.7486\|\mathbf{x}_{\min}\| = 0.7486,比我手算的 xp\mathbf{x}_p 的 ∥xp∥=2.5000\|\mathbf{x}_p\| = 2.5000 短了约 3.3 倍。两者都在同一个“解的平面”上,只相差一个零空间里的向量。选自由变量为 0 只是“最方便”,不是“最短”;这个差别要到第 33 讲讲伪逆的时候才会派上用场。

解集长什么样? 他打算画出所有解的集合。四个未知数就是四维空间,黑板只有两维,他先说了一句 Einstein 能画,然后画了四条垂直的轴。结论比图好懂:零空间是 R4\mathbb{R}^4 里的一个二维子空间(两个自由参数),完全解集是把它整体平移,平移到穿过 xp\mathbf{x}_p。它很像子空间,但不过原点(x=0\mathbf{x} = \mathbf{0} 不是解,因为 A0=0≠bA\mathbf{0} = \mathbf{0} \ne \mathbf{b}),所以不是子空间。他说着说着把“它是个子空间”改口成“它像个子空间,只是被移开了原点”,我觉得这个改口比任何定义都清楚。

秩决定一切#

后半讲他退一步,看一般情形:m×nm \times n 矩阵,秩为 rr。他先问了 rr 与 mm、nn 的关系:r≤mr \le m(每行至多一个主元),r≤nr \le n(每列至多一个主元)。然后问最有意思的情形:rr 取到上限,也就是满秩。

满列秩 r=nr = n。 每列都有主元,没有自由变量,零空间只有零向量。如果有解,完全解就是 xp\mathbf{x}_p,没有第二项,所以解是唯一的;但不一定有解,因为行数多于列数,会出现零行,b\mathbf{b} 要满足条件。他的例子是又高又瘦的

A=[13216151]A = \begin{bmatrix} 1 & 3 \\ 2 & 1 \\ 6 & 1 \\ 5 & 1 \end{bmatrix}

秩是 2,RR 是上面一个 2×22 \times 2 的单位矩阵、下面两行零。四个方程两个未知数,随便取一个 b\mathbf{b} 大概率没解;但如果取成两列之和 (4,3,7,6)(4, 3, 7, 6),那解就是 (1,1)(1, 1),而且是唯一解。

满行秩 r=mr = m。 每行都有主元,消元不会出零行,对 b\mathbf{b} 没有任何条件,所以任何 b\mathbf{b} 都有解。自由变量有 n−r=n−mn - r = n - m 个,所以有无穷多个解。例子他是把上面那个矩阵转置:

A=[12653111]A = \begin{bmatrix} 1 & 2 & 6 & 5 \\ 3 & 1 & 1 & 1 \end{bmatrix}

秩 2,RR 是 [I F][I\ F] 的形状,FF 是自由列。他在这里卡了一下:主列不一定排在前面,所以 II 和 FF 可能是交错的,不能总写成左边一块 II、右边一块 FF。他发现自己写错了,当场改了过来,这一段比标准答案更有教益。

满秩的方阵 r=m=nr = m = n。 这是第二章的情形:R=IR = I,零空间只有零向量,对每个 b\mathbf{b} 恰有一个解,也就是可逆矩阵。他的例子是 [1231]\begin{bmatrix} 1 & 2 \\ 3 & 1 \end{bmatrix}。

其余情形 r<mr < m 且 r<nr < n。 RR 是 [IF00]\begin{bmatrix} I & F \\ 0 & 0 \end{bmatrix},有零行,所以 b\mathbf{b} 要满足条件才有解;有自由列,所以有解就有无穷多个。我们的 3 × 4 例子就属于这类。

他把四种情形写在黑板上的表,我整理成这样:

情形RR 的形状零空间解的个数
r=m=nr = m = nII只有 0\mathbf{0}恰好 1 个
r=n<mr = n < m[I0]\begin{bmatrix} I \\ 0 \end{bmatrix}只有 0\mathbf{0}0 个或 1 个
r=m<nr = m < n[IF]\begin{bmatrix} I & F \end{bmatrix}n−rn - r 维无穷多个
r<mr < m 且 r<nr < n[IF00]\begin{bmatrix} I & F \\ 0 & 0 \end{bmatrix}n−rn - r 维0 个或无穷多个

四个矩阵都交给 NumPy。对每个矩阵,我抽 1000 个随机的 b\mathbf{b},数有多少个在列空间里(判据是:把 b\mathbf{b} 并到 AA 右边之后秩不变):

import numpy as np
def main() -> None:
np.set_printoptions(precision=4, suppress=True)
rng = np.random.default_rng(1806)
cases = {
"r = m = n(方阵,可逆)": np.array([[1.0, 2.0], [3.0, 1.0]]),
"r = n < m(又高又瘦)": np.array(
[[1.0, 3.0], [2.0, 1.0], [6.0, 1.0], [5.0, 1.0]]
),
"r = m < n(又矮又胖)": np.array(
[[1.0, 2.0, 6.0, 5.0], [3.0, 1.0, 1.0, 1.0]]
),
"r < m 且 r < n": np.array(
[[1.0, 2.0, 2.0, 2.0], [2.0, 4.0, 6.0, 8.0], [3.0, 6.0, 8.0, 10.0]]
),
}
trials = 1000
for name, A in cases.items():
m, n = A.shape
r = np.linalg.matrix_rank(A)
solvable = 0
for _ in range(trials):
b = rng.standard_normal(m)
# b 在列空间里,等价于加上 b 之后秩不变
aug = np.hstack([A, b[:, None]])
solvable += np.linalg.matrix_rank(aug) == r
print(f"{name}:m = {m},n = {n},r = {r},自由变量 {n - r} 个")
print(f" 随机 b 有解的比例:{solvable / trials:.3f}")
# 高瘦矩阵:挑一个在列空间里的 b,解唯一
A = cases["r = n < m(又高又瘦)"]
b = A[:, 0] + A[:, 1]
x = np.linalg.lstsq(A, b, rcond=None)[0]
print("b =", b, ",解 x =", x, ",A @ x = b:", np.allclose(A @ x, b))
if __name__ == "__main__":
main()
r = m = n(方阵,可逆):m = 2,n = 2,r = 2,自由变量 0 个
随机 b 有解的比例:1.000
r = n < m(又高又瘦):m = 4,n = 2,r = 2,自由变量 0 个
随机 b 有解的比例:0.000
r = m < n(又矮又胖):m = 2,n = 4,r = 2,自由变量 2 个
随机 b 有解的比例:1.000
r < m 且 r < n:m = 3,n = 4,r = 2,自由变量 2 个
随机 b 有解的比例:0.000
b = [4. 3. 7. 6.] ,解 x = [1. 1.] ,A @ x = b: True

表里的“0 个或 1 个”“0 个或无穷多个”,在这里变成了两个干净的数字。r=mr = m 的两行(方阵、又矮又胖),随机 b\mathbf{b} 有解的比例是 1.000;r<mr < m 的两行(又高又瘦、r<mr < m 且 r<nr < n),比例是 0.000。1000 次一次都没有撞上,这并不奇怪:列空间是 Rm\mathbb{R}^m 里的一个真子空间(4 维空间里的一个平面,或 3 维空间里的一个平面),随机向量落在上面的概率是 0。要想有解,b\mathbf{b} 必须由我挑,就像最后一行里的 b=(4,3,7,6)\mathbf{b} = (4, 3, 7, 6),解 (1,1)(1, 1) 唯一。

再看自由变量的个数:r=nr = n 的两行是 0 个,r<nr < n 的两行都是 2 个。把“有解吗”(看 rr 和 mm)与“解几个”(看 rr 和 nn)合在一起,就是他在最后一句话里说的:秩告诉你关于解的个数的全部信息,唯一不知道的是解的具体数值,那要回到矩阵本身去算。

这一讲他说“二维子空间”“两个独立的自由常数”的时候,其实已经在用“维数”这个还没定义的词了,他自己也说下次再讲。下一讲就把“线性无关”“基”“维数”补上,见 18.06 第 9 讲:线性无关、基与维数。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
18.06 第 8 讲:解 Ax = b,行最简形 R
https://bfmhno3.github.io/posts/linear-algebra-08-solving-ax-b/
作者
bfmhno3
发布于
2026-10-18
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
18.06 第 7 讲:解 Ax = 0,主变量与特解
NoteMIT 18.06 第 7 讲的配套笔记:我用 Python 3.13 和 NumPy 2.4 手写了带容差的 rref,把 Strang 的 3 × 4 矩阵化成 R 并读出特解矩阵 N,A @ N 为 0;容差设成 0 时,一个按构造秩为 3 的 6 × 8 矩阵被判成秩 6,零空间只剩 2 维,而不是 5 维。
2
18.06 第 28 讲:相似矩阵与 Jordan 标准形
NoteMIT 18.06 第 28 讲的配套笔记:我用 Python 3.13 和 NumPy 2.4 验证了相似矩阵的特征值相同,再给 4 阶 Jordan 块加了 1e-10 的扰动,特征值就跑到了模长 3.16e-03 的位置。
3
18.06 第 1 讲:方程组的行图与列图
NoteMIT 18.06 第 1 讲的配套笔记:我用 Python 3.13 和 NumPy 2.4 把 2 × 2 与 3 × 3 方程组分别按行图、列图和 A @ x 解了一遍,再把第三列换成前两列之和,秩从 3 掉到 2,最近的可达点与 b 差了 0.4082。
4
18.06 第 34 讲:期末复习
NoteMIT 18.06 第 34 讲的配套笔记:我用 Python 3.13 和 NumPy 2.4 把 Strang 期末复习课上的每道题都算了一遍,Markov 矩阵从 (0, 10, 0) 出发迭代 10 步,离稳态 (3, 3, 4) 只剩 7.24e-07。
5
18.06 第 32 讲:第三次测验复习
NoteMIT 18.06 第 32 讲的配套笔记:我用 Python 3.13 和 NumPy 2.4 把 Strang 复习课里的反对称矩阵、特征值判断题、SVD 的符号问题和“对称又正交”的真假题逐一验证,SVD 的 U 有 4 种符号选法,只有 1 种能还原 A。
随机文章随机推荐

评论区

Profile Image of the Author
bfmhno3
Hello, I'm bfmhno3.
公告
本站曾使用 Jekyll + Minimal Mistakes 主题,现已迁移至 Astro + Firefly。博客内容未变,但文章链接有所调整,请自行查找需要的文章。
分类
标签
最新动态
站点统计
文章
123
分类
2
标签
239
总字数
753,253
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录