# Converted from parestellipse.m - chi-squared vs F confidence ellipsesimportnumpyasnpfrommiscimportoctave_save,ellipsep=2ndata=10chisq=5.99# chi^2 95% level, 2 paramsFstat=4.46# F 95% level, 2 params, 8 dflnk0=1.0;E=100.0Tmin=300.0;Tmax=500.0Tmeas=np.linspace(Tmin,Tmax,ndata)X=np.column_stack([np.ones(ndata),-1.0/Tmeas])lnk=X@np.array([lnk0,E])measvar=1e-3# Match seed used in parestonedata.py / onedata.py / untransform.py so the# same noise sample drives both the data plot and this ellipse plot# (the variance must be estimated from the same data shown in the figure).np.random.seed(382)lnkmeas=lnk+np.sqrt(measvar)*np.random.randn(ndata)Tcenter=-1.0/Tmeas+1.0/np.mean(Tmeas)Xcenter=np.column_stack([np.ones(ndata),Tcenter])thetacenter=np.linalg.solve(Xcenter.T@Xcenter,Xcenter.T@lnkmeas)thetacentertr=thetacenter.reshape(1,-1)residual=lnkmeas-Xcenter@thetacentersamplevar=residual@residual/(ndata-p)npts=181amat=Xcenter.T@Xcenterlnkest=thetacenter[0];Eest=thetacenter[1]# ellipse 1: chi-squaredlevel1=chisq*measvarx1,y1,major1,minor1,bbox1=ellipse(amat,level1,npts)x1+=lnkest;y1+=Eestbbox1[:,0]+=lnkest;bbox1[:,1]+=Eestoutline1=np.column_stack([x1,y1])# ellipse 2: F-statlevel2=Fstat*p*samplevarx2,y2,major2,minor2,bbox2=ellipse(amat,level2,npts)x2+=lnkest;y2+=Eestbbox2[:,0]+=lnkest;bbox2[:,1]+=Eestoutline2=np.column_stack([x2,y2])octave_save('parestellipse.dat',('thetacentertr',thetacentertr),('bbox1',bbox1),('outline1',outline1),('bbox2',bbox2),('outline2',outline2))