Skip to content

第 5 章 线性组合、相关与无关

学习目标

  • 掌握线性组合的定义
  • 理解张成空间(span)的几何意义
  • 掌握线性相关与线性无关的定义与判定
  • 会用解方程组的方法判断向量组是否无关
  • 理解「无关的向量组,线性组合表示唯一」,为第 11 章「基」打基础

5.1 线性组合:放大之后相加

第 3 章学了两种运算:数乘(放大/翻转)与加法(合成)。把这两种运算组合起来,就得到线性代数里最重要的一组词:

线性组合:给定向量 和数 ,

叫做这些向量的一个线性组合;数 组合系数

例:,那么

线性组合

生活里到处是线性组合:菜谱把「1 份土豆 + 2 份牛肉」按比例混合;颜色把红、绿、蓝三个分量按亮度混合成任意颜色;速度把「向右 2 m/s + 向上 3 m/s」合成斜向速度。线性组合的直觉就是:用若干「基础材料」,按不同比例,配出新的东西

python
import matplotlib.pyplot as plt
from matplotlib import font_manager
for f in font_manager.findSystemFonts():
    if any(k in f for k in ("NotoSansCJK", "NotoSansSC", "wqy", "SimHei", "msyh", "PingFang")):
        font_manager.fontManager.addfont(f)
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC", "WenQuanYi Zen Hei", "SimHei", "Microsoft YaHei", "PingFang SC"]
plt.rcParams["axes.unicode_minus"] = False

import numpy as np

u = np.array([1.0, 2.0])
w = np.array([3.0, 1.0])

fig, ax = plt.subplots(figsize=(7, 6))
ax.axhline(0, color="black", linewidth=1)
ax.axvline(0, color="black", linewidth=1)
ax.grid(True, linestyle=":", alpha=0.5)
ax.set_xlim(-0.5, 12.5)
ax.set_ylim(-0.5, 8.5)
ax.set_aspect("equal")

def arrow(vec, start, color, label, offset=(6, 4)):
    ax.quiver(start[0], start[1], vec[0], vec[1],
              angles="xy", scale_units="xy", scale=1, color=color, width=0.012)
    ax.annotate(label, start + vec, textcoords="offset points", xytext=offset, color=color)

arrow(2 * u, np.array([0.0, 0.0]), "tab:blue", "2u")
arrow(3 * w, np.array([0.0, 0.0]), "tab:green", "3w")
arrow(3 * w, 2 * u, "tab:green", "3w(平移)")          # 首尾相接
arrow(2 * u + 3 * w, np.array([0.0, 0.0]), "tab:red", "2u + 3w", offset=(-30, 8))

ax.set_title("线性组合:2u + 3w = (11, 7)")
fig.savefig("book/public/figs/fig05-combination.png", dpi=120, bbox_inches="tight")
plt.close(fig)

NumPy 计算:

python
import numpy as np

u = np.array([1.0, 2.0])
w = np.array([3.0, 1.0])
result = 2 * u + 3 * w
print("2u + 3w =", result)

运行输出:

text
2u + 3w = [11.  7.]

5.2 张成空间:所有能配出来的东西

张成空间(span):向量组 的所有线性组合,组成的集合,记作

换个说法:拿着这些「基础材料」,任意改变比例,能配出的所有向量,就是它们的张成空间。

张成空间

二维平面里:

python
import matplotlib.pyplot as plt
from matplotlib import font_manager
for f in font_manager.findSystemFonts():
    if any(k in f for k in ("NotoSansCJK", "NotoSansSC", "wqy", "SimHei", "msyh", "PingFang")):
        font_manager.fontManager.addfont(f)
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC", "WenQuanYi Zen Hei", "SimHei", "Microsoft YaHei", "PingFang SC"]
plt.rcParams["axes.unicode_minus"] = False

import numpy as np

fig, axes = plt.subplots(1, 2, figsize=(12, 5.5))

v = np.array([2.0, 1.0])
u = np.array([1.0, 2.0])
w = np.array([3.0, 1.0])

# 左图:一个向量的张成 = 过原点的直线
ax = axes[0]
ax.axhline(0, color="black", linewidth=1)
ax.axvline(0, color="black", linewidth=1)
t = np.linspace(-3, 3, 100)
ax.plot(t * v[0], t * v[1], color="tab:orange", linewidth=3, label="span{v}")
ax.quiver(0, 0, v[0], v[1], angles="xy", scale_units="xy", scale=1,
          color="tab:red", width=0.02)
ax.annotate("v", v / 2, textcoords="offset points", xytext=(6, 4), color="tab:red", fontsize=13)
ax.set_xlim(-7, 7)
ax.set_ylim(-4, 4)
ax.set_aspect("equal")
ax.grid(True, linestyle=":", alpha=0.5)
ax.set_title("一个向量:张成一条直线")
ax.legend()

# 右图:两个不共线向量的张成 = 整个平面
ax = axes[1]
ax.axhline(0, color="black", linewidth=1)
ax.axvline(0, color="black", linewidth=1)
# 用平行四边形网格表示「铺满平面」
for a in range(-3, 4):
    for b in range(-3, 4):
        p = a * u + b * w
        ax.scatter([p[0]], [p[1]], color="tab:blue", s=12, alpha=0.8)
ax.quiver(0, 0, u[0], u[1], angles="xy", scale_units="xy", scale=1,
          color="tab:red", width=0.02)
ax.quiver(0, 0, w[0], w[1], angles="xy", scale_units="xy", scale=1,
          color="tab:green", width=0.02)
ax.annotate("u", u / 2, textcoords="offset points", xytext=(6, 4), color="tab:red", fontsize=13)
ax.annotate("w", w / 2, textcoords="offset points", xytext=(6, 4), color="tab:green", fontsize=13)
ax.set_xlim(-9, 9)
ax.set_ylim(-9, 9)
ax.set_aspect("equal")
ax.grid(True, linestyle=":", alpha=0.5)
ax.set_title("两个不共线向量:张成整个平面")

fig.savefig("book/public/figs/fig05-span.png", dpi=120, bbox_inches="tight")
plt.close(fig)
  1. 一个非零向量 :所有 是一条过原点的直线;
  2. 两个不共线的向量 :所有 铺满整个平面;
  3. 两个共线的向量:仍然只是一条直线,第二个向量「白搭」;
  4. 两个向量里有一个是零向量:也只有一条直线(零向量本身不含方向)。

「能不能铺满整个平面」,取决于这些向量里有没有多余的(线性相关的)成员——这正是下一节的主题。

5.3 线性相关与线性无关

线性相关:存在一组不全为 0 的系数 ,使得

线性无关:只有当 时,上面的等式才成立。

定义有点绕,但几何含义非常直观:线性相关,说明至少一个向量是「多余的」——它能被其他向量线性组合出来;线性无关,说明每个向量都提供了新的方向,谁也替代不了谁。

为什么「相关」等价于「有冗余」?假设

移到等号另一边再除以 :

被表示成了其余向量的线性组合——它确实多余。

线性相关与无关

二维里的判定规则:

python
import matplotlib.pyplot as plt
from matplotlib import font_manager
for f in font_manager.findSystemFonts():
    if any(k in f for k in ("NotoSansCJK", "NotoSansSC", "wqy", "SimHei", "msyh", "PingFang")):
        font_manager.fontManager.addfont(f)
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC", "WenQuanYi Zen Hei", "SimHei", "Microsoft YaHei", "PingFang SC"]
plt.rcParams["axes.unicode_minus"] = False

import numpy as np

fig, axes = plt.subplots(1, 2, figsize=(12, 5.5))

def setup(ax, lim=7):
    ax.axhline(0, color="black", linewidth=1)
    ax.axvline(0, color="black", linewidth=1)
    ax.grid(True, linestyle=":", alpha=0.5)
    ax.set_xlim(-lim, lim)
    ax.set_ylim(-lim, lim)
    ax.set_aspect("equal")

# 左图:共线 = 相关
ax = axes[0]
setup(ax)
v1 = np.array([2.0, 1.0])
v2 = 2 * v1
t = np.linspace(-3, 3, 100)
ax.plot(t * v1[0], t * v1[1], color="gray", linestyle="--")
for v, c, label in [(v1, "tab:red", "v1"), (v2, "tab:blue", "v2 = 2v1")]:
    ax.quiver(0, 0, v[0], v[1], angles="xy", scale_units="xy", scale=1,
              color=c, width=0.02)
    ax.annotate(label, v / 2, textcoords="offset points", xytext=(8, 4), color=c, fontsize=12)
ax.set_title("共线:线性相关")

# 右图:不共线 = 无关
ax = axes[1]
setup(ax)
u = np.array([3.0, 1.0])
w = np.array([1.0, 3.0])
for v, c, label in [(u, "tab:red", "u"), (w, "tab:blue", "w")]:
    ax.quiver(0, 0, v[0], v[1], angles="xy", scale_units="xy", scale=1,
              color=c, width=0.02)
    ax.annotate(label, v / 2, textcoords="offset points", xytext=(8, 4), color=c, fontsize=12)
# 画一个平行四边形示意两个方向
ax.plot([u[0], u[0] + w[0]], [u[1], u[1] + w[1]], color="gray", linestyle="--")
ax.plot([w[0], u[0] + w[0]], [w[1], u[1] + w[1]], color="gray", linestyle="--")
ax.set_title("不共线:线性无关")

