# [makes] nthmonte.dat# [rule] copymat# Monte Carlo confidence-coverage check; mirrors nthmonte.m structure.fromparestoimportParestofrommiscimportsave_asciiimportnumpyasnpfromscipy.statsimportfasf_dist# Modelpe=Paresto()pe.print_level=0pe.transcription='shooting'pe.x=['ca']pe.p=['k','n']pe.d=['m_ca']pe.ode=lambdat,y,p:[-p.k*y.ca**p.n]pe.lsq=lambdat,y,p:[y.ca-y.m_ca]tfinal=5.0nts=100tout=np.linspace(0,tfinal,nts)pe.tout=toutpe.initialize()# True parameterskac,nac,ca0ac=0.5,2.5,2.0thetaac=np.array([kac,nac,ca0ac])# order matches Paresto's est.thetavec: [k, n, ca]# Noise-free trajectoryy_ac,_=pe.simulate({'k':kac,'n':nac,'ca':ca0ac})y_ac=np.array(y_ac).flatten()measvar=1e-2measstddev=np.sqrt(measvar)np.random.seed(0)# Initial guess and boundssmall=1e-3large=5.0pe.ic.k=kac;pe.ic.n=nac;pe.ic.ca=ca0acpe.lb_ub()pe.lb.k=small;pe.ub.k=largepe.lb.n=small;pe.ub.n=largepe.lb.ca=small;pe.ub.ca=largenp_=3nmonte=10# change to 500 for figure in textalph=np.full(nmonte,np.nan)foriinrange(nmonte):noise=measstddev*np.random.randn(nts)y_noisy=y_ac+noiseest,yy,pp=pe.optimize(y_noisy.reshape(1,nts,1))conf=pe.confidence(est,0.95)samplevar=float(est.f)/(nts-np_)d=np.array(est.thetavec).flatten()-thetaaccont=float(d@conf.H@d/(2*np_*samplevar))alph[i]=float(f_dist.cdf(cont,np_,nts-np_))if(i+1)%50==0:print(f'# Monte Carlo iter {i+1}/{nmonte}')# Coverage curve: actual fraction within each alpha-level ellipseamin,amax,nas=0.0,0.99995,100alphavec=np.linspace(amin,amax,nas)expected=alphavec*nmonteactual=np.array([np.sum(alph<=a)forainalphavec],dtype=float)table=np.column_stack([alphavec,expected,actual])save_ascii('nthmonte.dat',table)