# eigvals


返回 A 的特征值

函数库: TyMath

对于一般的非对称矩阵,可以在特征值计算之前指定矩阵的平衡方式。

permute、scale 和 sortby 关键字与 eigen! 相同。

# 语法

eigvals(A)
eigvals(A,B)
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange)
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real)

# 说明

eigvals(A) 对于标量输入,eigvals 将返回一个标量。示例


eigvals(A,B) 计算 A 和 B 的广义特征值。示例


eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) 返回 A 的特征值。通过指定一个 UnitRange irange 覆盖排序特征值的索引,可以只计算特征值的一个子集,例如第二到第八个特征值。示例


eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) 返回 A 的特征值。可以通过为特征值的上下边界指定一对 vl 和 vu 来仅计算特征值的子集。

提示

不同电脑可能结果有差异。

# 示例

标量

计算 -2 的特征值。

using TyMath
eigvals(-2)
ans = -2

对于标量输入,eigvals 将返回一个标量。

广义特征值
using TyMath
A = [1 0; 0 -1]
B = [0 1; 1 0]
A = 2×2 Matrix{Int64}:
1   0
0  -1
B = 2×2 Matrix{Int64}:
0  1
1  0

计算 A,B 的广义特征值。

eigvals(A,B)
ans = 2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
计算特征值的子集
using TyMath
A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
eigvals(A, 2:2)
ans =
1-element Vector{Float64}:
0.9999999999999996
eigvals(A)
ans = 3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
矩阵特征值

使用 gallery 创建一个对称正定矩阵。

using TyMath
A = TestArrays.lehmer(4)
4×4 Matrix{Float64}:
 1.0       0.5       0.333333  0.25
 0.5       1.0       0.666667  0.5
 0.333333  0.666667  1.0       0.75
 0.25      0.5       0.75      1.0

计算 A 的特征值。结果为一个列向量。

e = eigvals(A)
4-element Vector{Float64}:
 0.20777548591801157
 0.4078328841178752
 0.8482291554779128
 2.5361624744862006
矩阵的特征值和特征向量

使用 gallery 创建循环矩阵。

using TyMath
# 生成循环矩阵 A
A = TestArrays.circul( 3)
3×3 Matrix{Float64}:
 1.0  2.0  3.0
 3.0  1.0  2.0
 2.0  3.0  1.0

计算 A 的特征值和右特征向量。

# 计算 A 的特征值和特征向量
eig_result = eigen(A)
Eigen{ComplexF64, ComplexF64, Matrix{ComplexF64}, Vector{ComplexF64}}
values:
3-element Vector{ComplexF64}:
              -1.5 - 0.8660254037844389im
              -1.5 + 0.8660254037844389im
 5.999999999999999 + 0.0im
vectors:
3×3 Matrix{ComplexF64}:
 0.288675+0.5im  0.288675-0.5im  -0.57735+0.0im
 -0.57735-0.0im  -0.57735+0.0im  -0.57735+0.0im
 0.288675-0.5im  0.288675+0.5im  -0.57735+0.0im

提取特征向量和特征值。

V = eig_result.vectors
d = eig_result.values
3-element Vector{ComplexF64}:
              -1.5 - 0.8660254037844389im
              -1.5 + 0.8660254037844389im
 5.999999999999999 + 0.0im
排序的特征值和特征向量

计算 5×5 幻方矩阵的特征值和特征向量。

using TyMath
A = magic(5)
5×5 Matrix{Int64}:
 17  24   1   8  15
 23   5   7  14  16
  4   6  13  20  22
 10  12  19  21   3
 11  18  25   2   9

计算 A 的特征值和特征向量。

eig_result = eigen(A)
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
5-element Vector{Float64}:
 -21.27676547147382
 -13.126280930709227
  13.126280930709221
  21.276765471473777
  65.00000000000003
vectors:
5×5 Matrix{Float64}:
  0.0976401  -0.632977  -0.261861   0.67801    -0.447214
  0.352539    0.589481  -0.173165   0.32228    -0.447214
  0.550111   -0.39153    0.39153   -0.550111   -0.447214
 -0.32228     0.173165  -0.589481  -0.352539   -0.447214
 -0.67801     0.261861   0.632977  -0.0976401  -0.447214

提取特征向量和特征值。

