【发布时间】:2014-07-24 04:23:18
【问题描述】:
在 Matlab 中,您可以使用 'nobalance' 选项发出 eig 函数。它与默认的到底有什么不同?
【问题讨论】:
-
mathworks.com/help/matlab/ref/eig.html#bti99ts-1 Matlab 使用数值方法进行矩阵分解。
标签: matlab eigenvector eigenvalue
在 Matlab 中,您可以使用 'nobalance' 选项发出 eig 函数。它与默认的到底有什么不同?
【问题讨论】:
标签: matlab eigenvector eigenvalue
来自mathworks 文档:
平衡选项,指定为两个字符串:
'balance',启用初步平衡步骤,或'nobalance',禁用它。在大多数情况下,平衡步骤会改进A的条件以产生更准确的结果。但是,在某些情况下,平衡会产生不正确的结果。 当A包含的值的大小差异很大时指定'nobalance'。例如,如果A包含非零整数以及非常小的(接近零)值,那么平衡步骤可能会缩放使它们与整数一样重要并产生不准确的结果。
编辑:相关函数balance 据说是eig 中的默认前一步。
注意documentation 中的几行 - “病态集中在缩放矩阵中”......“如果矩阵包含由于舍入误差而导致的小元素,平衡可能会放大它们以使它们与原始矩阵的其他元素一样重要。”
所以,我对@Isopycnal 问题的回答是“nobalance 在处理病态矩阵时抑制舍入误差的放大”。以下几点可能会有所帮助 -
A 本质上是在执行相似变换B = T\A*T,其中B 被称为“平衡矩阵”。 T。根据eig 的documentation 的说法,“在大多数情况下,平衡步骤会改进 A 的调节以产生更准确的结果。”1e-9)设为和大的一样重要(比如1e10)。 如果不仔细考虑,我们已经知道结果会不太精确。 我知道这与 Matlab 在执行eig 时选择的矩阵分解算法有关,例如@EJG89 指出的“铅笔分解 LU 分解等”。但它在我的记忆中太深了,无法回忆:(任何知道Matlab如何执行eig等命令的人请考虑扩展这个答案!谢谢!
【讨论】:
balance。 mathworks.com/help/matlab/ref/balance.html 据说是eig 中的默认前置步骤。注意几行 - “病态集中在缩放矩阵中” “如果矩阵包含由于舍入误差而导致的小元素,平衡可能会放大它们以使其具有显着性作为原始矩阵的其他元素。"
为了完整起见,平衡方法与 LAPACK 的 ?GEBAL 和 ?GEBAK 例程类似,但一些测试表明,由于结果偶尔会有所不同,因此存在一些修改。
平衡有助于通过相似变换来改善条件反射。然而,在某些情况下,平衡实际上会使问题变得更糟。记录在案的案例包括 Hessenberg 矩阵和具有数值噪声的矩阵,这些噪声被算法试图与实际数据平衡的缩放比例放大。根据问题,数据矩阵也被置换以使矩阵尽可能地成为上三角形式。
平衡算法也可以通过balance.m使用
工具箱深处的其他相关平衡例程是来自控制系统工具箱的mscale.m 和arescale.m 例程,它们提供了更精细的控制(请原谅双关语)。
【讨论】: