例如,如果我使用以下代码来计算两个向量x
和之间的角度p
:
x = [1 1 -1];
p = [-1 -1 1];
angle = acos(dot(x,p) / (norm(x) * norm(p)));
它显示angle = 3.141592653589793 - 0.000000021073424i
,这是一个复数。
但是,我们都知道的点积x
和p
为-3,规范的产品x
,并p
为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)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句