我正在运行一种优化算法,需要计算矩阵的逆矩阵。该算法的目标是从矩阵A中消除负值并获得新的矩阵B.基本上,我从相同大小的已知方阵B和C开始。
我首先计算矩阵A,它等于:
A = B ^ -1 * C
或者在Matlab中:
A = B\C;
我使用这个是因为Matlab告诉我B\C
比inv(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);
我一直在使用inv(B^-1)
计算B,但经过几次迭代后,我开始收到B^-1
“接近单数或严重缩放”的消息。
此算法实际上适用于较小的矩阵(大约70x70),但当它达到大约500x500时,我开始收到这些消息。
有没有更好的方法来计算inv(B^-1)
?
答案 0 :(得分: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的“数值线性代数”,但是数值代数的任何文本都应该解决其中的一些问题。
祝你好运, 安德鲁
答案 1 :(得分:1)
主要问题是您的矩阵具有较高的条件数(即在您的情况下非常小的rcond(B))。这是由于算法中的迭代结构,我猜。当您进行每次迭代时,您的小奇异值会越来越小,因此您的条件数会呈指数级增长。您应该检查preconditioning以避免此类行为。