为什么我用acos得到的是复数?

Why do I get a complex number using acos?

例如,如果我使用下面的代码来计算两个向量 xp 之间的角度:

x = [1 1 -1];
p = [-1 -1 1];

angle = acos(dot(x,p) / (norm(x) * norm(p)));

表示angle = 3.141592653589793 - 0.000000021073424i,是复数

但是我们都知道xp的点积是-3,xp的范数的乘积是3,所以 angle = acos(-3/3),所以角度应该正好是 pi,3.14159。为什么 MatLab 给出的是复数,如何将结果改为实数?

您的问题始于规范化:

norm(x) * norm(p)

这里您得到的值略微偏离您预期的 3

> (norm(x) * norm(p))-3
ans =   -4.4409e-16

错误被传播,你最终得到一个 acos(x),其中 x 略高于 1。

sqrt 是一种可能导致非理性结果的操作。用纸笔解的时候,先开平方,再做乘法。以这种方式重写它以获得更好的数值概率:

angle = acos(dot(x,p) / sqrt(sum(x.^2)*sum(p.^2)))