2016-03-18 41 views
2

:Neden acos kullanarak karmaşık bir sayı alırım? İki vektörleri <code>x</code> ve <code>p</code> arasında açısını hesaplamak için aşağıdaki kodu kullanmak, örneğin

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

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

bir karmaşık sayı olduğu angle = 3.141592653589793 - 0.000000021073424i gösterir.

Ama hepimiz x ve p nokta ürünü -3 olduğunu biliyoruz ve x ve p normlarına ürünü, yani angle = acos(-3/3) 3, bu nedenle açı tam olarak pi, 3.14159 olmalıdır. MatLab neden karmaşık bir sayı veriyor ve sonuca gerçek bir sayıyı nasıl verebilirim?

+1

Ben MATLAB yakın değil' ama ara değer nedeniyle kayan noktasına çok yakın ama dışarıda [-1,1] aralığında aslında -1 değildir şey olduğunu kontrol edebilirsiniz: Daha iyi sayısal probabillities için bu şekilde yeniden yazın hatalar? – Amro

+0

Burada ilgili sayfa: http://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab (özellikle arasındaki karşılaştırmaya bakın "acos" ve "atan2" doğruluğu). – Amro

cevap

2

Senin sorunun normalleşme başlar:

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

hata yayılır ve oluşturmuş oluruz: Burada

norm(x) * norm(p) 

Eğer beklediğiniz 3 biraz kapalıdır bir değer elde x'in 1'in üzerinde bir acos (x) olduğu yerde.

sqrt, potansiyel olarak irasyonel sonuçlara neden olan bir işlemdir. Kalem ve kağıt ile çözerken, karekökünü koruyacak ve önce çarpmayı yapacaksınız.

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

Teşekkür ederim, bu harika bir çözüm! – FalloutRanger