实对称矩阵的对角线元素是特征值吗特征值之和等于特征值吗?

实对称矩阵的特征值是对角线上的元素。实对称矩阵的特征值之和等于对角线上的元素之和,设A是n阶方阵,如果存在数m和非零n维列向量x,使得Ax=mx成立,则称m是矩阵A的一个特征值或本征值,实对称矩阵A的特征值都是实数,特征向量都是实向量,n阶实对称矩阵A必可对角化,且相似对角阵上的元素即为矩阵本身特征值。特征值是什么设A为n阶矩阵,若存在常数λ及n维非零向量x,使得Ax=λx,则称λ是矩阵A的特征值,x是A属于特征值λ的特征向量,其中A和B为矩阵,其广义特征值λ 可以通过求解方程(A-λB)ν=0,得到det(A-λB)=0,其中det即行列式构成形如A-λB的矩阵的集合。正交矩阵是什么正交矩阵是指其转置等于逆的矩阵,假设A是一个n阶方阵,Aт是A的转置,如果有AтA=E,则称A是正交矩阵,在矩阵论中,实数正交矩阵是方块矩阵Q,它的转置矩阵是它的逆矩阵,如果正交矩阵的行列式为+1,则称之为特殊正交矩阵。
今世伴明月 精选回答 n阶矩阵一定有n个特征值。因为特征值是特征多项式的根,n阶方阵的特征多项式是个n次多项式,根据代数基本定理,n次多项式有且只有n个根(重根按重数计算),这些根可能是实数,也可能是复数。更加详细的说法为:一个n阶矩阵一定有n个特征值(包括重根),也可能是复根。一个n阶实对称矩阵一定有n个实特征值(包括重根)。每一个特征值至少有一个特征向量(不止一个)。不同特征值对应特征向量线性无关。扩展资料:特征多项式:对布于上的矩阵,特征多项式为。这是一个n次多项式,其首项系数为一。一般而言,对布于任何交换环上的方阵都能定义特征多项式。要理解特征多项式,首先需要了解一下特征值与特征向量,这些都是联系在一起的:设A是n阶矩阵,如果数λ和n维非零列向量x使得关系式Ax=λx成立,那么,这样的数λ就称为方阵A的特征值,非零向量x称为A对应于特征值λ的特征向量。然后,就可以对关系式进行变换:(A-λE)x=0 其中E为单位矩阵。这是n个未知数n个方程的齐次线性方程组,它有非零解的充要条件是系数行列式为0,即|A-λE|=0。带入具体的数字或者符号,可以看出该式是以λ为未知数的一元n次方程。称为方阵A的特征方程,左端
A-λE|是λ的n次多项式,也称为方阵A的特征多项式。这是一个n次多项式,其首项系数为一。一般而言,对布于任何交换环上的方阵都能定义特征多项式。要理解特征多项式,首先需要了解一下特征值与特征向量,这些都是联系在一起的:设A是n阶矩阵,如果数λ和n维非零列向量x使得关系式Ax=λx成立,那么,这样的数λ就称为方阵A的特征值,非零向量x称为A对应于特征值λ的特征向量。然后,我们也就可以对关系式进行变换:(A-λE)x=0 其中E为单位矩阵。这是n个未知数n个方程的齐次线性方程组,它有非零解的充要条件是系数行列式为0,即|A-λE|=0。带入具体的数字或者符号,可以看出该式是以λ为未知数的一元n次方程。故称为方阵A的特征方程,左端
A-λE|是λ的n次多项式,也称为方阵A的特征多项式。 猎虎 2021-10-06 12:37:54

