Jestem nowy w SymPy i próbuję użyć go do zsumowania dwóch rozkładów Poissona
Oto, co mam do tej pory (przy użyciu notebooka jupyter)
from sympy import *
from sympy.stats import *
init_printing(use_latex='mathjax')
lamda_1, lamda_2 = symbols('lamda_1, lamda_2')
n_1 = Symbol('n_1')
n_2 = Symbol('n_2')
n = Symbol('n')
#setting up distributions
N_1 = density(Poisson('N_1', lamda_1))(n_1)
N_2 = density(Poisson('N_2', lamda_2))(n_2)
display(N_1)
display(N_2)
print('setting N_2 in terms of N and N_1')
N_2 = N_2.subs(n_2,n-n_1)
display(N_2)
print("N_1 * N_2")
N = N_1 * N_2
#display(N)
Sum(N,(n_1,0,n))
#summation(N,(n_1,0,n))
Wszystko działa dobrze, dopóki nie spróbuję przeprowadzić podsumowania. Żadne błędy po prostu nic nie robią, a jupyter mówi, że działa. Pozwoliłem mu działać przez 10 minut i nic...
1 odpowiedź
Deklarując symbole, uwzględnij ich właściwości: bycie dodatnim, całkowitym, nieujemnym itp. Pomaga to SymPy zdecydować, czy niektóre przekształcenia są uzasadnione.
lamda_1, lamda_2 = symbols('lamda_1, lamda_2', positive=True)
n_1, n_2, n = symbols('n_1 n_2 n', nonnegative=True, integer=True)
Niestety, sumowanie nadal się nie udaje, ponieważ SymPy nie może wymyślić kluczowej sztuczki: mnożenia i dzielenia przez factorial(n)
. Wydaje się, że trzeba mu to powiedzieć.
s = summation(N*factorial(n), (n_1, 0, n))/factorial(n)
print(s.simplify())
To drukuje
Piecewise(((lamda_1 + lamda_2)**n*exp(-lamda_1 - lamda_2)/factorial(n), ((-n >= 0) & (lamda_1/lamda_2 <= 1)) | ((-n < 0) & (lamda_1/lamda_2 <= 1))), (lamda_2**n*exp(-lamda_1 - lamda_2)*Sum(lamda_1**n_1*lamda_2**(-n_1)/(factorial(n_1)*factorial(n - n_1)), (n_1, 0, n)), True))
Co jest odcinkową formułą pełną zbędnych warunków… ale jeśli zignorujemy te warunki (są to tylko artefakty tego, jak SymPy wykonało sumowanie), poprawny wynik
((lamda_1 + lamda_2)**n*exp(-lamda_1 - lamda_2)/factorial(n)
Jest tu.
Poza tym: unikaj robienia import *
zarówno z sympy, jak i sympy.stats, istnieją kolizje notacyjne, takie jak E
wynoszące 2,718... w porównaniu z oczekiwaną wartością. from sympy.stats import density, Poisson
byłby lepszy. Ponadto N
jest wbudowaną funkcją SymPy i najlepiej jest jej unikać jako nazwy zmiennej.
Podobne pytania
Nowe pytania
sympy
SymPy to biblioteka Pythona typu open source do matematyki symbolicznej.