Part I · 第 1 章 线性代数 · 1.2

线性组合、张成与基

机器人只有几个执行器,每个只会沿固定方向用力。它们配合起来,能去哪些地方?答案是:所有"各取几份再相加"能拼出来的位置,叫张成。方向够多、够"不重复"的一组向量叫基,它是给空间写坐标的尺子。

约 25 分钟 前置:1.1 向量 7 个交互

    1为什么机器人需要它

    3D 打印机、绘图仪和很多取放机器人用的是 CoreXY / H-bot 龙门架:两个固定的电机通过皮带拉动打印头。转电机 A,打印头沿对角线 \((1,1)\) 方向走;转电机 B,打印头沿另一条对角线 \((1,-1)\) 方向走。可你想要的是"去 \((3,1)\) 这个点",一个朝向和这两条对角线都不一致的位置。两个电机怎么配合,才能把打印头送到平面上任意一点?

    答案就是本节的主角:线性组合。每个电机转一定的量,各自推出一个向量,打印头的位置是这些向量之和。所有能这样拼出来的位置,合起来叫这两个向量的张成(span)。如果其中一个电机卡死,张成立刻缩成一条线,机器就再也到不了平面上大部分地方。

    反例同样重要。差速驱动的小车只会前进和原地转,不能横着滑:它的"执行器方向"凑不满所有方向(第 7 节)。同一套语言还在别处出现:一台俯视桌面的相机(先不管透视和畸变),它的像素坐标 \((u,v)\) 是沿"像素行、像素列"两个方向数格子得到的,这是另一套基下的坐标,朝向和刻度都和世界坐标轴不同。

    2直觉:原料、配方与"能做的菜"

    想象你在厨房里,只有两种原料:向量 \(\mathbf v_1\) 和 \(\mathbf v_2\)。一份配方是两个数 \((c_1, c_2)\):第一种放 \(c_1\) 份,第二种放 \(c_2\) 份。做出来的菜是

    $$ \cv{\mathbf p} = c_1\,\ci{\mathbf v_1} + c_2\,\cj{\mathbf v_2}, $$

    这叫 \(\mathbf v_1,\mathbf v_2\) 的线性组合(linear combination)。份数可以是小数,也可以是负数(反方向走)。几何上,它就是"先沿 \(\mathbf v_1\) 走 \(c_1\) 步,再沿 \(\mathbf v_2\) 走 \(c_2\) 步"的首尾相接。你能做出的所有菜合在一起,叫两种原料的张成(span)。

    关键问题是:这张"菜单"有多大?试试下面三种情况。拖动 \(\mathbf v_1\) 的箭头尖,再拖动紫色的 \(\mathbf w\):它在菜单上吗?

    FIG 1这道菜做得出来吗?
    淡青色区域或线条是张成。两个方向不同的原料能铺满整个平面;只有一种原料,或者两种原料共线(绿色箭头是红色的 \(-0.5\) 倍,反向但在同一条直线上),菜单就缩成一条线,线外的 \(\mathbf w\) 怎么配都做不出来(红色虚线是差距)。
    • 找一个 \(\mathbf w\):在"一个向量"或"共线"下做不出来,再切到"方向不同",它就做得出来了。
    核心洞见

    张成的大小取决于原料有没有"新方向"。第二个向量如果已经在第一个向量的张成里(同一条线上),它就多余,加进来也没有扩大菜单。这种"多余"叫线性相关;没有任何一个向量多余,就叫线性无关。

    3动手玩:配方实验室

    拖动红色 \(\mathbf v_1\) 和绿色 \(\mathbf v_2\) 的箭头尖;用滑块调配方 \(c_1, c_2\),或者直接拖动黄色的结果 \(\mathbf p\)(滑块会跟着变)。打开"画出张成",把所有整数配方 \((c_1,c_2)\) 对应的点都画出来,再把 \(\mathbf v_1, \mathbf v_2\) 拖到同一条直线上看看。

    FIG 2配方实验室
    预设原料
    虚线是配方的两步:先沿 \(\mathbf v_1\) 走 \(c_1\) 份(红),再沿 \(\mathbf v_2\) 走 \(c_2\) 份(绿),终点就是黄色的 \(\mathbf p\)。青色斜网格是 \(\mathbf v_1,\mathbf v_2\) 生成的网格,圆点是整数配方。紫色圆圈是目标 \((3,1)\)。
    试一试
    • 让张成塌成一条直线:把 \(\mathbf v_1\)、\(\mathbf v_2\) 拖到同一条过原点的直线上。圆点和网格发生了什么?
    • 让张成变成一个点:两个向量都拖到原点。
    • 取 \(\mathbf v_1=(1,1)\),\(\mathbf v_2=(1,-1)\)(可以用预设"CoreXY",再用滑块),配出紫色目标 \((3,1)\)。配方是什么?
    • 还是配出 \((3,1)\),但这次必须有一个负的份数。提示:换一组原料,让目标落在两个原料"夹角之外"。

    小游戏:找配方

    每一题给你一组随机的原料 \(\mathbf v_1, \mathbf v_2\) 和一个紫色目标 \(\mathbf t\)。拖动黄色结果,或者调滑块,使 \(\mathbf p = \mathbf t\)。数一数斜网格:从原点沿 \(\mathbf v_1\) 走几格,再沿 \(\mathbf v_2\) 走几格?

    FIG 3找配方
    • 不用"显示配方",累计答对 3 题。

    4第二个视角:坐标取决于你选的基

    当两个原料无关时,平面上每个点都恰好有一份配方。这份配方就是这个点在这套原料下的坐标,这套原料就叫一组基(basis)。

    注意:同一个点,换一套基,坐标就变。在标准基 \(\{\ihat,\jhat\}\) 下,点 \(\mathbf p\) 的坐标是 \((3,1)\):向右 3 格、向上 1 格。换成 CoreXY 的基 \(\mathbf b_1=(1,1)\)、\(\mathbf b_2=(1,-1)\),同一个点的坐标是 \((2,1)\):沿 \(\mathbf b_1\) 走 2 份,再沿 \(\mathbf b_2\) 走 1 份,\(2(1,1)+1(1,-1)=(3,1)\)。点没有动,变的是尺子。

    这正是 1.3 节"被动视角"的预告:把基向量并排写成矩阵 \(B=[\,\mathbf b_1\;\mathbf b_2\,]\),它把新坐标翻译成标准坐标:\(\mathbf p = B\mathbf c\)(详见 1.3 节)。下面两张图画的是同一个平面、同一个点,左边用方格数,右边用斜格数。

    FIG 4同一个点,两套坐标
    标准基 {î, ĵ}
    新基 {b₁, b₂}
    拖动任意一个黄点,两边同步。顶部切换基:黄点不动,但右边的读数在变。"旋转 30°"这组基互相垂直、长度为 1,它就是机器人坐标系常见的样子(1.10 节)。
    • 选 CoreXY 基,拖动黄点,让右边的坐标读数为 \((2,1)\)。左边读到的是什么?
    • 还是 CoreXY 基:找一个标准坐标 x、y 都为正、但在新基下有一个坐标为负的点。

    5第三个视角:三维里的"多一个方向"

    到了三维,故事多了一层。两个无关的向量张成一个过原点的平面。再加第三个向量 \(\mathbf v_3\),只有两种可能:

    • \(\mathbf v_3\) 躺在这个平面里:它是前两个的组合,线性相关,张成还是这个平面(2 维);
    • \(\mathbf v_3\) 伸出平面:线性无关,三个向量一起张成整个 \(\R^3\)(3 维),成为 \(\R^3\) 的一组基。

    拖动滑块,把第三个向量(蓝色)从平面里一点点拉出来。拖动画面可以转动视角。

    FIG 5平面与第三个向量
    半透明的平面是 \(\mathrm{span}\{\mathbf v_1,\mathbf v_2\}\),其中 \(\mathbf v_1=(2,0,1)\),\(\mathbf v_2=(0,2,1)\)。\(\mathbf v_3\) 被拆成"平面内的部分 \(a\mathbf v_1+b\mathbf v_2\)"和"垂直于平面的部分 \(h\hat{\mathbf n}\)";黄色虚线的长度就是 \(\mathbf v_3\) 到平面的距离 \(|h|\)。三个向量围成的平行六面体体积是 \(|\det|\),\(h=0\) 时它被压扁成 0(1.5 节)。
    • 让 \(\mathbf v_3\) 恰好落进平面(\(h=0\))。状态栏变成什么?
    • 转动视角,从侧面看平面(它几乎变成一条线)。

    6再看数学

    提示:把鼠标悬停在公式中带底色的符号上,FIG 2 中对应的元素会被高亮。

    线性组合与张成

    给定向量 \(\mathbf v_1,\dots,\mathbf v_k\) 和实数 \(c_1,\dots,c_k\),向量 \(c_1\mathbf v_1+\dots+c_k\mathbf v_k\) 叫它们的线性组合,\(c_i\) 是系数。所有线性组合构成的集合叫张成:

    $$ \hl{p}{\cv{\mathbf p}} = \hl{c1}{c_1}\,\hl{v1}{\ci{\mathbf v_1}} + \hl{c2}{c_2}\,\hl{v2}{\cj{\mathbf v_2}}, \qquad \hl{span}{\operatorname{span}}\{\mathbf v_1,\mathbf v_2\} = \{\, c_1\mathbf v_1 + c_2\mathbf v_2 \;:\; c_1,c_2\in\R \,\}. $$

    在 \(\R^2\) 里,两个向量的张成只有三种可能:整个平面、一条过原点的直线、或者只有原点。张成永远包含原点(所有系数取 0)。

    线性无关

    向量组 \(\mathbf v_1,\dots,\mathbf v_k\) 线性无关,是指"只有平凡组合才能得到零向量":

    $$ c_1\mathbf v_1 + \dots + c_k\mathbf v_k = \mathbf 0 \;\Longrightarrow\; c_1 = \dots = c_k = 0. $$

    等价的说法:没有任何一个向量是其余向量的线性组合(没有"多余"的向量)。如果存在不全为 0 的系数使上式成立,就是线性相关。对平面上的两个向量,无关就是"都不为零,且不共线"。

    基与维数

    基是同时满足两个条件的向量组:线性无关(没有浪费)和张成整个空间(够用)。\(\R^n\) 的任何一组基都恰好有 \(n\) 个向量,这个数 \(n\) 叫空间的维数(dimension)。所以平面里至多 2 个向量无关,空间里至多 3 个;\(\R^2\) 里的 3 个向量一定相关。

    坐标是唯一的

    设 \(\mathbf b_1,\dots,\mathbf b_n\) 是一组基。若同一个向量有两份配方 \(\mathbf p = \sum c_i\mathbf b_i = \sum d_i\mathbf b_i\),两式相减得 \(\sum (c_i-d_i)\mathbf b_i = \mathbf 0\)。这是一个组合等于零,由线性无关,所有 \(c_i - d_i = 0\),即 \(c_i = d_i\)。所以每个向量在一组基下的坐标 \([\mathbf p]_B = (c_1,\dots,c_n)\) 是唯一的。反过来,如果原料相关,配方就不唯一(见误区 1 和第 7 节的全向轮)。

    在二维里求坐标

    设 \(\mathbf b_1=(b_{11},b_{21})\),\(\mathbf b_2=(b_{12},b_{22})\),要解 \(\mathbf p = c_1\mathbf b_1 + c_2\mathbf b_2\)。这就是两个方程、两个未知数:

    $$ \begin{aligned} b_{11}c_1 + b_{12}c_2 &= p_1 \\ b_{21}c_1 + b_{22}c_2 &= p_2 \end{aligned} \quad\Longrightarrow\quad c_1 = \frac{p_1 b_{22} - p_2 b_{12}}{\Delta},\;\; c_2 = \frac{b_{11}p_2 - b_{21}p_1}{\Delta},\;\; \Delta = b_{11}b_{22} - b_{12}b_{21}. $$

    \(\Delta \ne 0\) 恰好等价于 \(\mathbf b_1,\mathbf b_2\) 无关;\(\Delta = 0\) 时两列共线,方程要么无解、要么有无穷多解。这个数就是 1.5 节的行列式。例:CoreXY 的基,\(\Delta = 1\cdot(-1) - 1\cdot 1 = -2\);对 \(\mathbf p = (3,1)\),\(c_1 = (3\cdot(-1) - 1\cdot 1)/(-2) = 2\),\(c_2 = (1\cdot 1 - 1\cdot 3)/(-2) = 1\),和 FIG 4 一致。

    矩阵写法

    把基向量作为列,\(B=[\,\mathbf b_1\;\mathbf b_2\,]\),上面的方程就是 \(B\mathbf c = \mathbf p\),解是 \(\mathbf c = B^{-1}\mathbf p\)。CoreXY 的 \(B = \begin{bmatrix}1&1\\1&-1\end{bmatrix}\),\(B^{-1} = \tfrac12\begin{bmatrix}1&1\\1&-1\end{bmatrix}\),也就是 \(c_1 = (x+y)/2\),\(c_2 = (x-y)/2\)(电机指令和打印头位置之间的换算公式)。\(B\) 是什么、什么时候有逆,是 1.3 节和 1.6 节的内容。

    7机器人中的它:龙门架、差速车与全向轮

    CoreXY 龙门架

    取单位:电机 A 每转 1 个单位,打印头移动 \((1,1)\);电机 B 每转 1 个单位,移动 \((1,-1)\)(实际机器差一个常数倍,不影响结论)。电机指令 \((\alpha,\beta)\) 对应的打印头位置是

    $$ \cv{\mathbf p} = \alpha\,\ci{\begin{bmatrix}1\\1\end{bmatrix}} + \beta\,\cj{\begin{bmatrix}1\\-1\end{bmatrix}} = \begin{bmatrix}\alpha+\beta\\ \alpha-\beta\end{bmatrix}, \qquad \alpha = \tfrac{x+y}{2},\;\; \beta = \tfrac{x-y}{2}. $$

    拖动打印头(黄),或者用滑块分别转两个电机。然后试试"故障":卡死一个电机,它的指令就被冻结,打印头只能沿另一个电机的对角线滑动,可达集合从一块区域塌成一条线段。

    FIG 6CoreXY:两个电机,两个方向
    红色虚线是电机 A 的贡献 \(\alpha(1,1)\),绿色虚线是电机 B 的贡献 \(\beta(1,-1)\),首尾相接到打印头。淡色斜线是两个电机各自的方向。菱形是电机行程(\(|\alpha|,|\beta|\le 3\))限制下的可达范围。紫色圆圈是目标 \((3,1)\)。
    • 两个电机都正常,把打印头开到目标 \((3,1)\)。电机指令是多少?
    • 卡死一个电机,使目标永远够不着(读数里"最近距离"大于 0.5)。
    • 有没有一种卡死位置,目标依然够得着?先把电机开到合适的位置,再卡死它,再用另一个电机去够目标。

    差速车:三个方向只凑得出两个

    平面移动机器人的瞬时运动有三个自由度:前后 \(v_x\)、左右 \(v_y\)、转动 \(\omega\),可以写成 \(\R^3\) 里的一个向量 \((v_x,v_y,\omega)\)。差速车只有两个"执行器方向":前进 \((1,0,0)\) 和原地转 \((0,0,1)\),它们只张成 \(\R^3\) 里的一个平面。含 \(v_y\) 的方向都在张成之外:它不能横着滑。全向轮底盘三个方向俱全,张成整个 \(\R^3\)。

    FIG 7想去的速度 vs 做得到的速度
    机器人朝右(红色 \(x_r\) 为前,绿色 \(y_r\) 为左)。拖动紫色手柄设定想要的平移速度;黄色箭头是机器人此刻实际做得到的速度。蓝色圆弧是转动 \(\omega\)。差速模式下,左右分量被"吃掉"了。
    • 差速模式下,把想要的速度拖成几乎纯横向(\(|v_y|>1.5\),\(|v_x|<0.3\))。实际速度是多少?
    • 切到全向模式,再做一次同样的事。
    真实系统里

    固件里的基变换。Klipper、Marlin 等 3D 打印机固件在 CoreXY 模式下,每一步都在做 FIG 6 里的换算:把想要的 \((x,y)\) 变成两个电机的位置(相差一个常数倍)。电机相关或卡死,换算就失效。

    差速车并非到不了。它不能瞬时横移,但通过"转一下、前进、再转回来"(像侧方停车)可以到达平面上任何位姿。瞬时能走的方向不足,换来的是需要规划的运动,这类约束叫非完整约束(nonholonomic),第 II 部分会专门讲。

    冗余也是一种相关。4 个麦克纳姆轮的全向底盘,只有 3 个自由度:4 个轮子的"贡献向量"住在 \(\R^3\) 里,4 个向量一定相关,所以同一个车体速度可以由很多种轮速组合产生。这给了你"多出来的自由"(可以用来分配负载、避开打滑),也意味着配方不再唯一,需要 1.6 节和 1.13 节的工具来选一个。

    机械臂。6 自由度机械臂的雅可比(3.4 节)的 6 列,是 6 个关节各自产生的末端运动向量。它们无关,末端才能朝任意方向运动;这些列变得线性相关(例如两列撞到同一条线上)就是奇异位形:和 FIG 6 里电机卡死如出一辙。

    8常见误区

    误区 1:向量越多,张成越大

    不是。平面里的 3 个向量一定相关,至多有 2 个"有用"。例如 \((1,0),(0,1),(1,1)\):张成还是整个平面,第三个是多余的,而且配方不再唯一:\((1,1)\) 既是 \(1\cdot(1,1)\),也是 \(1\cdot(1,0)+1\cdot(0,1)\)。增加向量能不能扩大张成,要看它是不是新方向,不看个数。

    误区 2:无关就是垂直

    无关只要求"不共线"。\((1,0)\) 和 \((1,1)\) 夹角 45°,照样是平面的一组基(FIG 4 里的 CoreXY 基倒是垂直的,但"斜"那一档不是)。垂直(正交)是更强、更好用的性质:坐标可以直接用点积读出来(1.7 节、1.9 节)。

    误区 3:含有零向量也可以无关

    不可能。只要含 \(\mathbf 0\),取 \(1\cdot\mathbf 0 + 0\cdot\mathbf v_2 = \mathbf 0\),这是一个非平凡的组合得到零,所以一定相关。对机器人来说:一个卡死的电机、一个被锁住的关节,贡献的就是零向量,对张成没有任何帮助。

    误区 4:基是唯一的,所以坐标自己就有意义

    同一个空间有无穷多组基,所以一组数 \((2,1)\) 脱离了"哪组基"就没有意义:在标准基下它是点 \((2,1)\),在 CoreXY 基下它是点 \((3,1)\)。机器人代码里永远要标明坐标系:p_world、p_cam、p_base,矩阵写成 R_world_cam。很多看似玄学的 bug,只是把一组坐标当成了另一个坐标系里的。

    9小练习

    1. \(\mathbf v_1=(1,2)\),\(\mathbf v_2=(2,4)\)。它们的张成是什么?
    \(\mathbf v_2 = 2\mathbf v_1\),两个向量共线,所以相关,张成就是 \(\mathbf v_1\) 所在的直线:斜率 \(2/1 = 2\),即 \(y=2x\)。
    2. 在基 \(\{(2,1),(1,-1)\}\) 下,点 \(\mathbf p=(4,-1)\)(标准坐标)的坐标是?
    解 \(2c_1+c_2=4\),\(c_1-c_2=-1\):相加得 \(3c_1=3\),\(c_1=1\),\(c_2=2\)。检验:\(1\cdot(2,1)+2\cdot(1,-1)=(4,-1)\)。\((4,-1)\) 本身是标准坐标,不是新坐标;\((2,1)\) 是把两个系数弄反了。
    3. 平面里的三个向量 \((1,0),(0,1),(2,3)\),下面哪句话对?
    前两个已经张成 \(\R^2\)。第三个 \((2,3) = 2(1,0)+3(0,1)\),是前两个的组合,所以三者相关:\(2(1,0)+3(0,1)-1\cdot(2,3)=\mathbf 0\),系数不全为 0。基必须无关,所以不是基。
    4. CoreXY 龙门架,电机 A 卡死在 \(\alpha=0\),电机 B 还能转(\(\beta\) 任意)。打印头能去哪里?
    \(\mathbf p = 0\cdot(1,1) + \beta(1,-1) = (\beta,-\beta)\),满足 \(y=-x\)。只剩一个原料,张成缩成一条线。
    5. 一个四轮全向底盘只有 3 个自由度 \((v_x,v_y,\omega)\)。四个轮子各自的"贡献向量"是 \(\R^3\) 里的 4 个向量。这说明?
    \(\R^3\) 里至多 3 个向量无关,所以 4 个必相关。相关意味着配方不唯一,多出来的是冗余自由度。但并不是"某一个轮子永远没用":任何一个都可以被其余三个的组合替代,这是对称的关系。

    10延伸阅读

    • 3Blue1Brown, Essence of Linear Algebra — 第 2 章“线性组合、张成与基向量”(Linear combinations, span, and basis vectors)
    • G. Strang, Introduction to Linear Algebra — 第 1 章(线性组合)与“线性无关、基和维数”一节(章节编号因版本而异)
    • G. Strang, MIT 18.06 Linear Algebra (OCW) — 第 9 讲:线性无关、基和维数
    • J. Ström et al., Immersive Linear Algebra — 第 2 章“向量”(含线性组合与线性无关的交互插图)