2026a

# balance


对角线缩放以提高特征值准确性

函数库: TyMath

# 语法

B, T, S, P = balance(A)
B, T, S, P = balance(A,noperm)

# 说明

B, T, S, P = balance(A) 返回相似变换矩阵 T 、平衡矩阵 B,以使 B = T\A*T 和 B 具有尽可能接近的、近似相等的行列范数,以及缩放向量 S 和置换向量 P。这四者有关系 T[:,P] = diag(S) 和 B(P,P) = diag(1./S)*A*diag(S) 。T 是对角矩阵的置换矩阵,其元素是 2 的整数次幂,可防止引入舍入误差。如果 A 是对称的,则 B == A 和 T 是单位矩阵。示例


B, T, S, P = balance(A,noperm) 指定非置换指标,若该值为 true 则缩放 A,而不会置换其行和列。

# 示例

矩阵对角线缩放以提高特征值准确性

此示例说明基本思路。矩阵 A 右上角的元素较大,左下角的元素较小。该矩阵非常不对称。

using TyMath
A = [1 100 10000;.01 1 100;.0001 .01 1]
A = 3×3 Matrix{Float64}:

 1.0     100.0   10000.0
 0.01      1.0     100.0
 0.0001    0.01      1.0

平衡处理会生成一个对角矩阵 T(包含是 2 的幂的元素)和一个平衡矩阵 B(比 A 更对称)。

B,T, = balance(A)
B = 3×3 Matrix{Float64}:

 1.0     1.5625  1.2207
 0.64    1.0     0.78125
 0.8192  1.28    1.0

T = 3×3 Matrix{Float64}:

 512.0  0.0  0.0
   0.0  8.0  0.0
   0.0  0.0  0.0625

要查看特征向量的作用,请先计算 A 的特征向量,如此处的 V 的列所示。

V = eigen(A).vectors 
V = 3×3 Matrix{ComplexF64}:
  -0.999902-0.0im           -0.999902+0.0im            0.99995+0.0im
 0.00779085-0.0116044im    0.00779085+0.0116044im    0.0099995+0.0im
 2.20818e-5+0.000116044im  2.20818e-5-0.000116044im  9.9995e-5+0.0im

请注意,所有三个向量的第一个分量都是最大的。这说明 V 的条件不当;实际上 cond(V) 为 9442.981991064049。然后,查看 B 的特征向量。

V = eigen(B).vectors
V = 3×3 Matrix{ComplexF64}:
 -0.604457-0.0im       -0.604457+0.0im        0.69326+0.0im
   0.30142-0.448964im    0.30142+0.448964im  0.443687+0.0im
  0.109353+0.574674im   0.109353-0.574674im  0.567919+0.0im

现在,特征向量将正常运行,并且 cond(V) 为 1.4830478466951924。条件不当数在缩放矩阵中进行了压缩;cond(T) 为 8192.0。

本示例较小且并未进行大幅缩放,因此,计算的 A 和 B 的特征值在舍入误差界限内一致;平衡几乎不会对计算结果产生任何影响。

# 输入参数

A - 输入矩阵
矩阵

输入矩阵。A 不可以是稀疏矩阵。

数据类型: Float | Int

复数支持: 是

noperm - 置换指标
ture (默认) |false

置换指标,若该值为 true 则缩放 A,而不会置换其行和列。

数据类型: Bool

# 输出参数

B - 平衡矩阵
矩阵

平衡矩阵 B 。

数据类型: Float | Int

T - 相似变换矩阵
矩阵

相似变换矩阵,其元素是 2 的整数次幂。

数据类型: Float | Int

S - 缩放向量
向量

缩放向量。

数据类型: Float | Int

P - 置换向量
向量

置换向量,当 noperm=false 时有效。

数据类型: Int

# 局限性

平衡可能会破坏某些矩阵的属性;请谨慎使用。如果矩阵含有由于舍入误差产生的小元素,平衡可能对其放大,使其与原矩阵中的其他元素一样有效。

# 提示

  • 非对称矩阵可包含条件不当的特征值。矩阵中的细微扰动(例如,舍入误差)可导致特征值发生巨大扰动。特征向量矩阵的条件数,

    cond(V) = norm(V)*norm(inv(V))

    其中

    V = eigen(A).vectors

    将矩阵扰动大小与特征值扰动大小相关联。请注意,A 自身的条件数与特征值问题不相关。

    平衡是尝试将任何条件设置错误的特征向量矩阵集中到对角线缩放。平衡处理通常无法将非对称矩阵转换为对称矩阵;它仅尝试使各行的范数等于相应列的范数。

# 另请参阅

eigen