引言
ARPACK 1 是一个Fortran软件包,它提供了快速查找大型稀疏矩阵的几个特征值/特征向量的例程。为了找到这些解,只需要用所讨论的矩阵左乘即可。此操作通过 reverse-communication 接口。这种结构的结果是ARPACK能够找到将向量映射到向量的任何线性函数的特征值和特征向量。
ARPACK中提供的所有功能都包含在两个高级接口中 scipy.sparse.linalg.eigs 和 scipy.sparse.linalg.eigsh 。 eigs 提供用于查找实或复非对称方阵的特征值/向量的接口,而 eigsh 为实对称矩阵或复埃尔米特矩阵提供接口。
基本功能
ARPACK可以解决以下形式的任一标准特征值问题
\[a\mathbf{x}=\lambda\mathbf{x}\]
或一般形式的特征值问题
\[A\mathbf{x}=\lambda M\mathbf{x}。\]
ARPACK的强大之处在于它只能计算特征值/特征向量对的指定子集。这是通过关键字 which 。下列值为 which 提供:
which = 'LM' :具有最大幅度的特征值 (eigs , eigsh ),即复数的欧几里得范数的最大特征值。
which = 'SM' :具有最小幅度的特征值 (eigs , eigsh ),即复数的欧几里得范数的最小特征值。
which = 'LR' :具有最大实部的特征值 (eigs )。
which = 'SR' :实部最小的特征值 (eigs )。
which = 'LI' :虚部最大的特征值 (eigs )。
which = 'SI' :虚部最小的特征值 (eigs )。
which = 'LA' :具有最大代数值的特征值 (eigsh ),即包含任何负号的最大特征值。
which = 'SA' :具有最小代数值的特征值 (eigsh ),即包含任何负号的最小特征值。
which = 'BE' :来自光谱两端的特征值 (eigsh )。
请注意,ARPACK通常更善于寻找极值特征值,即具有较大幅度的特征值。特别是,使用 which = 'SM' 可能会导致执行时间较慢和/或结果异常。更好的方法是使用 shift-invert mode 。
移位-反转模式
Shift-Invert模式依赖于以下观察结果。关于广义特征值问题
\[A\mathbf{x}=\lambda M\mathbf{x},\]
可以看出,
\[(a-\sigma M)^{-1}M\mathbf{x}=\nu\mathbf{x},\]
哪里
\[\nu=\frac{1}{\lambda-\sigma}。\]
示例
假设您想要找出一个大矩阵的最小和最大特征值以及相应的特征向量。ARPACK可以处理多种形式的输入:密集矩阵,例如 numpy.ndarray 实例,稀疏矩阵,如 scipy.sparse.csr_matrix ,或派生自的一般线性运算符 scipy.sparse.linalg.LinearOperator 。对于本例,为简单起见,我们将构造一个对称的正定矩阵。
>>> import numpy as np
>>> from scipy.linalg import eig, eigh
>>> from scipy.sparse.linalg import eigs, eigsh
>>> np.set_printoptions(suppress=True)
>>> rng = np.random.default_rng()
>>>
>>> X = rng.random((100, 100)) - 0.5
>>> X = np.dot(X, X.T)
# create a symmetric matrix
现在我们有了一个对称矩阵 X ,用来测试例程。首先,使用以下命令计算标准特征值分解 eigh :
>>> evals_all, evecs_all = eigh(X)
作为一个维度, X 随着时间的增长,这个例程会变得非常慢。特别地,如果只需要几个特征向量和特征值, ARPACK 可能是个更好的选择。首先,让我们计算最大特征值 (which = 'LM' )的 X 并将它们与已知结果进行比较:
>>> evals_large, evecs_large = eigsh(X, 3, which='LM')
>>> print(evals_all[-3:])
[29.22435321 30.05590784 30.58591252]
>>> print(evals_large)
[29.22435321 30.05590784 30.58591252]
>>> print(np.dot(evecs_large.T, evecs_all[:,-3:]))
array([[-1.
0.
0.],
# may vary (signs)
[ 0.
1.
0.],
[-0.
0. -1.]])
结果不出所料。ARPACK恢复所需的特征值,并且它们与先前已知的结果相匹配。此外,正如我们预期的那样,特征向量是正交的。现在,让我们尝试求解具有最小幅度的特征值:
>>> evals_small, evecs_small = eigsh(X, 3, which='SM')
Traceback (most recent call last):
# may vary (convergence)
...
scipy.sparse.linalg.eigen.arpack.arpack.ArpackNoConvergence:
ARPACK error -1: No convergence (1001 iterations, 0/3 eigenvectors converged)
哎呀。我们看到,如上所述, ARPACK 不太擅长寻找小的特征值。有几种方法可以解决这个问题。我们可以提高容忍度 (tol )要实现更快的融合,请执行以下操作:
>>> evals_small, evecs_small = eigsh(X, 3, which='SM', tol=1E-2)
>>> evals_all[:3]
array([0.00053181, 0.00298319, 0.01387821])
>>> evals_small
array([0.00053181, 0.00298319, 0.01387821])
>>> np.dot(evecs_small.T, evecs_all[:,:3])
array([[ 0.99999999
0.00000024 -0.00000049],
# may vary (signs)
[-0.00000023
0.99999999
0.00000056],
[ 0.00000031 -0.00000037
0.99999852]])
这是可行的,但是我们失去了结果中的精确度。另一种选择是增加最大迭代次数 (maxiter )从1000到5000:
>>> evals_small, evecs_small = eigsh(X, 3, which='SM', maxiter=5000)
>>> evals_all[:3]
array([0.00053181, 0.00298319, 0.01387821])
>>> evals_small
array([0.00053181, 0.00298319, 0.01387821])
>>> np.dot(evecs_small.T, evecs_all[:,:3])
array([[ 1.
0.
0.],
# may vary (signs)
[-0.
1.
0.],
[ 0.
0. -1.]])
我们得到了我们希望的结果,但是计算时间要长得多。幸运的是, ARPACK 包含允许快速确定非外部特征值的模式: shift-invert mode 。如上所述,该模式涉及将特征值问题转换为具有不同特征值的等价问题。在这种情况下,我们希望找到接近零的特征值,所以我们选择 sigma = 0 。然后,变换后的特征值将满足 \(\nu = 1/(\lambda - \sigma) = 1/\lambda\) ,所以我们的小特征值 \(\lambda\) 变成大的特征值 \(\nu\) 。
>>> evals_small, evecs_small = eigsh(X, 3, sigma=0, which='LM')
>>> evals_all[:3]
array([0.00053181, 0.00298319, 0.01387821])
>>> evals_small
array([0.00053181, 0.00298319, 0.01387821])
>>> np.dot(evecs_small.T, evecs_all[:,:3])
array([[ 1.
0.
0.],
# may vary (signs)
[ 0. -1. -0.],
[-0. -0.
1.]])
我们用更少的计算时间得到了我们所希望的结果。请注意,从 \(\nu \to \lambda\) 完全在后台进行。用户不需要担心细节。
移位-反转模式提供的不仅仅是获得几个小特征值的快速方法。比方说,您希望找到内部特征值和特征向量,例如,最接近于 \(\lambda = 1\) 。简单设置 sigma = 1 而阿帕克将打理睡觉:
>>> evals_mid, evecs_mid = eigsh(X, 3, sigma=1, which='LM')
>>> i_sort = np.argsort(abs(1. / (1 - evals_all)))[-3:]
>>> evals_all[i_sort]
array([0.94164107, 1.05464515, 0.99090277])
>>> evals_mid
array([0.94164107, 0.99090277, 1.05464515])
>>> print(np.dot(evecs_mid.T, evecs_all[:,i_sort]))
array([[-0.
1.
0.],
# may vary (signs)
[-0. -0.
1.],
[ 1.
0.
0.]]
本征值以不同的顺序出现,但它们都在那里。请注意,移位-反转模式需要矩阵逆的内部解。这是由以下人员自动处理的 eigsh 和 eigs ,但是操作也可以由用户指定。请参阅的文档字符串 scipy.sparse.linalg.eigsh 和 scipy.sparse.linalg.eigs 有关详细信息,请参阅。
LinearOperator的使用
我们现在考虑这样一种情况,即您希望避免创建密集矩阵并使用 scipy.sparse.linalg.LinearOperator 取而代之的是。我们的第一个线性运算符在输入向量和向量之间应用按元素相乘 \(\mathbf{{d}}\) 由用户提供给操作员本身。此运算符模拟具有以下元素的对角矩阵 \(\mathbf{{d}}\) 它的主要优点是正向运算和伴随运算是简单的基于元素的乘法,而不是矩阵向量乘法。对于对角矩阵,我们期望特征值等于沿着主对角线的元素,在本例中 \(\mathbf{{d}}\) 。求出的特征值和特征向量 eigsh 与使用 eigh 当应用于密集矩阵时:
>>> from scipy.sparse.linalg import LinearOperator
>>> class Diagonal(LinearOperator):
...
def __init__(self, diag, dtype='float32'):
...
self.diag = diag
...
self.shape = (len(self.diag), len(self.diag))
...
self.dtype = np.dtype(dtype)
...
def _matvec(self, x):
...
return self.diag*x
...
def _rmatvec(self, x):
...
return self.diag*x
>>> N = 100
>>> rng = np.random.default_rng()
>>> d = rng.normal(0, 1, N).astype(np.float64)
>>> D = np.diag(d)
>>> Dop = Diagonal(d, dtype=np.float64)
>>> evals_all, evecs_all = eigh(D)
>>> evals_large, evecs_large = eigsh(Dop, 3, which='LA', maxiter=1e3)
>>> evals_all[-3:]
array([1.53092498, 1.77243671, 2.00582508])
>>> evals_large
array([1.53092498, 1.77243671, 2.00582508])
>>> print(np.dot(evecs_large.T, evecs_all[:,-3:]))
array([[-1.
0.
0.],
# may vary (signs)
[-0. -1.
0.],
[ 0.
0. -1.]]
在本例中,我们创建了一个快速而简单的 Diagonal 接线员。外部库 PyLops 中提供了类似的功能。 Diagonal 运算符以及其他几个运算符。
最后,我们考虑一个模仿一阶导数模板应用的线性算子。在这种情况下,运算符等价于实的非对称矩阵。我们再次将估计的特征值和特征向量与对输入信号应用相同一阶导数的密集矩阵中的特征值和特征向量进行比较:
>>> class FirstDerivative(LinearOperator):
...
def __init__(self, N, dtype='float32'):
...
self.N = N
...
self.shape = (self.N, self.N)
...
self.dtype = np.dtype(dtype)
...
def _matvec(self, x):
...
y = np.zeros(self.N, self.dtype)
...
y[1:-1] = (0.5*x[2:]-0.5*x[0:-2])
...
return y
...
def _rmatvec(self, x):
...
y = np.zeros(self.N, self.dtype)
...
y[0:-2] = y[0:-2] - (0.5*x[1:-1])
...
y[2:] = y[2:] + (0.5*x[1:-1])
...
return y
>>> N = 21
>>> D = np.diag(0.5*np.ones(N-1), k=1) - np.diag(0.5*np.ones(N-1), k=-1)
>>> D[0] = D[-1] = 0 # take away edge effects
>>> Dop = FirstDerivative(N, dtype=np.float64)
>>> evals_all, evecs_all = eig(D)
>>> evals_large, evecs_large = eigs(Dop, 4, which='LI')
>>> evals_all_imag = evals_all.imag
>>> isort_imag = np.argsort(np.abs(evals_all_imag))
>>> evals_all_imag = evals_all_imag[isort_imag]
>>> evals_large_imag = evals_large.imag
>>> isort_imag = np.argsort(np.abs(evals_large_imag))
>>> evals_large_imag = evals_large_imag[isort_imag]
>>> evals_all_imag[-4:]
array([-0.95105652, 0.95105652, -0.98768834, 0.98768834])
>>> evals_large_imag
array([0.95105652, -0.95105652, 0.98768834, -0.98768834])
注意,这个算符的特征值都是虚数的。而且,关键字 which='LI' 的 scipy.sparse.linalg.eigs 生成具有最大绝对虚部(正负)的特征值。同样,一阶导数运算符的更高级实现可在 PyLops 库,名称为 FirstDerivative 接线员。
参考文献
1
http://www.caam.rice.edu/software/ARPACK/

我要回帖

更多关于 实对称矩阵的对角线元素是特征值吗 的文章

 

随机推荐