d = eig_result.values
5-element Vector{Float64}:
 -21.27676547147382
 -13.126280930709227
  13.126280930709221
  21.276765471473777
  65.00000000000003
不可对角化(亏损)矩阵的特征值
创建一个 3×3 矩阵。
using TyMath
# 定义矩阵 A
A = [3 1 0;
     0 3 1;
     0 0 3]
3×3 Matrix{Int64}:
 3  1  0
 0  3  1
 0  0  3

计算 A 的特征值和右特征向量。

eig_result = eigen(A)
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
 3.0
 3.0
 3.0
vectors:
3×3 Matrix{Float64}:
 1.0  -1.0           1.0
 0.0   6.66134e-16  -6.66134e-16
 0.0   0.0           4.43734e-31
D = eig_result.values
D = diagm(D)
V = eig_result.vectors
x = A*V - V*D
3×3 Matrix{Float64}:
 0.0  8.88178e-16  -8.88178e-16
 0.0  0.0           3.9443e-31
 0.0  0.0           0.0
广义特征值

创建两个矩阵(A 和 B),然后求解对组 (A,B) 的特征值和右特征向量的广义特征值问题。

using TyMath
A = [1/sqrt(2) 0; 0 1]
B = [0 1; -1/sqrt(2) 0]
2×2 Matrix{Float64}:
  0.0       1.0
 -0.707107  0.0

获取特征值和特征向量。

D, V = eigen(A, B)
D = diagm(D)
2×2 Matrix{ComplexF64}:
 0.0-1.0im  0.0+0.0im
 0.0+0.0im  0.0+1.0im

计算 A * V - B * V * D。

x = A*V - B*V*D
x = real(x)
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0
病态矩阵使用 QZ 算法得出广义特征值
创建病态对称矩阵,其包含的值接近计算机精度。
using TyMath
# 设置格式
println("format long e");
# 定义矩阵 A
A = Diagonal([1e-16, 1e-15]);
format long e
2×2 Diagonal{Float64, Vector{Float64}}:
 1.0e-16   ⋅ 
  ⋅       1.0e-15

计算广义特征值和特征向量。

D1, V1 = eigen(A, A);
format long e
GeneralizedEigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
2-element Vector{Float64}:
 1.0
 1.0
vectors:
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0

使用 qz 计算广义特征值和特征向量。

D2, V2 = eigen(A, A);
res = A * V2 - A * (V2 * Diagonal(D2))
format long e
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0
一个矩阵为奇异矩阵的广义特征值

定义矩阵 A 和 B。

using TyMath
A = Matrix{Float64}(I, 2, 2)
B = [3 6;
     4 8]
2×2 Matrix{Int64}:
 3  6
 4  8

计算广义特征值和特征向量。

D, V = eigen(A, B);
GeneralizedEigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
2-element Vector{Float64}:
  0.09090909090909093
 Inf
vectors:
2×2 Matrix{Float64}:
 -0.75  -1.0
 -1.0    0.5

提取第一个特征值和对应的特征向量。

eigval = D[1];
eigvec = V[:, 1];
2-element Vector{Float64}:
 -0.75
 -1.0

计算 A * eigvec - eigval * B * eigvec。

res = A * eigvec - eigval * B * eigvec
2-element Vector{Float64}:
 1.1102230246251565e-16   
 2.220446049250313e-16  

# 输入参数

A - 输入矩阵
方阵

输入矩阵。

数据类型: Int | Float64 | Float32 | Float16

复数支持: 是

B - 广义特征值问题输入矩阵
方阵

广义特征值问题输入矩阵,指定为实数值或复数值方阵。B 必须与 A 具有相同的大小。

数据类型: Int | Float64 | Float32 | Float16

复数支持: 是

# 输出参数

e - 特征值(以向量的形式返回)
向量

特征值,以包含特征值(或对组的广义特征值)的列向量及重数的形式返回。每个特征值 e(k) 对应于右特征向量 V[:,k] 和左特征向量 W[:,k]。

  • 当 A 为实数对称或复数 Hermitian 矩阵时,满足 Av = λv 的 e 值为实数;
  • 当 A 为实数斜对称或复数斜 Hermitian 矩阵时,满足 Av = λv 的 e 值为虚数。

# 另请参阅

eigvecs | eigen | schur