我有3个数据矩阵A,B,C(全3x3),我使用下面的代码来计算D(p)的根X = 0
syms p
D = A + B*p + C*(p^2)
solP = double(solve(det(D)))
由此,我获得了solP的6个值。但是当我尝试将它替换回符号矩阵D时,如下所示,我得到det(D)的非零值
for i = 1:6
p = solP(i)
det(double(subs(D)) % Should be zero always as we are substituting roots
end
请帮助我理解这种行为。
编辑:: 示例:
A =
1.0e+11 *
4.8976 7.0936 6.7970
4.4559 7.5469 6.5510
6.4631 2.7603 1.6261
B =
1.0e+11 *
3.9223 7.0605 0.4617
6.5548 0.3183 0.9713
1.7119 2.7692 8.2346
C =
1.0e+11 *
6.9483 0.3445 7.6552
3.1710 4.3874 7.9520
9.5022 3.8156 1.8687
solP =
0.1061 + 0.0000i
1.5311 + 0.0000i
-0.3432 + 0.9356i
-0.3432 - 0.9356i
0.4228 - 0.5465i
0.4228 + 0.5465i
det(D) =
2.2143e+19
-5.4911e+20
-8.6415e+19 + 4.5024e+19i
-8.6415e+19 - 4.5024e+19i
-1.4547e+19 + 9.1135e+19i
-1.4547e+19 - 9.1135e+19i
答案 0 :(得分:1)
问题与relative accuracy of floating point values有关,通常为1e-16
。
输入矩阵的顺序为1e+11
- 1e+12
,解决方案的顺序为1e+0
,因此D
的元素也是1e+11
的顺序1}} - 1e+12
。要计算determinant of a 3x3 matrix,应该使用三个矩阵元素的乘积并加/减它们。因此,每个字词的大小为1e+33
- 1e+36
。如果您减去这样的值以获得行列式,则预期的准确度大约为1e+17
- 1e+20
。实际上,这与您获得的值相对应。鉴于相对准确性,您无法进一步达到零。
请注意,如果您缩放输入矩阵,即将其除以1e+11
,解决方案确实相同,但决定因素可能更符合您的预期。