圆盘定理Gershgorin Circle Theorem是用来预估矩阵特征值的范围的。这个定理用起来相当简单。对于一个n×nn\times nn×n的方阵来说,有nnn个行圆盘和列圆盘,它的特征值就位于这些圆盘中。所谓的圆盘Gershgorin disk,就是复平面上的一个圆,它有中心和半径组成,是这样定义的:
D(a,r)={x∈C:∣x−a∣≤r}D(a,r)=\{x \in \mathbb{C}:|x-a|\le r\} D(a,r)={x∈C:∣x−a∣≤r}
从定义看表示一个点的集合,那么中心和半径怎么确定呢?中心就是矩阵的对角线元素,半径则分两种,行圆盘和列圆盘。行圆盘的半径就是某一行除了对角线元素外,所有元素的模长的和,列圆盘则是某一列除了对角线元素外,所有元素的模长的和。既然每个中心有两个半径,那肯定取最小的那个半径喽,把半径用rrr表示,那么半径就是:
ri=min(∑j=1,j≠in∣aij∣,∑j=1,j≠in∣aji∣)r_i=min(\sum_{j=1,j\ne i}^{n}|a_{ij}|,\sum_{j=1,j\ne i}^{n}|a_{ji}|) ri=min(j=1,j=i∑n∣aij∣,j=1,j=i∑n∣aji∣)
比如计算这个矩阵的圆盘:
A=(30.40.20.20.230.10.10.40.540.5−0.310.51)A=\begin{pmatrix}3 & 0.4 & 0.2 & 0.2\\ 0.2 & 3 & 0.1 & 0.1\\ 0.4 & 0.5 & 4 & 0.5\\ -0.3 & 1 & 0.5 & 1\\ \end{pmatrix} A=30.20.4−0.30.430.510.20.140.50.20.10.51
得到的结果就是:
D(3,0.8),D(3,0.4),D(4,0.8),D(1,0.8)D(3,0.8),D(3,0.4),D(4,0.8),D(1,0.8) D(3,0.8),D(3,0.4),D(4,0.8),D(1,0.8)
因为D(3,0.4)D(3,0.4)D(3,0.4)比D(3,0.8)D(3,0.8)D(3,0.8)范围更小,所以最终结果是:
D(3,0.4),D(4,0.8),D(1,0.8)D(3,0.4),D(4,0.8),D(1,0.8) D(3,0.4),D(4,0.8),D(1,0.8)
所以矩阵A的特征值就位于复平面上这些圆盘中。
这种实现代码非常简单:
def gershgorin_disk(self):disks = [[0, 0] for _ in self.__lines]n = len(self.__lines)for i in range(n):d = disks[i]d[0]= self.__lines[i][i]line_radius = 0for j in range(n):if j != i:line_radius += abs(self.__lines[j][i])column_radius = 0for j in range(n):if j != i:column_radius += abs(self.__lines[i][j])d[1] = min(line_radius, column_radius)return disks