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