fig.savefig("book/public/figs/fig05-collinear.png", dpi=120, bbox_inches="tight")
plt.close(fig)
  • 两个向量共线(在同一条过原点的直线上)⟺ 线性相关;
  • 两个向量不共线 ⟺ 线性无关;
  • 向量组含有零向量 ⟺ 线性相关(零向量那项系数取 1,其余取 0 即可);
  • 超过 2 个二维向量,一定线性相关(平面只有两个独立方向)。

5.4 用解方程组判定线性无关

把定义翻译成计算。问向量 是否无关,就是问方程

是否只有零解

例 1:。显然

系数 不全为 0,所以线性相关,且

例 2:。假设

按分量写成两个方程:

由第一个方程 ,代入第二个方程:

只有零解,所以 线性无关。

用 NumPy 解方程组验证。把方程写成矩阵形式 ,其中 的列是 :

python
import numpy as np

# 列向量按列排成矩阵:v1 = (1,2), v2 = (3,1)
A = np.array([[1.0, 3.0],
              [2.0, 1.0]])

# A c = 0:求 c
c = np.linalg.solve(A, np.zeros(2))
print("唯一解(应全为 0):", c)

# 再看相关例子:v1=(1,2), v2=(2,4)
B = np.array([[1.0, 2.0],
              [2.0, 4.0]])
print("B 的行列式(预告第 9 章):", np.linalg.det(B))

运行输出:

text
唯一解(应全为 0): [0. 0.]
B 的行列式(预告第 9 章): 0.0

这里提前剧透两件事:

  1. 解方程组 是第 8 章的主角;
  2. 行列式为 0 与「线性相关」有密切关系,第 9 章会严格证明。

三维里同样处理。 无关(三个互相垂直的方向); 相关,因为

5.5 无关 ⟹ 表示唯一

线性无关还有一个极其重要的推论,它是第 11 章「基」的基石:

定理:若 线性无关,则 中每一个向量,写成它们的线性组合的方式唯一

证明(反证法):假设某个向量 有两种表示:

两式相减:

因为 无关,只有全零解,所以 ——两种表示其实是同一种。证毕。

反过来说,如果向量组相关,表示就不唯一:比如 时,零向量既可以写成 ,也可以写成

「坐标」之所以有意义,正是因为坐标系的那组基是线性无关的:同一个点只有一个坐标,不会有两个答案。

动手实践

  1. 写出 的结果并画图:
  2. 判断下列向量组是否线性相关,并说明理由:
  3. 用 5.4 的方法(列方程组)判断 是否无关,再用 np.linalg.solve 验证。
  4. 画三个向量:,观察 是否在 所在直线上。

常见错误

错误写法/理解原因
认为「线性组合」里的系数必须是整数或正数系数可以是任意实数,包括负数、分数、0
认为只要有一个向量是另一个的倍数就一定无关恰好相反:成倍数就是共线,就是相关
把「相关」理解成「向量之间有夹角」相关是「有冗余」:一个向量能被其余向量组合出来
认为 3 个二维向量一定无关二维最多两个独立方向,3 个二维向量必相关
把零向量当「无关」含零向量的向量组必相关(取 )

章末练习

基础

  1. 计算线性组合:
  2. 判断 是否相关;若是,写出一个不全为 0 的系数组合使它们合成零向量。
  3. 用文字描述 在平面上是什么图形。

提高

  1. 判断 是否线性无关?提示:先看前两个是否无关,再判断第三个能否被前两个组合出来。
  2. 无关,证明 也无关。

挑战

  1. 判断三维向量 是否线性无关:列出三个方程,消元求解,并把系数写成矩阵用 np.linalg.solve 验证。
  2. 证明:若向量组 线性相关,则其中至少有一个向量能表示成其余向量的线性组合(提示:取非零系数对应的向量)。

章末自测

    • A.
    • B.
    • C.
    • D.
  1. 下列哪组向量线性相关?
    • A.
    • B.
    • C.
    • D.
  2. 是?
    • A. 一条直线
    • B. 整个平面
    • C. 一个点
    • D. 一条抛物线
  3. 线性相关意味着?
    • A. 向量组中至少有一个向量是多余的
    • B. 所有向量都互相垂直
    • C. 向量个数超过 1
    • D. 所有向量长度相等
  4. 含零向量的向量组一定?
    • A. 线性无关
    • B. 线性相关
    • C. 无法判断
    • D. 张成整个平面
  5. 无关,则方程 的解是?
    • A. 唯一解
    • B. 无穷多解
    • C. 无解
    • D.
  6. 二维平面里,最多有几个线性无关的向量?
    • A. 1 个
    • B. 2 个
    • C. 3 个
    • D. 无限个
  7. 下列哪个向量组张成整个平面?
    • A.
    • B.
    • C.
    • D.
  8. 若向量 有唯一线性组合表示,则该向量组?
    • A. 线性相关
    • B. 线性无关
    • C. 含有零向量
    • D. 无法判断
  9. 的张成空间是?
    • A. 三维空间
    • B. 平面(一个二维平面)
    • C.
    • D. 一个点