为什么我使用acos获得复数?

时间:2016-03-18 20:29:11

标签: matlab trigonometry angle floating-accuracy

例如,如果我使用以下代码计算两个向量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,所以{ {1}},所以角度应该是pi,3.14159。为什么MatLab给出一个复数,我如何将结果改为实数呢?

1 个答案:

答案 0 :(得分:2)

您的问题始于规范化:

plt.xticks()

在这里,您获得的值略微偏离plt.plot(data['velocity']) plt.xticks(range(len(data['time'])), data['time']) 您所期望的值:

norm(x) * norm(p)

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

3是一种可能导致合理结果的操作。用笔和纸解决它时,你会保留平方根并先进行乘法运算。以这种方式重写它以获得更好的数值概率:

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