Численные проблемы в Matlab: один и тот же ввод, тот же код -> другой вывод? - PullRequest
4 голосов
/ 31 августа 2010

У меня возникают проблемы при сравнении результатов разных запусков моего программного обеспечения Matlab с одним и тем же вводом. Чтобы сузить проблему, я сделал следующее:

  • сохранить все соответствующие переменные с помощью метода save () Matlab
  • вызов метода, который вычисляет что-то
  • снова сохранить все соответствующие выходные переменные, используя save ()

Не меняя вызываемый метод, я сделал еще один запуск с

  • загрузить переменные, сохраненные выше, и сравнить с текущими входными переменными, используя isequal ()
  • снова вызвать мой метод с текущими входными переменными
  • загрузить сохраненные выше переменные out и сравнить.

Я не могу поверить, что сравнение в последней "строке" обнаруживает небольшие различия. Расчеты включают числа одинарной и двойной точности, погрешность составляет 1e-10 (на выходе - двойное число).

Единственное возможное объяснение, которое я могу себе представить, это то, что либо Matlab теряет некоторую точность при сохранении переменных (что я считаю очень маловероятным, я использую двоичный формат Matlab по умолчанию), либо что есть вычисления, включенные как a = b + c + d , который может быть рассчитан как a = (b + c) + d или a = b + (c + d), что может привести к численным различиям.

Вы знаете, в чем может быть причина описанных выше наблюдений?

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 01 сентября 2010

это, кажется, действительно вызвано одинарным / двойным смешением в расчетах. Поскольку я переключился только на двойную точность, проблема больше не возникала. Спасибо всем за ваши мысли.

0 голосов
/ 31 августа 2010

Чтобы обеспечить воспроизводимые результаты, особенно если вы используете какие-либо случайные генерирующие функции (прямо или косвенно), вы должны восстанавливать одно и то же состояние в начале каждого запуска:

%# save state (do this once)
defaultStream = RandStream.getDefaultStream;
savedState = defaultStream.State;
save rndStream.mat savedState

%# load state (do this at before each run)
load rndStream.mat savedState
defaultStream = RandStream.getDefaultStream();
defaultStream.State = savedState;
0 голосов
/ 31 августа 2010

это могут быть ошибки округления. Вы можете найти точность вашей системы с плавающей запятой примерно так:

>> eps('single')

ans =

  1.1921e-07

В моей системе это сообщает 10 ^ -7, что объясняет расхождения в вашем заказе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...