# 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
不可对角化(亏损)矩阵的特征值
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 值为虚数。