2016-04-02 4 views
0

Написанный ниже код для трилатерации. В оцененных положениях узлов, представленных «ye» и «xe» (конец кода), вводится очень маленькая ошибка, например, в случае второго узла, то есть x (2) = 4 и y (2) = 4, по оценкам позиция равна xe (2) = 3,999999999999999 и ye (2) = 3,999999999999999 вместо 4,4. Аналогично, третий узел i.e x (3) = 3, y (3) = 0, оцененные позиции xe (3) = 3 (это нормально) и ye (3) = - 4.440892098500626e-16 вместо нуля. Пожалуйста, сообщите, что вызывает эту ошибку и как ее удалить. С наилучшими пожеланиями.Ошибка в коде trilateration Matlab

x = [1,4,3]; % X coordinates of the three nodes to be localized 
y = [4,4,0]; % X coordinates of the three nodes to be localized 

% X and Y coordinates of the three antennas(a, b and c) that will be used 
% to localize the three nodes mentioned above 
xa=2; ya=3; 
xb=1; yb=2; 
xc=3; yc=2; 

for i=1:3 
% Find distances from user to all 3 transmitters: 
da = sqrt((x(i)-xa)^2+(y(i)-ya)^2); 
db = sqrt((x(i)-xb)^2+(y(i)-yb)^2); 
dc = sqrt((x(i)-xc)^2+(y(i)-yc)^2); 

va = ((db*db-dc*dc) - (xb*xb-xc*xc) - (yb*yb-yc*yc))/2; 
vb = ((db*db-da*da) - (xb*xb-xa*xa) - (yb*yb-ya*ya))/2; 

temp1 = vb*(xc-xb) - va*(xa-xb); 
temp2 = (ya-yb)*(xc-xb) - (yc-yb)*(xa-xb); 

% Estimated user position: 
ye(i) = temp1/temp2; 
xe(i) = (va - y(i)*(yc-yb))/(xc-xb); 
end 

ответ

0

По умолчанию в MATLAB каждый номер вы создаете это 64-битные двойной точности с плавающей запятой (или «двойной»). Вы можете проверить это, например, проверив результат isa(42, 'double').

«Ошибка», которую вы упомянули, объясняется тем, что целые числа не обязательно имеют точное представление с плавающей запятой. На практике это не проблема (10e-16 - довольно небольшое число, не так ли?). Ваш код (по крайней мере с этой точки зрения, я не проверял вашу математику) в порядке. Не волнуйся.

Проверьте, имеется ли Wikipedia или подобный источник для получения дополнительной информации о том, как создаются числа с плавающей точкой.