【python讲线代】S03E10 特征值和特征向量的性质与python求解方法

0.本集概览

1.特征值和特征向量的几何意义
2.特征值和特征向量的基本几何性质
3.关于特征向量的线性无关系讨论
4.特征值与特征向量的python求解方法

接着前面一集的内容,我们这一集最后来解决特征值和特征向量的求法。

1.特征值和特征向量的几何意义

从空间几何意义的角度来理解对于一个方阵 $A$ ,若 $p$ 是他的特征向量, $\lambda$ 是对应的特征值,则意味着向量 $p$ 在方阵 $A$ 的作用下,他的空间变换仅仅是其长度沿着向量的方向进行 $\lambda$ 倍的伸缩,而其方向并不发生改变。

这就是一个非常简单、明晰的几何意义,一般来说一个向量在某个矩阵的作用下,其空间变换反映为长度和方向均发生改变,即旋转、平移和拉伸,而此处的特殊之处就在于,矩阵作用于他的特征向量,仅仅只有长度发生改变。

写成数学表达式就是: $Ap=\lambda p$ 且 $p\ne o$

2.基本性质

那么我们结合几何意义,很容易分析出一些显而易见的结论:

2.1.基本几何性质

1、如果一个方阵 $A$ 含有 $0$ 特征值,那么意味着对该特征向量进行的几何变换是空间压缩编号,依据之前学习的有关知识,这就是一个不可逆的矩阵,即奇异矩阵。

2、对角矩阵 $diag(1,2,3)$,其特征值就是 $1$ , $2$ , $3$ ,对应的特征向量即为: $\begin{bmatrix} 1&0&0 \end{bmatrix} ^{T}$ , $\begin{bmatrix} 0&1&0 \end{bmatrix} ^{T}$ , $\begin{bmatrix} 0&0&1 \end{bmatrix} ^{T}$

3、矩阵 $A$ 的特征向量为 $p$ ,特征值为 $\lambda$ ,则他的相似矩阵 $S^{-1}AS$ 的特征值不变仍为 \lambda ,特征向量变为了 $S^{-1}p$ ,我们简单的利用定义的公式验证一下即可:
$(S^{-1}AS)(S^{-1}p)$$=S^{-1}ASS^{-1}p$$=S^{-1}Ap$$=S^{-1}\lambda p$$=\lambda (S^{-1} p)$

即:$(S^{-1}AS)(S^{-1}p)$$=\lambda (S^{-1} p)$ ,结论一目了然

2.2.关于特征向量的线性无关系

1、如果一个 $n$ 阶方阵 $A$ ,有 $n$ 个特征值:$\lambda_{1}$,$\lambda_{2}$,$...$,$\lambda_{n}$ ,且其两两不同,那么这些特征值所对应的特征向量 $p_{1}$,$p_{2}$,$...$,$p_{n}$ 两两线性无关。

这个道理很容易明白,我们打个比方,如果 $\lambda_{1}\ne \lambda_{2}$ ,而其对应的特征向量 $p_{1}$ 和 $p_{2}$ 线性相关,即 $p_{1} = \alpha p_{2}$ ,那么, $Ap_{1}$$=\alpha A p_{2}$$=\alpha\lambda_{2}p_{2} $$= \lambda_{2}p_{1}$ ,同时我们知道, $Ap_{1}=\lambda_{1}p_{1}$ ,那么就得满足 $\lambda_{1}p_{1} = \lambda_{2}p_{1}$ ,由于 $p_{1}\ne o$ ,则必须要求 $\lambda_{1}=\lambda_{2}$ ,而这,与我们的假设是显然矛盾的。

2、接着上面的推理既然如果 $n$ 阶方阵 $A$ ,有 $n$ 个特征值: $\lambda_{1}$,$\lambda_{2}$,$...$,$\lambda_{n}$ ,且其两两不同,那么其特征向量 $p_{1}$,$p_{2}$,$...$,$p_{n}$依次排列所组成的方阵 $P$ 就是可逆的,依据上一集的内容,通过 $P^{-1}AP=\Lambda$ 将其对角化,其中 $\Lambda=diag(\lambda_{1},\lambda_{2},...,\lambda_{n})$

3、不同的特征根肯定对应着线性无关的特征向量,但是不能说相同的两个特征根对应的特征向量一定线性相关,比如我们最熟悉的单位对角矩阵 $diag(1,1,1)$

3.特征值与特征向量的python求解方法

我们熟悉了特征向量、特征值的一些几何特性,那应该如何利用python工具进行求解呢?很简单,我们看几种情况的:

3.1.特征值不相等的情况

3.1.1.二阶方阵举例

首先看一个最简单的 $2$ 阶方阵: $A=\begin{bmatrix} 3&-2 \\ 1&0\end{bmatrix}$ ,我们来求他的特征值和特征向量:

import numpy as np
from scipy import linalg

A = np.array([[3, -2],
              [1, 0]])

evalue, evector = linalg.eig(A)
print(evalue)
print(evector)

[ 2.+0.j  1.+0.j]
[[ 0.89442719  0.70710678]
 [ 0.4472136   0.70710678]]

程序返回的特征根是evalue,分别是 $2$ 和 $1$ 。而变量evector所表示的是由特征向量组成的特征矩阵,在这个矩阵中,每一个列向量都是与特征根依序对应的特征向量。因此特征根 $2$ 对应的特征向量为 $\begin{bmatrix} 0.8944&0.4472 \end{bmatrix} ^{T}$ ,特征根 $1$ 对应的特征向量为 $\begin{bmatrix} 0.7071&0.7071\end{bmatrix} ^{T}$ 。

特别补充一句,我们按照大学课堂里教的特征方程和定义法,笔算求得的特征向量会是 $\begin{bmatrix} 2&1 \end{bmatrix} ^{T}$和 $\begin{bmatrix} 1&1\end{bmatrix} ^{T}$ ,和我们程序算出来的本质是一样的,python程序里虽然结果数字不太好看,但是是将其处理成模长为 $1$ 的单位向量了。

3.1.2.三阶方阵举例

再看一个三阶方阵 $A=\begin{bmatrix} 6&-3&5 \\ -1&4&-5\\ -3&3&-4\end{bmatrix}$ ,我们还是用同样的方法来求其特征值和特征向量。
```
import numpy as np
from scipy import linalg

A = np.array([[6, -3, 5],

top Created with Sketch.