2

我正在运行一个需要计算矩阵逆的优化算法。该算法的目标是从矩阵 A 中消除负值并获得新的矩阵 B。基本上,我从相同大小的已知方阵 B 和 C 开始。

我首先计算矩阵 A,它等于:

A = B^-1 * C

或者在 Matlab 中:

A = B\C;

我使用这个是因为 Matlab 告诉我B\Cinv(B)*C.

然后将 A 中的负值除以 2,然后对 A 进行归一化,使其行长度为 1。使用这个新 A,我计算一个新 B:

(1/N) * A * C' = B^-1

其中 N 只是一个比例因子(A 中的列数)。然后,这个新的 B 将在第一步中再次使用,这些迭代将继续进行,直到 A 中的负数消失。

我的问题是我必须从第二个等式计算 B 然后对其进行归一化。

invB = (1/N)*A*C';
B = inv(invB);

我一直在使用 B 计算,inv(B^-1)但经过几次迭代后,我开始收到B^-1“接近奇异或缩放不良”的消息。

该算法实际上适用于较小的矩阵(大约 70x70),但是当它达到大约 500x500 时,我开始收到这些消息。

有没有更好的计算方法inv(B^-1)

4

2 回答 2

3

您绝对应该对奇异矩阵提出警告。当您向具有高条件数的矩阵移动时,数值线性代数的结果往往会崩溃。基本思想是如果

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 的“数值线性代数”,但任何关于数值代数的文本都应该解决其中的一些问题。

祝你好运,安德鲁

于 2012-03-09T20:37:23.857 回答
1

主要问题是您的矩阵具有很高的条件数(即在您的情况下非常小 rcond(B) )。我猜这是由于您的算法中的迭代结构。当您进行每次迭代时,您的小奇异值会越来越小,因此您的条件数会呈指数增长。您应该检查预处理以避免这种行为。

于 2012-03-09T18:05:34.660 回答