2017-04-07 13 views
0

다음 식을 사용하여 Ricean Fading PDF를 계산하려고합니다. RIcean Fading PDF. 'Y'는 정규화 봉투 '감마'이며 여기서 K 값이 후, 큰 부동 소수점 (e.q.의 1.01e-5088)에Ricean 페이딩의 큰 숫자와 정밀도 처리 PDF python

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

EXP 결과 크면

SNR

이다. 파이썬에 의지 방송 '0.0'값

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

베셀 함수의 값이 큰 int 값 (+ 5092 e.q.의 7.78e)를 나타내고있다. 파이썬에서는 '** inf **'값을 표시합니다.

파이썬에서 큰 정수 및 부동 소수점 값을 저장하고 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)))

감사합니다.

답변

0

베셀 함수의 대수를 계산할 방법이있는 경우, 이후의 exonentiation과 합계로 변환하여 매우 큰 숫자와 아주 작은 숫자의 곱셈을 피할 수 있습니다. 그러면 수치 문제를 해결할 수 있습니다 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) 

이 함수를 계산 log(i0(z))lni의 구현이 존재 가정한다. 그러나, 나는 그러한 기능의 기존 구현이 없음을 알고 있습니다. 중간 결과를 얻으려면 을 사용하여이 문제를 해결할 수 있습니다.

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 
+0

와우. 정확히 말하자면 지수 솔루션을 사용하는 것은 마음에 들지 않았습니다. 정말 고맙습니다. 큰 도움이되었습니다. –