MATLAB: команда сохранения не работает

Я пытаюсь сохранить некоторые переменные в разные моменты времени в цикле while, используя команду «сохранить». Он работал в других программах, которые я написал ранее. Это первый раз, когда не сохраняется. Я пробовал много вещей, таких как переименование файла, в котором сохраняются данные, переименование скрипта, но это не работает. Вот пример кода:

T=0;
while T<300 (time loop)
loop1

loop2
.
.
.
if T==0.01
save('arbit100x100ht10e-3results.txt','Pnew','unew','-ascii','-append')
else if T==0.02
    save('arbit100x100ht10e-3results.txt','Pnew','unew','-ascii','-append')
else if T==0.04
        save('arbit100x100ht10e-3results.txt','Pnew','unew','-ascii','-append')
.
.
. (all the if-if else statements have their respective "end")


T=T+ht; %ht is time step

end (while loop)

Я не могу найти выход из этого.


person koolraj09    schedule 26.05.2013    source источник


Ответы (1)


Вероятно, такие условия, как if T==0.01, никогда не возникают из-за ограничения точности с плавающей запятой, что приводит к тому, что файлы не сохраняются.

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

T=0.9-0.8;
T==0.1
ans =
     0

вы видите, что T никогда не бывает ==0.1 из-за ограничения точности в том, как двойное представление представлено в двоичной форме:

T-0.1
ans =
   -2.7756e-17

Альтернативный метод сравнения состоит в том, чтобы проверить, являются ли два сравниваемых числа «достаточно близкими» (что выражается допуском) друг к другу. Попробуйте изменить условия if на что-то, включающее пороговый допуск, например:

if abs(T-0.01)<1e-10
    ...

Введение в арифметику с плавающей запятой см. в статье Cleve's Corner: Floating Points (PDF)

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

person bla    schedule 26.05.2013