Ошибка в трилатерационном коде Matlab

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

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

1 ответ

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

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

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

Другие вопросы по тегам