我正在运行一个优化算法,需要计算矩阵的逆。该算法的目标是消除矩阵 A 中的负值并获得新的矩阵 B。基本上,我从已知的相同大小的方阵 B 和 C 开始。
我首先计算矩阵 A,它等于:
A = B^-1 * C
或者在 Matlab 中:
A = B\C;
我使用它是因为 Matlab 告诉我 B\C
比 inv(B)*C
更准确。
然后将 A 中的负值除以二,然后对 A 进行归一化,使其行长度为 1。使用这个新的 A,我计算出新的 B:
(1/N) * A * C' = B^-1
其中 N 只是一个比例因子(A 中的列数)。然后,这个新的 B 将在第一步中再次使用,并且这些迭代将继续,直到 A 中的负数消失。
我的问题是我必须根据第二个方程计算 B,然后将其标准化。
invB = (1/N)*A*C'; B = inv(invB);
我一直在使用 inv(B^-1)
计算 B,但经过几次迭代后,我开始收到消息称 B^-1
“接近单数”或规模严重”。
该算法实际上适用于较小的矩阵(大约 70x70),但当它达到大约 500x500 时,我开始收到这些消息。
有没有更好的方法来计算inv(B^-1)
?
最佳答案
您绝对应该注意有关奇异矩阵的警告。当您转向具有高条件数的矩阵时,数值线性代数的结果往往会崩溃。基本思想是如果
A*b_1 = c
我们实际上正在解决问题(因为我们使用计算机时使用的是近似数字)
(A + matrix error)*b_2 = (c + vector error)
作为矩阵和向量误差的函数,b_1 和 b_2 有多接近?当 A 的条件数较小时,b_1 和 b_2 接近。当 A 的条件数很大时,b_1 和 b_2 不接近。
您可以对您的算法进行一项信息丰富的分析。在每次迭代中,找到 B 后,使用 Matlab 查找它的条件数。这是
cond(B)
您可能会看到这个数字迅速攀升。这表明每次迭代算法时,您应该越来越不信任 B 的结果。
像这样的问题在数值数学中经常出现。如果您经常使用数值算法,您应该花一些时间来熟悉条件数在现场的作用以及如上所述的预处理技术。我最喜欢的文本是 Lloyd Trefethen 的“数值线性代数”,但任何有关数值代数的文本都应该解决其中一些问题。
祝你好运, 安德鲁
关于matlab - 在 Matlab 中计算逆矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9638658/