Underflow в 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