Добра практика ли е ръчно да задавате числа с голям отрицателен експоненциал като 1e-300 на нула, за да избегнете препълване в Matlab?
Ако не, как можем да избегнем вредата от препълване при внедряване на функции като log(1+exp(x))?
Добра практика ли е ръчно да задавате числа с голям отрицателен експоненциал като 1e-300 на нула, за да избегнете препълване в Matlab?
Ако не, как можем да избегнем вредата от препълване при внедряване на функции като log(1+exp(x))?
Обикновено получавате проблеми, когато добавяте много големи и много малки стойности, защото това може да доведе до голяма относителна грешка. Отървете се от това сумиране (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)))
много бавно, но получавате резултат с конфигурираната точност.
Никога не съм виждал случай, в който ръчното задаване на малки стойности на нула е добро решение, обикновено сравнението с толеранс е по-добро.
x==0
трябва да използвате малък толеранс abs(x)<t
, но няма добро правило за намиране на подходящ толеранс.
- person Daniel; 15.05.2014