Переполнение Python при расчете функции Гаусса - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь вычислить значение функции Гаусса, используя следующее определение

from math import e

def function(x):
    return 100 / (e**((x-2000)**2))**1/16

Но я получаю переполнение со значениями 20000, 30000, 1000000 и т. Д. Вы знаете обходной путь Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Мой совет - переделать формулу, взяв ее логарифм (т.е. преобразовать формулу с произведением терминов в сумму логарифма каждого термина), а затем взять экспоненту результата.

0 голосов
/ 22 января 2019
  1. Использование math.exp:

    100 / math.exp((x-2000)**2))**1/16
    

    Это более производительно и численно точно, чем e**.

  2. Обратите внимание, что ...**1/16, вероятно, не делает то, что вы хотите.** имеет более высокий приоритет оператора , чем /, поэтому приведенное выше эквивалентно (...**1)/16.Оберните дробь в скобках:

    100 / math.exp((x-2000)**2)**(1/16.0)
    

    Запись 16 в формате с плавающей запятой (16.0) для предотвращения целочисленного деления.

  3. Используйте правила экспоненты для включения1/16:

    100 / math.exp((x-2000)**2/16.0)
    

    Это уменьшает большие аргументы, что помогает повысить точность.

  4. Переверните знак аргумента и измените деление на умножение:

    100 * math.exp(-(x-2000)**2/16.0)
    

    В крайних случаях это будет недополнение вместо переполнения.В этой ситуации недопустимые потоки ведут себя гораздо лучше - вы просто получите ноль вместо OverflowError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...