Как избежать ошибки числового переполнения с экспоненциальными членами?

1

Работа с численными расчетами, имеющими экспоненциальные термины, часто становится болезненной, благодаря ошибкам переполнения. Например, предположим, что у вас плотность вероятности, P(x)=C*exp(f(x)/k), где k - очень малое число, например порядка 10^(-5).

Чтобы найти значение C, необходимо проинтегрировать P(x). Здесь возникает ошибка переполнения. Я знаю, что это также зависит от формы f(x). Но на этот момент предположим, что f(x)=sin(x).

Как бороться с такими проблемами?

Какие трюки мы можем использовать, чтобы избежать их?

Является ли серьезность таких проблем языковой зависимой? Если да, на каком языке следует писать свой код?

  • 3
    Разве обычный трюк не рассчитывается с логарифмами фактических значений и использует + вместо * ?
  • 1
    Это звучит как вопрос, гораздо лучше подходящий для scicomp.stackexchange.com. Особенно вопрос о том, какой язык программирования использовать здесь явно не по теме. Это также довольно широкий вопрос, спрашивайте здесь о конкретных и целенаправленных проблемах, а не о возможных уловках.
Показать ещё 8 комментариев
Теги:
fortran
numerical-methods
integer-overflow
exponential

2 ответа

1

Как я упоминал в комментариях, я настоятельно рекомендую использовать аналитические методы, насколько это возможно. Однако, если вы хотите вычислить интегралы вида

I=Integral[Exp[f(x)],{x,a,b}]

Где f (x) может потенциально переполнить экспоненту, тогда вы можете немного перенормировать систему следующим образом:

Предположим, что f (c) является максимумом f (x) в области [a, b], тогда вы можете написать:

I=Exp[f(c)] Integral[Exp[f(x)-f(c)],{x,a,b}]

Это уродливый трюк, но по крайней мере ваши экспоненты будут небольшими в интеграле.

примечание: только что понял, что это комментарий roygvib

  • 0
    @roygvib Не стесняйтесь написать это как ответ, и я удалю этот!
  • 0
    Привет без проблем Я попробовал немного численных экспериментов, и это работало с «не слишком большим» f (x). Но когда дело доходит до 10 ^ 5 и т. Д., Подынтегральная функция становится подобна дельта-функции, которая может быть проблематичной для числовой квадратуры (из-за слишком узкой ширины) ... Но в любом случае, некоторое (предварительное) масштабирование задачи может быть полезным , (В противном случае, я предполагаю, что может потребоваться более аккуратный подход (специфический для проблемы), такой как документ, показанный в комментариях.)
0

Один из вариантов - использование научной библиотеки GSL - GNU (доступны оболочки python и fortran). Существует функция gsl_sf_exp_e10_e которая согласно документации

вычисляет экспоненту \exp (x) с помощью типа gsl_sf_result_e10, чтобы вернуть результат с расширенным диапазоном. Эта функция может быть полезна, если значение \exp (x) переполнит числовой диапазон double.

Однако я хотел бы отметить, что он замедляется из-за дополнительных проверок во время оценки.

PS Как было сказано ранее, лучше использовать аналитические решения там, где это возможно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню