Kombinace náhodných proměnných II.

Simulace podílu dvou normálně rozdělených veličin
numerický výpočet konvoluce (Gaussova kvadratura)

  • interval $(-\infty,\infty)$ nahrazen $(-100,100)$
In [2]:
%pylab inline 
from scipy import integrate
def multiple(wid=3,infty=100):
    sgau=lambda x:exp(-x**2/wid**2)
    n1=integrate.quad(sgau,-infty,infty)
    ssqr=lambda x,z: sgau(z*x)*sgau(x)*abs(x)
    smul=lambda z:integrate.quad(ssqr,-infty,infty+10,(z,))[0]/n1[0]**2
    return smul
Populating the interactive namespace from numpy and matplotlib
In [3]:
x=r_[0.1:5:0.1]
fun=multiple()
prof=[fun(r) for r in x]
plot(x,prof)
Out[3]:
[<matplotlib.lines.Line2D at 0x1a5595b3080>]

analytický výsledek

v případě centrovaných ($E[x]=0$) norm. rozdělení je podílem Cauchyho rozdělení

In [5]:
from scipy import special
#x=r_[0.1:5:.1]
plot(x,prof-1/(1+abs(x)**2)/pi)
ylabel("rozdil numericky-analyticky")
#special.k0?
Out[5]:
Text(0,0.5,'rozdil numericky-analyticky')
In [6]:
x=r_[-5:5:0.05]
[plot(x,g/(g**2+(x-1)**2)/pi) for g in [0.7,1,2]]
grid()
In [7]:
v1=normal(size=1000)
v12=normal(size=1000)
p=r_[-10:10:0.4]
w1=hist(v1,p,alpha=0.3)
w2=hist(v1**2,p,alpha=0.3)
w3=hist(v1*v12,p,alpha=0.3)

porovnání podílu necentrálních Gaussovek

posun vpravo o 10,15,20

In [8]:
p=r_[0.5:1.5:0.02]
w3a=hist((v1+10)/(v12+10),p,alpha=0.4)
w3b=hist((v1+15)/(v12+15),p,alpha=0.4)
w3c=hist((v1+20)/(v12+20),p,alpha=0.4)

aproximace z Gaussovy křivky

In [9]:
mx,my=8,8
sx,sy=1,1
vG=lambda z:(my-mx*z)/sqrt(sx**2*z**2+sy**2)
bG=lambda z:(mx*sy/sx+my*sx/sy*z)/sqrt(sx**2*z**2+sy**2)
pZ=lambda z,b:sx*sy/(sx**2*z**2+sy**2)*(1+b*exp(b**2/2)*(special.erf(b/sqrt(2))-0.5)*sqrt(pi/2))*exp(-(mx**2/sx**2+my**2/sy**2)/2.)/pi**2/2.
x=r_[0.1:2:.02]
plot(x,exp(-vG(x)**2/2)/sqrt(2*pi))
mx,my=15,8
plot(x,exp(-vG(x)**2/2)/sqrt(2*pi))
plot(x,pZ(x,bG(x)))
Out[9]:
[<matplotlib.lines.Line2D at 0x1a559f255f8>]
In [13]:
def moms(xd):
    xm=xd.mean()
    x2=((xd-xm)**2).mean()
    x3=((xd-xm)**3).mean()/pow(x2,1.5)
    x4=((xd-xm)**4).mean()/x2**2-3
    return xm,x2,x3,x4
comps=[moms((v1+i)/(v12+i)) for i in range(5,15)]
print("2.moment",array(comps)[:,0])
print("3.moment",array(comps)[:,1])
print("4.moment",array(comps)[:,1])
2.moment [1.05144541 1.03494593 1.02570647 1.01989978 1.01597442 1.01317945
 1.01110952 1.00952824 1.00828948 1.00729857]
3.moment [0.10613824 0.06570969 0.04562914 0.03378789 0.02612194 0.02084162
 0.01703664 0.01419802 0.01202096 0.01031302]
4.moment [0.10613824 0.06570969 0.04562914 0.03378789 0.02612194 0.02084162
 0.01703664 0.01419802 0.01202096 0.01031302]