特征值与特征向量
矩阵会把大多数向量推离原来的方向,但总有几条特殊的直线:向量落在上面,只会被拉长、压短或翻到另一侧,方向不变。这些方向叫特征向量,伸缩的倍数叫特征值。找到它们,一个纠缠的矩阵就拆成几个互不干扰的一维问题:机器人会不会稳定下来、会不会来回振荡、不确定性椭圆朝向哪里,都能直接读出来。
1为什么机器人需要它
机器人的控制器每隔几毫秒读一次状态误差(位置差多少、速度差多少),再算出下一步的指令。把这个闭环线性化,几乎总能写成
误差会逐渐消失,会来回振荡,还是越滚越大?答案不藏在 \(A\) 的某一个元素里,而藏在 \(A\) 的特征值 (eigenvalues) 里。这是特征值在机器人里最重要的用途,但不是唯一的:
- 稳定性:上面这个问题。所有特征值的模都小于 1,系统就会稳定下来;有一个大于 1,就会发散(见下文第 4 和第 7 部分)。
- 不确定性椭圆:状态估计给出的协方差矩阵是对称矩阵,它的特征向量就是椭圆的长短轴方向,特征值决定轴有多长(4.4 节)。
- 旋转轴:任何三维旋转都固定了一条直线,这条轴的方向就是旋转矩阵的特征向量,特征值恰好是 1(见下文第 7 部分)。
- 振动模态:柔性机械臂的每一种“摇晃方式”是一个特征向量,对应的特征值是固有频率的平方。
- SVD 与 PCA:1.12 节的奇异值分解,以及点云的主成分分析,都建立在对称矩阵的特征分解之上。
2直觉:哪些方向不被“推歪”
1.3 节里,我们把矩阵看成对整个平面的一次动作。向量 \(\mathbf v\) 经过矩阵 \(A\) 变成 \(A\mathbf v\),通常两者指向不同的方向:矩阵把它推离了原来那条过原点的直线。
不过,常常有几个特殊的方向。向量站在上面时,矩阵只会沿着这条线把它拉长、压短,或翻到另一侧,却不会让它转弯。这样的方向叫特征向量 (eigenvector),伸缩的倍数叫特征值 (eigenvalue)。“eigen” 是德语,意思是“自己的、固有的”:这是矩阵自己的方向。
特征值的数值直接告诉你沿这条线发生了什么:
- \(\lambda > 1\):被拉长;\(0 < \lambda < 1\):被压短;\(\lambda = 1\):原地不动。
- \(\lambda < 0\):翻到原点的另一侧(再按 \(|\lambda|\) 伸缩)。
- \(\lambda = 0\):整条线被压成原点。这正是 1.6 节的零空间:特征值 0 意味着矩阵不可逆。
拖动下面左图里的琥珀色向量 \(\mathbf v\)(它只能绕圆走)。灰色虚线是 \(\mathbf v\) 所在的直线,青色箭头是 \(A\mathbf v\)。只要 \(A\mathbf v\) 离开了这条线,\(\mathbf v\) 就不是特征向量。右图画的是“偏了多少”:从 \(\mathbf v\) 转到 \(A\mathbf v\) 的夹角 \(\delta\) 的正弦。曲线碰到 0 的地方,就是 \(A\mathbf v\) 回到这条线上的地方。靠近特征方向时,\(\mathbf v\) 会被轻轻吸住。
- 选“一般矩阵”,拖动 \(\mathbf v\),让 \(A\mathbf v\) 落回 \(\mathbf v\) 所在的直线上。能找到几个这样的位置(别忘了对面还有一个)?
特征向量是被矩阵“沿着自己的线”作用的向量:\(A\mathbf v = \lambda\mathbf v\)。在这条线上,矩阵的复杂动作退化成一个数 \(\lambda\)。如果能找到足够多条这样的线,整个矩阵就只是“沿几个方向各自乘一个数”。
3动手玩:特征方向探测器
现在换到完整的实验室。先造一个矩阵:拖动红色的 Aî 和绿色的 Aĵ 手柄,或者直接改数字,或者点预设。然后用琥珀色探针 \(\cv{\mathbf v}\) 去找特征方向:读数条显示 \(\mathbf v\) 与 \(A\mathbf v\) 所在两条直线的夹角。夹角小于 4° 时探针会闪一下,并在那条线上留下一个紫色标记。“扫描一圈”会让 \(\mathbf v\) 自己转一整圈。
圆周上那一圈细线是 72 个单位向量 \(\mathbf u\) 到 \(A\mathbf u\) 的位移(一只“刺猬”)。\(\mathbf u\) 是特征向量时,\(A\mathbf u = \lambda\mathbf u\) 仍在同一条线上,这根刺就是沿半径方向的;其他的刺都斜着扎出去。打开“显示答案”,真正的特征线(紫色虚线)和沿半径的刺会被标出来。
- 选预设“对称”(\(A=\begin{bmatrix}2&1\\1&2\end{bmatrix}\)),只靠探针找到它的两个特征方向。读一下两个特征值和两个方向的夹角。
- 做一个没有实特征向量的矩阵,用“扫描一圈”确认:探针永远没有对齐。提示:想想 1.3 节的哪个动作会让每个向量都转弯。
- 找一个有特征值 −1 的矩阵,并用探针把对应的特征方向标出来。这个方向上的向量发生了什么?
- 选“剪切”,再扫描一圈。为什么只有一个特征方向?(想想剪切把哪些向量推歪、推歪多少。)
4第二种视角:把矩阵一遍遍用下去
控制循环每个周期都把同一个规则用一次:\(\mathbf x_{k+1} = A\mathbf x_k\)。我们真正关心的是很多步以后的 \(\mathbf x_k = A^k\mathbf x_0\)。特征向量让这件事变得很简单。把起点拆成特征向量的组合 \(\mathbf x_0 = c_1\mathbf v_1 + c_2\mathbf v_2\),由于每个 \(\mathbf v_i\) 被 \(A\) 作用时只乘自己的 \(\lambda_i\):
每个分量各自按 \(\lambda_i^k\) 生长或衰减,互不干扰。于是:
- \(|\lambda|\) 最大的分量最终胜出:所有轨迹都弯向主特征向量(dominant eigenvector),每步伸缩约 \(|\lambda_{\max}|\) 倍。
- 所有 \(|\lambda_i| < 1\):每个分量都在缩小,轨迹收敛到原点(稳定)。只要有一个 \(|\lambda_i| > 1\),轨迹就会发散。
- \(\lambda < 0\):这个分量每一步翻到原点另一侧,轨迹“之字形”前进。
- 复特征值 \(\lambda = re^{\pm i\varphi}\):每一步转 \(\varphi\) 角并伸缩 \(r\) 倍,轨迹是螺旋。\(r<1\) 向内收,\(r>1\) 向外散,\(r=1\) 在椭圆上转圈。
在下面的画布上点击可以丢下新的种子点(最多 40 个)。拖动步数滑块或按“播放”,看每个种子走出的轨迹。右侧小图把特征值画在复平面上,单位圆是稳定与否的分界线。
- 用实特征值的矩阵(比如默认的那个),让步数 ≥ 12,所有种子排成同一条线。这条线是哪条线?
- 做出向内的螺旋:复特征值且 \(|\lambda|<0.95\),步数 ≥ 10。
- 再做出向外的螺旋:复特征值且 \(|\lambda|>1.05\)。这时特征值在复平面里落在单位圆的哪一侧?
“不断乘 \(A\),再归一化”就是幂迭代。它只能找到最大的那一个特征值,但足够便宜,大型稀疏矩阵常用它。通用的特征值求解器(NumPy 的 np.linalg.eig、Eigen 的 EigenSolver,背后是 LAPACK)用的是 QR 算法,可以看成同时对所有方向做幂迭代的加强版。
5第三种视角:对称矩阵是特例
满足 \(A = A^\top\)(关于对角线对称)的矩阵,在机器人里随处可见:协方差矩阵、惯量矩阵、Hessian(3.5 节),还有 1.12 节要用的 \(A^\top A\)。它们有两条很好的性质:
- 特征值一定是实数。
- 不同特征值对应的特征向量一定互相垂直。
所以它们总能写成 \(A = Q\Lambda Q^\top\):先用 \(Q^\top\) 把特征向量转到坐标轴上,再沿坐标轴拉伸(\(\Lambda\) 是对角矩阵,对角线上是特征值),最后用 \(Q\) 转回来。这里的 \(Q\) 是 1.10 节的正交矩阵,它的列就是特征向量。单位圆变成椭圆,椭圆的两根轴恰好就是特征向量,半轴长就是 \(|\lambda_i|\)。
左图是一个对称矩阵:拖动阶段滑块,看圆被转、拉、转回的过程;拖动椭圆轴端点的圆圈可以改变特征值和方向。右图是同一个矩阵加上一点“旋转成分”:\(N = S + tJ\),其中 \(J=\begin{bmatrix}0&1\\-1&0\end{bmatrix}\)。\(N\) 不再对称,看看椭圆的轴还是不是特征向量。
- 把阶段滑块从 ① 拖到 ③(或按“播放”),看对称矩阵怎样“转、拉、转回”。
- 增大 \(t\),让右图两个特征向量的夹角偏离 90° 至少 10°,而特征值仍是实数。
- 继续增大 \(t\),直到右图的特征向量消失。这时 \(t\) 和特征值之差满足什么关系?
对称矩阵:特征向量就是椭圆的轴,特征值就是(带符号的)半轴长。这就是为什么协方差矩阵的特征向量给出不确定性椭圆的方向(4.4 节),也是点云 PCA 的原理。非对称矩阵的椭圆轴一般不是特征向量,那该怎么办?1.12 节的办法是:造一个对称矩阵 \(A^\top A\),用它的特征分解找到椭圆的轴,这就是奇异值分解。
6再看数学
提示:把鼠标悬停在公式中带底色的符号上,FIG 2 会加粗对应的箭头,悬停 \(\lambda\) 时还会临时显示真正的特征线。
定义
设 \(A\) 是 \(n\times n\) 矩阵。如果一个非零向量 \(\mathbf v\) 和一个数 \(\lambda\) 满足下式,\(\lambda\) 就叫 \(A\) 的特征值,\(\mathbf v\) 叫对应的特征向量:
要求 \(\mathbf v\neq\mathbf 0\) 是因为零向量对任何 \(\lambda\) 都成立,没有信息。注意特征向量的任何非零倍数还是特征向量,所以真正确定的是一条特征线(所有这些倍数组成的直线)。同一个特征值的所有特征向量,加上零向量,组成一个子空间,叫特征空间。
怎么找:特征多项式
把 \(\lambda\mathbf v\) 移到左边:\(A\mathbf v - \lambda\mathbf v = (A-\lambda I)\mathbf v = \mathbf 0\)。这是一个齐次方程组。1.6 节告诉我们,它有非零解,当且仅当 \(A-\lambda I\) 不可逆(零空间不只有零向量);1.5 节告诉我们,不可逆等价于行列式为 0:
对 \(2\times 2\) 矩阵 \(A=\begin{bmatrix}a&b\\c&d\end{bmatrix}\),展开就是一个关于 \(\lambda\) 的二次方程,叫特征多项式 (characteristic polynomial):
由根与系数的关系,\(\lambda_1+\lambda_2 = \operatorname{tr}A\),\(\lambda_1\lambda_2 = \det A\):迹等于特征值之和,行列式等于特征值之积。后一条很直观:1.5 节说行列式是面积的缩放倍数,而特征方向上各自伸缩 \(\lambda_1,\lambda_2\) 倍,面积自然缩放 \(\lambda_1\lambda_2\) 倍。它还给出一个心算技巧:先取平均 \(m=\operatorname{tr}A/2\),再取乘积 \(p=\det A\),特征值就是 \(m\pm\sqrt{m^2-p}\)。
算一个例子
取 FIG 2 里的“对称”预设 \(A=\begin{bmatrix}2&1\\1&2\end{bmatrix}\)。迹为 4,行列式为 3:
验证:\(A\mathbf v_1 = (3,3) = 3\mathbf v_1\),\(A\mathbf v_2 = (1,-1) = 1\cdot\mathbf v_2\)。两条特征线在 45° 和 135° 上,正是你在 FIG 2 里用探针找到的位置,而且互相垂直(这是对称矩阵的特点)。
判别式的三种情况
根号里的 \(\Delta=(\operatorname{tr}A/2)^2-\det A\) 决定了矩阵长什么样:
| \(\Delta\) | 特征值 | 特征线 | 例子 |
|---|---|---|---|
| \(\Delta>0\) | 两个不同的实数 | 两条 | 非均匀缩放、对称(非数量矩阵)、镜像、投影 |
| \(\Delta=0\) | 一个重根 | 两种可能:\(A=\lambda I\)(每个方向都是);或只有一条(缺陷矩阵) | 单位矩阵;剪切 |
| \(\Delta<0\) | 一对共轭复数 \(a\pm bi\) | 没有实特征线 | 旋转 |
对角化与矩阵的幂
如果 \(A\) 有 \(n\) 个线性无关的特征向量,把它们并排作为 \(V\) 的列,\(\Lambda\) 是特征值组成的对角矩阵。逐列写出 \(A\mathbf v_i=\lambda_i\mathbf v_i\) 就是 \(AV=V\Lambda\),而 \(V\) 的列是一组基(1.2 节),所以 \(V\) 可逆:
用 1.3 节的被动视角来读:\(V^{-1}\) 把标准坐标换算成“特征坐标”,\(\Lambda\) 在每个特征坐标上各自乘一个数,\(V\) 再换算回来。连乘 \(k\) 次时,中间的 \(V^{-1}V\) 全部抵消,只剩 \(\Lambda^k\),这就是第 4 部分里 \(\lambda_i^k\) 的来历。对上面的例子:
取 \(k=1\) 得回 \(A\) 本身;\(k\) 很大时,两行几乎相同,每个向量都被推向 \((1,1)\) 方向:幂迭代的结论。
复特征值就是“旋转加缩放”
当 \(\Delta<0\),特征值是 \(\lambda=a\pm bi\),其中 \(a=\operatorname{tr}A/2\),\(b=\sqrt{-\Delta}\)。写成极坐标形式 \(\lambda=re^{\pm i\varphi}\),模长 \(r=\sqrt{a^2+b^2}=\sqrt{\det A}\),辐角 \(\varphi=\operatorname{atan2}(b,a)\)。矩阵 \(\begin{bmatrix}a&-b\\b&a\end{bmatrix}=r\,R(\varphi)\) 恰好是“旋转 \(\varphi\),再放大 \(r\) 倍”。任何特征值为 \(a\pm bi\) 的实 \(2\times2\) 矩阵,本质上都是这个动作,只是透过一个歪斜的坐标系去看。所以反复作用的轨迹是螺旋:每步转 \(\varphi\),长度乘 \(r\)。
纯旋转矩阵 \(R(\theta)\) 的特征值是 \(e^{\pm i\theta}\),\(r=1\):旋转不改变长度,只有 \(\theta=0\) 或 \(\pi\) 时才有实特征向量(\(\theta=\pi\) 时 \(\lambda=-1\),每个向量都被翻到对面)。
对称矩阵:谱定理
如果 \(A=A^\top\),那么特征值全是实数,并且可以选出一组标准正交的特征向量。把它们作为列组成 \(Q\),\(Q^\top Q=I\)(1.10 节),于是 \(V^{-1}=Q^\top\),不用求逆:
垂直性的证明只要两行:设 \(A\mathbf v_1=\lambda_1\mathbf v_1\),\(A\mathbf v_2=\lambda_2\mathbf v_2\),\(\lambda_1\neq\lambda_2\)。则 \(\lambda_1(\mathbf v_1\!\cdot\!\mathbf v_2)=(A\mathbf v_1)\!\cdot\!\mathbf v_2=\mathbf v_1\!\cdot\!(A^\top\mathbf v_2)=\mathbf v_1\!\cdot\!(A\mathbf v_2)=\lambda_2(\mathbf v_1\!\cdot\!\mathbf v_2)\),所以 \((\lambda_1-\lambda_2)(\mathbf v_1\!\cdot\!\mathbf v_2)=0\),即 \(\mathbf v_1\perp\mathbf v_2\)。(点积见 1.7 节;这里用到 \((A\mathbf x)\!\cdot\!\mathbf y=\mathbf x\!\cdot\!(A^\top\mathbf y)\)。)1.12 节会对 \(A^\top A\) 使用这个定理,来推出奇异值分解。
稳定性判据
第 4 部分的公式 \(\mathbf x_k=\sum c_i\lambda_i^k\mathbf v_i\) 直接给出结论。对离散时间系统 \(\mathbf x_{k+1}=A\mathbf x_k\),所有分量都衰减,当且仅当每个 \(|\lambda_i|<1\)。对连续时间系统 \(\dot{\mathbf x}=A\mathbf x\),解是 \(\mathbf x(t)=\sum c_i e^{\lambda_i t}\mathbf v_i\),每个分量以 \(e^{\operatorname{Re}\lambda_i\,t}\) 的速度变化,所以条件变成 \(\operatorname{Re}\lambda_i<0\):
NumPy 里,一般矩阵用 np.linalg.eig(A)(可能返回复数),对称矩阵用 np.linalg.eigh(S):它保证特征值是实数并按升序排列,特征向量标准正交,也更快、更准。Eigen 里对应的是 EigenSolver 和 SelfAdjointEigenSolver。如果你知道矩阵是对称的(协方差、\(A^\top A\)),一定用 eigh。
7机器人中的它:控制器的稳定性与旋转轴
离散时间的 PD 控制
一辆单位质量的小车,位置 \(p\),速度 \(v\),用 PD 控制把它拉回原点:推力 \(u=-k_p\,p-k_d\,v\)(弹簧 \(k_p\) 加阻尼 \(k_d\))。控制器每隔 \(\Delta t\) 秒运行一次,我们用半隐式欧拉法离散化:先更新速度,再用新速度更新位置:
以 \(\mathbf x=(p,v)\) 为状态,这是 \(\mathbf x_{k+1}=(A-BK)\,\mathbf x_k\),其中 \(A\) 是无控制时的动力学,\(BK\) 是反馈。注意:判断稳定性要看闭环矩阵 \(A-BK\) 的特征值,而不是 \(A\) 的(这个 \(A\) 的特征值是 1 和 1,本身就不稳定):
它的迹和行列式有很简洁的形式:\(\operatorname{tr}=2-\Delta t^2k_p-\Delta t\,k_d\),\(\det=1-\Delta t\,k_d\)。代入第 6 部分的公式就得到两个特征值,只要两个都落在单位圆里,小车就会稳定下来。注意:如果时间是连续的,任何正增益 \(k_p,k_d\) 都稳定;离散以后,增益和 \(\Delta t\) 一大,特征值就会冲出单位圆。拖动滑块,把特征值(右上小图)、相平面轨迹和时间响应对着看。
- 找到一组增益,让小车不超调地稳定下来:两个特征值都是 \((0,1)\) 内的实数。提示:阻尼要够,但 \(k_p\) 别太大。
- 让它振荡但仍然稳定:特征值是复数,而且 \(|\lambda|<0.98\)。
- 把增益调大,让系统发散(\(|\lambda|>1\))。然后保持增益不变,把 \(\Delta t\) 调小,看它能不能被救回来。
机器人的低层关节控制环通常跑在 1 kHz 左右,原因正是这里看到的:控制周期 \(\Delta t\) 越长,同样的增益越容易让特征值越过单位圆。调增益时不要只看超调,也要看闭环特征值离单位圆还有多远:靠得太近,对模型误差和通信延迟就没有余量。连续时间的判据 \(\operatorname{Re}\lambda<0\) 与离散时间的 \(|\lambda|<1\) 通过 \(z=e^{s\Delta t}\) 相连:左半平面被映射到单位圆内部。
三维旋转的轴:特征值为 1 的特征向量
把绕 z、y、x 轴的三个旋转连乘(1.10 节),得到一个看上去很复杂的 \(3\times3\) 旋转矩阵 \(R\)。欧拉旋转定理说:它仍然只是绕某一条固定轴转一个角度。这条轴上的向量不受影响,\(R\mathbf n=\mathbf n\),也就是说 \(\mathbf n\) 是 \(R\) 的特征向量,特征值 \(\lambda=1\)。由 \((R-I)\mathbf n=\mathbf 0\),\(\mathbf n\) 垂直于 \(R-I\) 的每一行,所以取两行的叉积(1.8 节)就能找到它。另外两个特征值是复数 \(e^{\pm i\theta}\),\(\theta\) 就是转角(\(\operatorname{tr}R=1+2\cos\theta\))。拖动三个欧拉角,看那条紫色的不动轴。
- 把三个欧拉角都设成非零(至少 15°),确认合成的旋转仍然只有一条紫色轴,且读数里 \(R\mathbf n=\mathbf n\)。
- 让旋转轴恰好是竖直的 z 轴(转角大于 20°)。可以把哪两个角设为 0 来做到?
协方差椭圆。SLAM 和卡尔曼滤波给出的位置协方差 \(\Sigma\) 是对称矩阵(4.4 节)。\(\Sigma=Q\Lambda Q^\top\):\(Q\) 的列是椭圆的轴方向,\(\sqrt{\lambda_i}\) 是 1σ 椭圆的半轴长(椭圆是单位圆在 \(Q\Lambda^{1/2}Q^\top\) 下的像)。最大特征值对应机器人最不确定的方向。FIG 4 左图就是这幅图,只是半轴长是 \(\lambda_i\) 而不是 \(\sqrt{\lambda_i}\)。
旋转轴。从旋转矩阵求出轴和转角(FIG 6 做的事),是 5.2 节“轴角表示”和 5.6 节对数映射的出发点:\(\operatorname{Log}(R)=\theta\,\mathbf n\)。
8常见误区
只有特征线是确定的:\(\mathbf v\) 的任何非零倍数(包括 \(-\mathbf v\))一样是特征向量。库函数返回的通常是单位长度,但正负号是任意的,不同机器、不同版本可能不同。特征值重复时,特征空间是整个平面或子空间,任何一组基都行。所以别逐元素比较两次运行的特征向量;要比较方向,用 \(|\mathbf u\cdot\mathbf v|\) 接近 1,或者先约定一个符号规则(比如让最大分量为正)。
只有对称矩阵才保证这一点(FIG 4 右图)。一般矩阵的特征向量可以夹成任意角度,这时 \(V^{-1}\neq V^\top\),别图省事用转置。特征向量越“斜”,矩阵越“非正规”:即使所有 \(|\lambda_i|<1\),状态也可能先暂时增长很大,再衰减。
不是。剪切 \(\begin{bmatrix}1&1\\0&1\end{bmatrix}\) 的特征值 1 是重根,却只有 x 轴这一条特征线:特征向量不够,凑不出基,叫缺陷矩阵 (defective)。为什么?\(A-I=\begin{bmatrix}0&1\\0&0\end{bmatrix}\) 的零空间只有 x 轴。这类矩阵的幂不再是 \(\lambda^k\) 那么简单:\(A^k=\begin{bmatrix}1&k\\0&1\end{bmatrix}\),虽然 \(|\lambda|=1\),状态却线性增长。在稳定性分析里,\(|\lambda|=1\) 的缺陷矩阵属于不稳定。
特征值只描述特征方向上的伸缩。剪切的特征值是 1 和 1,似乎什么都没拉伸,可它实际上能把某些向量拉到 1.62 倍(它的奇异值是 1.62 和 0.62)。想知道“最多能拉多长、最少压成多短”,要用奇异值(1.12 节)。只有对称(更一般地,正规)矩阵的奇异值才等于特征值的绝对值。
连续时间 \(\dot{\mathbf x}=A\mathbf x\):稳定当且仅当 \(\operatorname{Re}\lambda<0\)。离散时间 \(\mathbf x_{k+1}=A\mathbf x_k\):稳定当且仅当 \(|\lambda|<1\)。把它们搞混会得到荒唐的结论:\(\lambda=0.5\) 在离散系统里稳定,在连续系统里却是指数发散;\(\lambda=-2\) 在连续系统里稳定,在离散系统里却发散。先问清楚:你手里的 \(A\) 是“每步更新”,还是“变化率”?
手算 \(2\times2\) 很方便,但写进程序是个坏主意。五阶及以上的多项式没有求根公式(阿贝尔–鲁菲尼定理),多项式的根对系数的微小扰动极其敏感,数值上会损失大量精度。实际软件用 QR 迭代等直接作用在矩阵上的算法(eig、eigh),不会显式构造特征多项式。
9小练习
10延伸阅读
- 3Blue1Brown, Essence of Linear Algebra — 第 14 章“特征向量与特征值”,以及第 15 章“计算特征值的一个小技巧”(本课用到的迹与行列式心算法)
- G. Strang, Introduction to Linear Algebra, Ch. 6 — 特征值与特征向量(对角化、对称矩阵、稳定性)
- K. J. Åström & R. M. Murray, Feedback Systems, Ch. 5–6 — 线性系统与状态反馈:特征值如何决定稳定性与响应
- J. Ström et al., Immersive Linear Algebra — 特征值与特征向量一章,带交互插图
- G. Strang, MIT 18.06 Linear Algebra — 第 21–22 讲:特征值、对角化与矩阵的幂