Обработка больших чисел и точность Ricean Fading PDF python

Я пытаюсь рассчитать Ricean Fading PDF, используя следующее уравнение. RIcean Fading PDF. где «у» — нормализованная огибающая, а «гамма» — отношение сигнал-шум.

если значение К велико, то

math.exp(-((1.+_gamma)*pow(_y,2.) + _gamma))

exp приводит к большой плавающей запятой (например, 1.01e-5088). в python в качестве значения будет отображаться «0.0»

mpmath.besseli(0,2. * _y * np.sqrt(_gamma * (1. + _gamma)))

значение функции Бесселя показывает большое значение int (например, 7,78e+5092). в python он покажет значение «** inf **»

Как я могу сохранить большое целое число и значение с плавающей запятой в python и рассчитать PDF?

def rice_pdf(self, _y, _gamma):
   return 2. * _y * (1. + _gamma) * math.exp(-((1.+_gamma)*pow(_y,2.) + _gamma)) * special.i0(2. * _y * np.sqrt(_gamma * (1. + _gamma))) 

Спасибо.


person LO_py    schedule 07.04.2017    source источник


Ответы (1)


Если у вас есть способ вычислить логарифм функции Бесселя, вы можете избежать умножения очень больших и очень малых чисел путем преобразования в суммирование с последующим возведением в степень, которое должно решить числовые задачи (используйте тот факт, что exp(a) * exp(b) == exp(a + b)).

def rice_pdf(_y, _gamma):
    a = np.log(2. * _y * (1. + _gamma))
    b = -((1.+_gamma)*pow(_y,2.) + _gamma)
    c = lni(2. * _y * np.sqrt(_gamma * (1. + _gamma))) 
    return np.exp(a + b + c)

Эта функция предполагает, что существует реализация lni, которая вычисляет log(i0(z)). Однако я не знаю ни одной существующей реализации такой функции. Вы можете обойти это, используя mpmath для промежуточных результатов:

def lni(z):
    i0 = mpmath.besseli(0, z)  # may become a big number
    logi0 = mpmath.log(i0)  # logarithm brings big number into sensible range
    return float(logi0)  # convert back to normal floating point
person kazemakase    schedule 07.04.2017
comment
Ух ты. именно так и не пришло в голову использовать показательное решение. Большое спасибо. это было большим подспорьем. - person LO_py; 10.04.2017