为什么我用acos得到的是复数?
Why do I get a complex number using acos?
例如,如果我使用下面的代码来计算两个向量 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)))
例如,如果我使用下面的代码来计算两个向量 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)))