Недополнение в Matlab

Является ли хорошей практикой вручную устанавливать числа с большой отрицательной экспонентой, такие как 1e-300, на ноль, чтобы избежать недополнения в Matlab?

Если нет, как мы можем избежать вреда потери значимости при реализации таких функций, как log(1+exp(x))?


person user25004    schedule 13.05.2014    source источник


Ответы (1)


Как правило, возникают проблемы при добавлении очень больших и очень малых значений, поскольку это может привести к высокой относительной ошибке. Избавьтесь от этого суммирования (1 + exp (x)), оно быстро выходит за пределы диапазона двойных значений, когда x велико.

log(1+exp(x))
log(1+1/exp(x))*exp(x))
log(1+1/exp(x))+log(exp(x))
log(1+1/exp(x))+x

Альтернативой является использование vpa:

log(1+exp(vpa(10^6)))

очень медленно, но вы получаете результат с настроенной точностью.

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

person Daniel    schedule 13.05.2014
comment
Спасибо. Что вы подразумеваете под сравнением с толерантностью? Может быть, мы оба имеем в виду одно и то же? - person user25004; 15.05.2014
comment
Вместо x==0 вы должны использовать небольшой допуск abs(x)<t, но нет хорошего правила, чтобы найти правильный допуск. - person Daniel; 15.05.2014
comment
Конечно, устанавливая малые значения равными нулю, я имел в виду сначала найти малые значения с помощью порога, такого как abs(x)‹t, а затем установить их равными нулю, например. если abs(x)‹t, то x=0. - person user25004; 15.05.2014