矩阵乘法简化在代码中不给出相同的结果

Matrix Multiplication Simplification not giving same results in code

提问人:k12345 提问时间:12/3/2022 更新时间:12/3/2022 访问量:38

问:

我想在 Matlab 中计算表达式 xTAx -2y T Ax+yTAy

如果我的计算是正确的,这应该等同于求解(x-y)TA(x-y)

我现在的主要问题是我没有从上述两个表达式中得到相同的结果。我想知道这是精度错误还是概念错误。

我尝试了一个非常简单的例子,其中包含一些随机值来检查我的数学是否正确。我使用的迷你示例如下

A = [1,2,0;2,1,2;0,2,1];

x = [1;2;3];

y = [4;4;4];
(transpose(x)*A*x)-(2*transpose(y)*A*x)+(transpose(y)*A*(y))
transpose(x-y)*A*(x-y) 

两者都给了 46。

然后,我尝试了一个更现实的价值观示例,但它失败了。例如

A = [2.66666666666667,-0.333333333333333,0,-0.333333333333333,-0.333333333333333,0,0,0,0;
-0.333333333333333,2.66666666666667,-0.333333333333333,-0.333333333333333,-0.333333333333333,-0.333333333333333,0,0,0;
0,-0.333333333333333,2.66666666666667,0,-0.333333333333333,-0.333333333333333,0,0,0;
-0.333333333333333,-0.333333333333333,0,2.66666666666667,-0.333333333333333,0,-0.333333333333333,-0.333333333333333,0;
-0.333333333333333,-0.333333333333333,-0.333333333333333,-0.333333333333333,2.66666666666667,-0.333333333333333,-0.333333333333333,-0.333333333333333   -0.333333333333333;
0,-0.333333333333333,-0.333333333333333,0,-0.333333333333333,2.66666666666667,0,-0.333333333333333,-0.333333333333333;
0,0,0,-0.333333333333333,-0.333333333333333,0,2.66666666666667,-0.333333333333333,0;
0,0,0,-0.333333333333333,-0.333333333333333,-0.333333333333333,-0.333333333333333,2.66666666666667,-0.333333333333333;
0,0,0,0,-0.333333333333333,-0.333333333333333,0,-0.333333333333333,2.66666666666667];


x =[1.21585420370805;
1.00388159497757e-16;
-0.405284734569351;
1.36809776609658e-16;
-1.04796659533634e-17;
-7.52459042423650e-17;
-0.607927101854027;
-8.49163704356314e-17;
0.303963550927013];

v =[0.0319067068305797,0.00786616506360615,0.0709811622828447,0.0719615328671117;
1.26150800194897e-17,5.77584497721720e-18,7.89740111567879e-18,7.14396333930938e-18;
-0.158358815125228,-0.876275686098803,0.0539216716399594,0.0450616819309899;
7.90937837037453e-18,3.24196519177793e-18,3.99402664932776e-18,4.17486202509670e-18;
5.35533279761622e-18,-8.91723780863019e-19,-1.56128480212603e-18,1.84423677629470e-19;
-2.18478057810330e-17,-6.63779320738873e-18,-3.21099714760257e-18,-3.93612240449303e-18;
-0.0213963226092681,-0.0168256143048771,-0.0175695110350900,-0.0128155908603601;
-4.06029341772399e-18,-5.65705978843172e-18,-1.80182480882056e-18,-1.59281757789645e-18;
0.221482525259710,-0.0576644539359728,0.0163934384910353,0.0197432976432437];

u = [1.37058079022968;
1.79302486419321;
69.4330887239959;
-52.3949662214410];

y = v*u;

第一个表达式为 0,第二个表达式为 7.1387e-28。这是精度误差吗?哪个版本更好/更准确,为什么?谢谢!

MATLAB 精密 浮动精度

评论


答:

0赞 Anthrados 12/3/2022 #1

我没有检查你的简化,但浮点数学通常是不准确的。即使以不同的顺序执行相同的操作也会给您带来不同的结果。根据你所看到的偏差,我相信它们可能合理地来自浮点数学的不精确性,由你来决定这些偏差是否符合你的目的。 要确定哪个版本更准确,您必须计算要比较的参考值,这可能很困难。