snažíme se nalézt parametry fitu
$$\log(v) = b + a m$$
kdy $m$ je magnituda dané galaxie (úměrná záporně vzatému logaritmu zářivého výkonu).
#vtup
import numpy as np
dd='''Virgo 890 7 12:5
Pegasus 3810 5 15:5
Pisces 4630 4 15:4
Cancer 4820 2 16:0
Perseus 5230 4 16:4
Coma 7500 3 17:0
Ursa Major 11;800 1 18:0
Leo 19;600 1 19:0
(No name) 2350 16 13:8
(No name) 630 21 11:6'''.replace(':','.').replace(';','').split('\n')
data=np.array([np.array(d.split()[-3:]).astype(float) for d in dd])
v,N,m=data.T#.astype(float)
lv=np.log10(v)
#lv.var(),((lv-lv.mean())**2).mean()
sigma_n=1.6
w=1/(0.1*lv/N)**2/sigma_n**2 #vahy
znorm=w.sum()
zmean=lambda z:sum(z*w)/znorm
zmean(lv),lv.mean()
sum(lv*w),sum(m*w),znorm
covar=(lv*m).mean()-lv.mean()*m.mean()
b=covar/m.var()
a=(lv-b*m).mean()
b,a
covar2=zmean(lv*m)-zmean(lv)*zmean(m)
mvar=zmean(m**2)-zmean(m)**2
b2=covar2/mvar
a2=zmean(lv-b2*m)
b2,a2
from matplotlib import pyplot as pl
%matplotlib inline
pl.errorbar(m,lv,np.sqrt(1/w),fmt='s')
x=np.r_[11:20:1]
pl.plot(x,a+b*x)
pl.plot(x,a2+b2*x)
pl.grid()
dder=[[1,sum(w*m)/znorm],[sum(w*m)/znorm,sum(w*m**2)/znorm]]
np.linalg.det(dder)
cmat=np.linalg.inv(dder)
np.sqrt(cmat.diagonal())
sigma2=zmean(lv-a2+b2*m)
np.sqrt(sigma2/(len(lv)-2))
cmat,dder
sum(w)/znorm
wmat=np.eye(len(lv))*w/znorm#len(lv)
amat=np.array([np.ones(len(lv)),m])
cmat@amat@wmat@lv
cmat=cov
errs=np.sqrt(cmat.diagonal())
cmat[1,0]/errs[0]/errs[1]
b2,a2
import numpy as np
amat=np.array([m,np.ones(len(m))]).T
wmat=np.eye(len(m))/(0.1*lv/N)**2/sigma_n**2
hess=amat.T@wmat@amat
hess
np.linalg.det(hess)
cov=np.linalg.inv(hess)
np.sqrt(cov.diagonal())
pars=cov@amat.T@wmat@lv
pars #indenticke jako vyse
model=amat@pars
res=lv-model
S0=res@wmat@res
S0
len(m)
sigma_n2=np.sqrt(S0/(len(m)-2))
sigma_n2
errs=np.sqrt(cov.diagonal())
cov/errs[:,np.newaxis]/errs[np.newaxis,:]
přidáme kvadratický člen (před ostatní)
amat2=np.array([m**2,m,np.ones(len(m))]).T
hess2=amat2.T@wmat@amat2
cov2=np.linalg.inv(hess2)
errs2=np.sqrt(cov2.diagonal())
errs2,errs
Nejistoty s dalším parametrem výrazně narostou!
Důvodem jsou značné korelace mezi parametry.
cov2/errs2[:,np.newaxis]/errs2[np.newaxis,:]
pars2=cov2 @ amat2.T @ wmat @ lv
pars2
porovnání (absolutní) hodnoty parametru a směrodatné odchylky - podíl má t-rozdělení s počtem stup. volnosti $n-k$ ($k$ je počet parametrů)
from scipy import stats as st
tval=abs(pars2)/errs2
print(tval)
print("pravdepodobnost t>tval [v %]")
st.t(8).sf(tval)*100
# mez (kvantil) pro 5% riziko chyby 1. druhu
st.t(8).ppf(0.95)
pl.errorbar(m,lv,np.sqrt(1/w),fmt='s')
x=np.r_[11:20:1]
#a,b,c=pars2
pl.plot(x,np.polyval(pars2,x))
#pl.plot(x,a*x)
a,b=pars
pl.plot(x,a*x+b)
res=lv-amat2@pars2
S2=res@wmat@res
S2/(len(lv)-4)
cof=np.r_[0.1:2:0.2]
chi2=[]
for c in cof:
amat3=np.array([np.exp(-m*c),np.ones(len(m))]).T
hess3=amat3.T@wmat@amat3
cov3=np.linalg.inv(hess3)
pars3=cov3@amat3.T@wmat@lv
print(pars3)
res=lv-amat3@pars3
S3=res@wmat@res
chi2.append(S3/(len(lv)-2))
np.array(chi2)*8
res=lv-amat3@pars3
S3=res@wmat@res
S3/(len(lv)-2)
from scipy import stats as st
st.chi2(len(lv)-2).ppf(0.95)
S3