第 5 章 线性组合、相关与无关
学习目标
- 掌握线性组合的定义
- 理解张成空间(span)的几何意义
- 掌握线性相关与线性无关的定义与判定
- 会用解方程组的方法判断向量组是否无关
- 理解「无关的向量组,线性组合表示唯一」,为第 11 章「基」打基础
5.1 线性组合:放大之后相加
第 3 章学了两种运算:数乘(放大/翻转)与加法(合成)。把这两种运算组合起来,就得到线性代数里最重要的一组词:
线性组合:给定向量 和数 ,
叫做这些向量的一个线性组合;数 叫组合系数。
例:、,那么

生活里到处是线性组合:菜谱把「1 份土豆 + 2 份牛肉」按比例混合;颜色把红、绿、蓝三个分量按亮度混合成任意颜色;速度把「向右 2 m/s + 向上 3 m/s」合成斜向速度。线性组合的直觉就是:用若干「基础材料」,按不同比例,配出新的东西。
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 计算:
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)运行输出:
2u + 3w = [11. 7.]5.2 张成空间:所有能配出来的东西
张成空间(span):向量组 的所有线性组合,组成的集合,记作
换个说法:拿着这些「基础材料」,任意改变比例,能配出的所有向量,就是它们的张成空间。

二维平面里:
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)- 一个非零向量 :所有 是一条过原点的直线;
- 两个不共线的向量 、:所有 铺满整个平面;
- 两个共线的向量:仍然只是一条直线,第二个向量「白搭」;
- 两个向量里有一个是零向量:也只有一条直线(零向量本身不含方向)。
「能不能铺满整个平面」,取决于这些向量里有没有多余的(线性相关的)成员——这正是下一节的主题。
5.3 线性相关与线性无关
线性相关:存在一组不全为 0 的系数 ,使得
线性无关:只有当 时,上面的等式才成立。
定义有点绕,但几何含义非常直观:线性相关,说明至少一个向量是「多余的」——它能被其他向量线性组合出来;线性无关,说明每个向量都提供了新的方向,谁也替代不了谁。
为什么「相关」等价于「有冗余」?假设 且
把 移到等号另一边再除以 :
被表示成了其余向量的线性组合——它确实多余。

二维里的判定规则:
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 解方程组验证。把方程写成矩阵形式 ,其中 的列是 :
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))运行输出:
唯一解(应全为 0): [0. 0.]
B 的行列式(预告第 9 章): 0.0这里提前剧透两件事:
- 解方程组 是第 8 章的主角;
- 行列式为 0 与「线性相关」有密切关系,第 9 章会严格证明。
三维里同样处理。、、 无关(三个互相垂直的方向); 与 相关,因为 。
5.5 无关 ⟹ 表示唯一
线性无关还有一个极其重要的推论,它是第 11 章「基」的基石:
定理:若 线性无关,则 中每一个向量,写成它们的线性组合的方式唯一。
证明(反证法):假设某个向量 有两种表示:
两式相减:
因为 无关,只有全零解,所以 ——两种表示其实是同一种。证毕。
反过来说,如果向量组相关,表示就不唯一:比如 时,零向量既可以写成 ,也可以写成 。
「坐标」之所以有意义,正是因为坐标系的那组基是线性无关的:同一个点只有一个坐标,不会有两个答案。
动手实践
- 写出 的结果并画图:、、。
- 判断下列向量组是否线性相关,并说明理由:
- 与
- 与
- 与 与
- 与
- 用 5.4 的方法(列方程组)判断 与 是否无关,再用
np.linalg.solve验证。 - 画三个向量:、、,观察 是否在 所在直线上。
常见错误
| 错误写法/理解 | 原因 |
|---|---|
| 认为「线性组合」里的系数必须是整数或正数 | 系数可以是任意实数,包括负数、分数、0 |
| 认为只要有一个向量是另一个的倍数就一定无关 | 恰好相反:成倍数就是共线,就是相关 |
| 把「相关」理解成「向量之间有夹角」 | 相关是「有冗余」:一个向量能被其余向量组合出来 |
| 认为 3 个二维向量一定无关 | 二维最多两个独立方向,3 个二维向量必相关 |
| 把零向量当「无关」 | 含零向量的向量组必相关(取 ) |
章末练习
基础
- 计算线性组合:、。
- 判断 与 是否相关;若是,写出一个不全为 0 的系数组合使它们合成零向量。
- 用文字描述 在平面上是什么图形。
提高
- 判断 、、 是否线性无关?提示:先看前两个是否无关,再判断第三个能否被前两个组合出来。
- 若 无关,证明 与 也无关。
挑战
- 判断三维向量 、、 是否线性无关:列出三个方程,消元求解,并把系数写成矩阵用
np.linalg.solve验证。 - 证明:若向量组 线性相关,则其中至少有一个向量能表示成其余向量的线性组合(提示:取非零系数对应的向量)。
章末自测
- A.
- B.
- C.
- D.
- 下列哪组向量线性相关?
- A. 、
- B. 、
- C. 、
- D. 、
- 是?
- A. 一条直线
- B. 整个平面
- C. 一个点
- D. 一条抛物线
- 线性相关意味着?
- A. 向量组中至少有一个向量是多余的
- B. 所有向量都互相垂直
- C. 向量个数超过 1
- D. 所有向量长度相等
- 含零向量的向量组一定?
- A. 线性无关
- B. 线性相关
- C. 无法判断
- D. 张成整个平面
- 若 无关,则方程 的解是?
- A. 唯一解
- B. 无穷多解
- C. 无解
- D.
- 二维平面里,最多有几个线性无关的向量?
- A. 1 个
- B. 2 个
- C. 3 个
- D. 无限个
- 下列哪个向量组张成整个平面?
- A. 、
- B. 、
- C. 、
- D. 、
- 若向量 有唯一线性组合表示,则该向量组?
- A. 线性相关
- B. 线性无关
- C. 含有零向量
- D. 无法判断
- 、 的张成空间是?
- A. 三维空间
- B. 平面(一个二维平面)
- C. 轴
- D. 一个点
