Я пытаюсь закодировать формулу в python, чтобы определить испытания Бернулли с вероятностью успеха p.Формула выглядит следующим образом: https://imgur.com/gallery/IyqcYSr
Приведенный ниже код прекрасно работает для небольших чисел, например, если бы входное значение было outerSum(2,20,7,.25,.75)
, оно оценивалось бы примерно в 2,44 x 10 ^ -6 (что правильно, я проверил с помощью клена).
Однако моя проблема в том, что когда я запускаю его на больших числах (для которых я использую формулу), код не работает для него и выдает ошибку: ValueError: -inf + inf in fsum
.
Myидеальный ввод будет outerSum(2,31290,1755,.25,.75)
, однако я получаю сообщение об ошибке сверху.Как оптимизировать мой код для суммирования чисел до бесконечности или очень больших чисел в определенной формуле ниже?Идеальный входной сценарий будет outerSum(2,31290,1755,.25,.75)
import math
from sympy import binomial
import numpy
def innerSum(k,n,x,y):
#z = ((n - k * x - y) / k)
f = []
g = 0
for j in range(0, int(math.floor(n - k * x - y / k))):
b = math.pow(-1, j)
c = binomial(y + 1, j)
d = binomial(n - k * x - j * k, y)
e = b * c * d
f.append(e)
g = math.fsum(f)
return g
def outerSum(k,n,x,p,q):
a = math.floor((n - k * x) / k) # math.floor(((n-k*x)/k))
a = int(a)
b = (n - k * x)
b = int(b)
h = []
for y in range(a, b + 1):
c = math.pow(q, y)
d = math.pow(p, n - y)
e = binomial(y + x, x)
f = innerSum(k, n, x, y)
g = c*d*e*f
h.append(g)
i = math.fsum(h)
#print(i)
print(i)
outerSum(2,20,7,.25,.75)