Определенные функции MATLAB только с точностью до определенного десятичного числа?Насколько точен MATLAB на самом деле? - PullRequest
1 голос
/ 05 июня 2019

Я конвертирую программу из MATLAB 2012 в 2016. Я получаю некоторые странные ошибки, некоторые из которых, я полагаю, связаны с отсутствием точности в функциях MATLAB.

Например, у меня есть серия времен oldTs как таковая:

Time                   Data
-----------------------------
1.00000000000000001    1.277032377439511
1.00000000000000002    1.277032378456123
1.00000000000000003    1.277032380112478

У меня есть другой временной ряд newTs с похожими данными, но гораздо больше строк. oldTs может иметь полмиллиона строк, тогда как newTs может иметь миллион. Я хочу интерполировать данные из старых временных рядов с новыми временными рядами, например:

interpolatedTs = interp(oldTs.time, oldTs.data, newTs.time)

Это дает мне ошибку: x values must be distinct

Дело в том, что мои значения x различны . Я думаю, что MATLAB может обрезать некоторые данные, и, следовательно, полагая, что некоторые данные не являются уникальными. Я обнаружил, что другие функции MATLAB делают это:

test = [1.00000000000000001, 1.00000000000000002, 1.0000000000000000003]
unique(test)

ans =
     1

test2 = [10000000000000000001, 10000000000000000002, 10000000000000000003]
unique(test2)

ans =

     1.000000000000000e+19

MATLAB считает, что этот вектор имеет только одно уникальное значение вместо трех! Это огромная проблема для меня, так как мне нужно поддерживать высочайший уровень точности и точности с моими данными, и я не могу жертвовать какой-либо этой точностью. Скорость / Хранение не является фактором.

Обрезают ли определенные функции MATLAB по умолчанию данные с определенным n-ным десятичным знаком? Изменилось ли это с MATLAB 2012 на MATLAB 2016? Есть ли способ заставить MATLAB использовать определенную точность для программы? Почему MATLAB делает это для начала?

Любой свет, проливаемый на эту тему, высоко ценится. Спасибо.

1 Ответ

1 голос
/ 05 июня 2019

Нет, это не изменилось ни с 2012 года, ни с самой первой версии MATLAB. MATLAB по умолчанию использует и всегда использовал значения с плавающей запятой двойной точности (8 байт). Первое значение, большее 1, которое может быть представлено, - 1 + eps(1), с eps(1) = 2.2204e-16. В основном у вас есть меньше 16 десятичных цифр для игры. Ваше значение 1.00000000000000001 идентично 1 в представлении с плавающей запятой двойной точности.

Обратите внимание, что это не что-то особенное для MATLAB, это стандарт, которому соответствует ваше оборудование. MATLAB просто использует возможности вашего оборудования.

Используйте арифметику переменной точности из набора инструментов Symbolic Math для работы с числами с более высокой точностью:

data = [vpa(1) + 0.00000000000000001
        vpa(1) + 0.00000000000000002
        vpa(1) + 0.00000000000000003]

data =

 1.00000000000000001
 1.00000000000000002
 1.00000000000000003

Обратите внимание, что vpa(1.00000000000000001) не будет работать, поскольку число сначала интерпретируется как значение с плавающей запятой двойной точности, и только после преобразования в VPA, но урон уже был нанесен в этот момент.

Обратите внимание, что арифметика с VPA намного медленнее, и некоторые операции могут быть вообще невозможны.

...