行列式显示无穷大而不是零!为什么?

时间:2016-03-13 14:14:41

标签: matlab math matrix determinants

这是我为我作为家庭作业所遇到的问题而编写的matlab代码。在A和它的转置相乘后,得到的方阵应该具有所有同学的行列式零,因为它们的代码(不同的)给出了它们。为什么我的代码没有给出c和d的行列式无穷大

A = rand(500,1500);

b = rand(500,1);

c = (A.')*A;

detc = det(c);

cinv = inv((A.')*A);

d = A*(A.');

detd = det(d);

dinv = inv(A*(A.'));

x1 = (inv((A.')*A))*((A.')*b);

x2 = A.'*((inv(A*(A.')))*b);

3 个答案:

答案 0 :(得分:3)

det文档的Limitations section中解释了此行为,并在Find Determinant of Singular Matrix subsection中说明了这一行为:

  

A的决定因素非常大,尽管A是单数。事实上,A的决定因素应该恰好为零! d的不准确性是由于LU分解的MATLAB®实现中的舍入误差的汇总,det用来计算行列式。

也就是说,在这种情况下,可以通过使用同一页面上给出的m-code implementation生成您想要的结果,但在升序中排序U的对角元素物。考虑示例脚本:

clc();
clear();

A = rand(500,1500);
b = rand(500,1);
c = (A.')*A;

[L,U] = lu(c);
% Since det(L) is always (+/-)1, it doesn't impact anything
diagU = diag(U);
detU1 = prod(diagU);
detU2 = prod(sort(diagU,'descend'));
detU3 = prod(sort(diagU,'ascend'));

fprintf('Minimum: %+9.5e\n',min(abs(diagU)));
fprintf('Maximum: %+9.5e\n',max(abs(diagU)));
fprintf('Determinant:\n');
fprintf('\tNo Sort:          %g\n'  ,detU1);
fprintf('\tDescending Sort:  %g\n'  ,detU2);
fprintf('\tAscending Sort:   %g\n\n',detU3);

这会产生输出:

Minimum: +1.53111e-13
Maximum: +1.72592e+02
Determinant:
    No Sort:          Inf
    Descending Sort:  Inf
    Ascending Sort:   0

请注意,排序的方向很重要,而且由于真正的Inf在对角线上不存在,因此无排序会给出0。降序排序首先看到最大值乘以,显然,它们超过realmax并且永远不会乘以真0,这将生成NaN。上升排序将所有近零对角线值聚集在一起,只有非常少的大负值(事实上,更强大的方法会根据幅度进行排序,但这里没有这样做),并且它们的乘法生成一个真值{{1 (意味着该值低于IEEE-754算法中可用的最小非规范化数字),产生“正确”结果。

所有写的,正如其他人所暗示的那样,我将quote原始的Matlab开发人员和Mathworks联合创始人Cleve Moler:

  

[决定因素]在理论考虑和手工计算中很有用,但不能为稳健的数值软件提供合理的基础。

答案 1 :(得分:2)

确定。因此det(A' * A)不为零的事实不是A' * A的(非)奇点的良好指示。 行列式取决于缩放,而明确非矩阵的矩阵可以具有非常小的行列式。例如,矩阵 1/2 * I_n 其中I_n是nxn标识具有(1/2)^ n的行列式,当n变为无穷大时,它正在收敛(快速)为0。但是1/2 * I_n根本不是单数。

因此,检查矩阵奇点的最佳方法是条件数。

在你的情况下,做了一些测试后

>> A = rand(500, 1500) ;

>> det(A'*A)

ans =

   Inf

你可以看到(计算的)行列式显然是非零的。但这实际上并不令人惊讶,它不应该真的打扰你。决定因素相当难以计算,所以是的,它只是舍入错误。如果您想要更好的近似值,可以执行以下操作

>> s = eig(A'*A) ;
>> prod(s)

ans =

     0

在那里,你看到它接近于零。

另一方面,条件数是矩阵(非)奇点的更好的估计。在这里,它是

>> cond(A'*A)

ans =

   1.4853e+20

并且,由于它远大于1e + 16,因此矩阵显然是单数。 1e + 16的原因有点单调乏味,但主要是由于计算机在进行浮点计算时的精确度。

答案 2 :(得分:0)

我认为这几乎只是一个四舍五入的问题,Inf并不意味着你得到无限作为答案,只是你的决定因素真的很大并超过realmax。正如阿迪尔所说,A * A.生成对称矩阵,并且应该具有其行列式的数值。例如,设置:

A=rand(5,15)

你应该找到A * A的版本。只是一个数值。

那么你的朋友是如何得到一个零的,那么det大矩阵很容易得到0或inf(你为什么要这样做,我没有线索)。所以我认为他们只是得到了相同/类似的舍入问题。

相关问题