Posiłkując się powyższym przykładem napisz funkcję MyGen(N) dla rozkładu, którego funkcja gęstości prawdopodobieństwa jest dana wzorem: f(x)=1π(1+x2). Następnie narysuj dla niego dystrybuantę i dystrybuantę empiryczną na przedziale [-10, 10].
Wyznaczmy najpierw dystrybuantę dla rozkładu f(x):
F(x)=∫x−∞1π(1+u2)du=1π∫x−∞11+u2du=|11+u2=arctg(u)|=[1πarctg(u)]x−∞= =1πarctg(x)−1πarctg(−∞)=1πarctg(x)+1πarctg(∞)=
|lim
Dystrybuanta:
F(x)=\frac{arctg(x)}{\pi}+\frac{1}{2}
Wyznaczmy funkcję odwrotną do dystrybuanty:
y=\frac{1}{\pi}arctg(x)+\frac{1}{2} \Rightarrow \pi \left( y - \frac{1}{2} \right) = arctg(x) \Rightarrow x=tg \left[ \pi \left( y - \frac{1}{2} \right) \right]
Funkcja odwrotna do dystrybuanty:
F^{-1}(x)= tg \left[ \pi \left( y - \frac{1}{2} \right) \right]
import scipy.stats as st
import numpy as np
import pylab as py
def MyGen(size=1):
x=np.random.random(size) # liczby z generatora jednostajnego na przedziale [0,1)
y=np.tan(np.pi*(x-1/2)) # korzystamy z metody odwracania dystrybuanty
return y
x=MyGen(int(1e6))
bins=np.linspace(-10, 10, 101)
py.subplot(211)
py.hist(x, bins, density=True, histtype='step')
py.plot(bins,1./(np.pi*(1+bins**2)), 'r')
py.subplot(212)
py.hist(x, bins, density=True, histtype='step', cumulative=True)
py.plot(bins, np.arctan(bins)/np.pi+0.5, 'r')
py.show()
Rozwiązanie:
